From 8dfcf92dd9fff7028caf77314bccbfb5f03d7f2e Mon Sep 17 00:00:00 2001 From: Ajith KV Date: Mon, 3 Apr 2023 12:29:54 +0530 Subject: [PATCH 01/23] modify cypress test for onboarding phone number feature (#5848) --- .../cypress/e2e/selfHost/selfHostSignUp.cy.js | 34 +++++++++++++++++++ .../cypress/support/utils/onboarding.js | 12 +++++++ 2 files changed, 46 insertions(+) diff --git a/cypress-tests/cypress/e2e/selfHost/selfHostSignUp.cy.js b/cypress-tests/cypress/e2e/selfHost/selfHostSignUp.cy.js index cd4eb9885f..e54eef448f 100644 --- a/cypress-tests/cypress/e2e/selfHost/selfHostSignUp.cy.js +++ b/cypress-tests/cypress/e2e/selfHost/selfHostSignUp.cy.js @@ -112,6 +112,40 @@ describe("Self host onboarding", () => { signup.verifyandModifySizeOftheCompany(); + cy.get(commonSelectors.pageLogo).should("be.visible"); + cy.get(commonSelectors.setUpadminCheckPoint).verifyVisibleElement( + "have.text", + commonText.setUpadminCheckPoint + ); + cy.get(commonSelectors.setUpworkspaceCheckPoint).verifyVisibleElement( + "have.text", + commonText.setUpworkspaceCheckPoint + ); + cy.get(commonSelectors.companyProfileCheckPoint).verifyVisibleElement( + "have.text", + commonText.companyProfileCheckPoint + ); + cy.get(commonSelectors.onboardingPageSubHeader).verifyVisibleElement( + "have.text", + commonText.onboardingPageSubHeader + ); + cy.get(commonSelectors.continueButton).verifyVisibleElement( + "have.text", + commonText.continueButton + ); + + signup.commonElementsWorkspaceSetup(); + cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( + "have.text", + "Enter your phone number" + ); + + cy.get(".form-control").should("be.visible"); + cy.get(".tj-onboarding-phone-input-wrapper") + .find("input") + .type("919876543210"); + cy.get(commonSelectors.continueButton).click(); + cy.get(commonSelectors.workspaceName).verifyVisibleElement( "have.text", "My workspace" diff --git a/cypress-tests/cypress/support/utils/onboarding.js b/cypress-tests/cypress/support/utils/onboarding.js index 939754538c..cc53eebc9f 100644 --- a/cypress-tests/cypress/support/utils/onboarding.js +++ b/cypress-tests/cypress/support/utils/onboarding.js @@ -105,6 +105,18 @@ export const verifyOnboardingQuestions = (fullName, workspaceName) => { commonText.sizeOftheCompanyHeader ); verifyandModifySizeOftheCompany(); + + cy.get(commonSelectors.backArrow).should("be.visible"); + cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( + "have.text", + "Enter your phone number" + ); + + cy.get(".form-control").should("be.visible"); + cy.get(".tj-onboarding-phone-input-wrapper") + .find("input") + .type("919876543210"); + cy.get(commonSelectors.continueButton).click(); }; export const verifyInvalidInvitationLink = () => { From a592e3aeb69720915d8f848230c1ad53522d2110 Mon Sep 17 00:00:00 2001 From: Mekhla Asopa <59684099+Mekhla-Asopa@users.noreply.github.com> Date: Tue, 4 Apr 2023 08:11:02 +0530 Subject: [PATCH 02/23] Added automation for edit row feature in Database (#5890) * added method for edit row * update method for edit row * update method name --- .../cypress/constants/selectors/database.js | 10 + .../cypress/constants/texts/database.js | 8 + .../cypress/e2e/database/database.cy.js | 110 ++++- .../cypress/support/utils/database.js | 400 ++++++++++++++---- 4 files changed, 415 insertions(+), 113 deletions(-) diff --git a/cypress-tests/cypress/constants/selectors/database.js b/cypress-tests/cypress/constants/selectors/database.js index 2eac7236b4..0dcf3df726 100644 --- a/cypress-tests/cypress/constants/selectors/database.js +++ b/cypress-tests/cypress/constants/selectors/database.js @@ -90,4 +90,14 @@ export const sortSelectors = { selectOrderField: '[data-cy="select-order-field"]', deleteIcon: '[data-cy="delete-icon"]', addConditionLink: '[data-cy="add-another-condition-link"]', +}; + +export const editRowSelectors = { + editRowbutton: '[data-cy="edit-row-button-text"]', + editRowHeader: '[data-cy="edit-row-header"]', + idColumnNameLabel: '[data-cy="id-column-name-label"]', + selectRowDropdown: '[data-cy="select-row-dropdown"]', + getRowData: (rowNumber, columnName) => { + return `[data-cy="id-${String(rowNumber).toLowerCase().replace(/\s+/g, "-")}-column-${String(columnName).toLowerCase().replace(/\s+/g, "-")}-table-cell"]` + } }; \ No newline at end of file diff --git a/cypress-tests/cypress/constants/texts/database.js b/cypress-tests/cypress/constants/texts/database.js index 044122b6f5..e883901a2b 100644 --- a/cypress-tests/cypress/constants/texts/database.js +++ b/cypress-tests/cypress/constants/texts/database.js @@ -16,6 +16,7 @@ export const databaseText = { idColumnHeader: "id", noRecordsText: "You don't have any records yet.", deleteRecordButton: "Delete records", + idColumnName: "id", tableCreatedSuccessfullyToast: (tableName) => { return `${tableName} created successfully`; @@ -31,6 +32,9 @@ export const databaseText = { }, deleteRowToast: (tableName, rowNumber) => { return `Deleted ${rowNumber} rows from table "${tableName}"` + }, + invalidErrorText: (value) => { + return `invalid input syntax for type integer: "${value}"` } }; @@ -73,3 +77,7 @@ export const sortText = { descending: "Descending" } } +export const editRowText = { + editRowHeader: "Edit a row", + selectRowToEditText: "Select a row to edit" +} diff --git a/cypress-tests/cypress/e2e/database/database.cy.js b/cypress-tests/cypress/e2e/database/database.cy.js index 20bb2456c2..1ef2fd2382 100644 --- a/cypress-tests/cypress/e2e/database/database.cy.js +++ b/cypress-tests/cypress/e2e/database/database.cy.js @@ -1,8 +1,10 @@ import { filterSelectors, sortSelectors } from "Selectors/database"; -import { filterText, sortText } from "Texts/database"; +import { databaseText, filterText, sortText } from "Texts/database"; import { navigateToDatabase } from "Support/utils/common"; import { - verifyAllElementsOfPage, createTableAndVerifyToastMessage, editTableNameAndVerifyToastMessage, + verifyAllElementsOfPage, + createTableAndVerifyToastMessage, + editTableNameAndVerifyToastMessage, deleteTableAndVerifyToastMessage, createNewColumnAndVerify, navigateToTable, @@ -10,7 +12,9 @@ import { filterOperation, sortOperation, deleteCondition, - deleteRowAndVerify + deleteRowAndVerify, + editRowWithInvalidData, + editRowAndVerify, } from "Support/utils/database"; import { fake } from "Fixtures/fake"; import { randomNumber } from "Support/utils/commonWidget"; @@ -26,22 +30,28 @@ describe("Database Functionality", () => { const columnDetails = () => { let column = { name: fake.firstName, - defaultValueDoublePrecision: Math.floor(Math.random() * (1000 - 100) + 100) / 100, + defaultValueDoublePrecision: + Math.floor(Math.random() * (1000 - 100) + 100) / 100, defaultValueInt: randomNumber(10, 99), - defaultValueVarchar: randomString(data.maximumLength) + defaultValueVarchar: randomString(data.maximumLength), }; return column; }; let column1 = columnDetails(); let column2 = columnDetails(); - let column3 = columnDetails(); - let column4 = columnDetails(); - let rowData = { - varcharData: randomString(data.maximumLength), - doublePrecisionData: Math.floor(Math.random() * (1000 - 100) + 100) / 100, - intData: randomNumber(10, 99), + const rowData = () => { + let row = { + varcharData: randomString(data.maximumLength), + doublePrecisionData: Math.floor(Math.random() * (1000 - 100) + 100) / 100, + intData: randomNumber(10, 99), + }; + return row; }; + let row1 = rowData(); + let row2 = rowData(); + let row3 = rowData(); + let row4 = rowData(); beforeEach(() => { cy.appUILogin(); @@ -50,24 +60,78 @@ describe("Database Functionality", () => { navigateToDatabase(); verifyAllElementsOfPage(); createTableAndVerifyToastMessage(data.tableName, false); - createTableAndVerifyToastMessage(data.newTableName, true, [column1.name, column2.name], [data.dataType[0], data.dataType[1]], true, [column1.defaultValueVarchar, column1.defaultValueInt]); + createTableAndVerifyToastMessage( + data.newTableName, + true, + [column1.name, column2.name], + [data.dataType[0], data.dataType[1]], + true, + [column1.defaultValueVarchar, column1.defaultValueInt] + ); }); it("Verify all operations of table", () => { navigateToDatabase(); navigateToTable(data.tableName); editTableNameAndVerifyToastMessage(data.newTableName, data.editTableName); deleteTableAndVerifyToastMessage(data.editTableName); - createNewColumnAndVerify(data.tableName, column1.name, data.dataType[0], true, column1.defaultValueVarchar); - addNewRowAndVerify(data.tableName, false) - - addNewRowAndVerify(data.tableName, false, [column1.name], true, [rowData.varcharData]) - createNewColumnAndVerify(data.tableName, column2.name, data.dataType[1], false); - addNewRowAndVerify(data.tableName, false, [column1.name, column2.name], [rowData.varcharData, rowData.intData]); - addNewRowAndVerify(data.tableName, true, [column1.name, column2.name], [rowData.varcharData, rowData.intData]); - filterOperation(data.tableName, ["id"], [filterText.operation.greaterThan], ["2"]); - deleteCondition(filterSelectors.filterButton, ["id"], filterSelectors.deleteIcon) - sortOperation(data.tableName, ["id"], [sortText.order.descending]) - deleteCondition(sortSelectors.sortButton, ["id"], sortSelectors.deleteIcon) + createNewColumnAndVerify( + data.tableName, + column1.name, + data.dataType[0], + true, + column1.defaultValueVarchar + ); + addNewRowAndVerify(data.tableName, false); + addNewRowAndVerify(data.tableName, false, [column1.name], true, [ + row1.varcharData, + ]); + createNewColumnAndVerify( + data.tableName, + column2.name, + data.dataType[1], + false + ); + addNewRowAndVerify( + data.tableName, + false, + [column1.name, column2.name], + [row2.varcharData, row2.intData] + ); + addNewRowAndVerify( + data.tableName, + true, + [column1.name, column2.name], + [row3.varcharData, row3.intData] + ); + filterOperation( + data.tableName, + [databaseText.idColumnName], + [filterText.operation.greaterThan], + ["2"] + ); + deleteCondition( + filterSelectors.filterButton, + [databaseText.idColumnName], + filterSelectors.deleteIcon + ); + sortOperation( + data.tableName, + [databaseText.idColumnName], + [sortText.order.descending] + ); + deleteCondition( + sortSelectors.sortButton, + [databaseText.idColumnName], + sortSelectors.deleteIcon + ); + cy.reload(); deleteRowAndVerify(data.tableName, ["1", "2"]); + editRowWithInvalidData(data.tableName, "3", column2.name, row4.varcharData); + editRowAndVerify( + data.tableName, + "3", + [databaseText.idColumnName, column1.name, column2.name], + [row4.varcharData, row4.intData] + ); }); }); diff --git a/cypress-tests/cypress/support/utils/database.js b/cypress-tests/cypress/support/utils/database.js index c031a60360..626c84218a 100644 --- a/cypress-tests/cypress/support/utils/database.js +++ b/cypress-tests/cypress/support/utils/database.js @@ -1,5 +1,17 @@ -import { databaseSelectors, createNewColumnSelectors, createNewRowSelectors, filterSelectors, sortSelectors } from "Selectors/database"; -import { databaseText, createNewColumnText, createNewRowText, filterText, sortText } from "Texts/database"; +import { + databaseSelectors, + createNewColumnSelectors, + createNewRowSelectors, + filterSelectors, + sortSelectors, + editRowSelectors, +} from "Selectors/database"; +import { + databaseText, + createNewColumnText, + createNewRowText, + editRowText, +} from "Texts/database"; import { commonSelectors } from "Selectors/common"; import { commonText } from "Texts/common"; @@ -18,17 +30,33 @@ export const verifyAllElementsOfPage = () => { cy.get(databaseSelectors.allTableSubheader).should("be.visible"); }; export const navigateToTable = (tableName) => { - cy.get(databaseSelectors.currentTable(tableName)).scrollIntoView().should("be.visible") - cy.get(databaseSelectors.currentTableName(tableName)).verifyVisibleElement("have.text", tableName).click(); + cy.get(databaseSelectors.currentTable(tableName)) + .scrollIntoView() + .should("be.visible"); + cy.get(databaseSelectors.currentTableName(tableName)) + .verifyVisibleElement("have.text", tableName) + .realClick(); }; -export const createTableAndVerifyToastMessage = (tableName, columnDetails = true, columnName = [], columnDataType = [], defaultValue, columnDefaultValue = []) => { +export const createTableAndVerifyToastMessage = ( + tableName, + columnDetails = true, + columnName = [], + columnDataType = [], + defaultValue, + columnDefaultValue = [] +) => { cy.get(databaseSelectors.addTableButton).click(); verifyAllElementsOfAddTableSection(); cy.clearAndType(databaseSelectors.tableNameInputField, tableName); if (columnDetails) { for (let i = 0; i < columnName.length; i++) { cy.get(databaseSelectors.addMoreColumnsButton).click(); - addNewColumnAndVerify(columnName[i], columnDataType[i], defaultValue, columnDefaultValue[i]) + addNewColumnAndVerify( + columnName[i], + columnDataType[i], + defaultValue, + columnDefaultValue[i] + ); } } cy.get(commonSelectors.buttonSelector(commonText.createButton)).click(); @@ -37,18 +65,29 @@ export const createTableAndVerifyToastMessage = (tableName, columnDetails = true databaseText.tableCreatedSuccessfullyToast(tableName) ); navigateToTable(tableName); - cy.get(databaseSelectors.idColumnHeader).verifyVisibleElement("have.text", databaseText.idColumnHeader); - cy.get(databaseSelectors.noRecordsText).verifyVisibleElement("have.text", databaseText.noRecordsText); + cy.get(databaseSelectors.idColumnHeader).verifyVisibleElement( + "have.text", + databaseText.idColumnHeader + ); + cy.get(databaseSelectors.noRecordsText).verifyVisibleElement( + "have.text", + databaseText.noRecordsText + ); }; export const editTableNameAndVerifyToastMessage = (tableName, newTableName) => { cy.get(databaseSelectors.currentTable(tableName)) - .find(databaseSelectors.tableKebabIcon).invoke('show') - .trigger('mouseover') - .trigger('mousemove') - .trigger('mousedown') - .trigger('mouseup').click(); + .find(databaseSelectors.tableKebabIcon) + .invoke("show") + .trigger("mouseover") + .trigger("mousemove") + .trigger("mousedown") + .trigger("mouseup") + .click(); cy.get(databaseSelectors.tableEditOption).click(); - cy.get(databaseSelectors.editTableHeader).verifyVisibleElement("have.text", databaseText.editTableHeader); + cy.get(databaseSelectors.editTableHeader).verifyVisibleElement( + "have.text", + databaseText.editTableHeader + ); cy.get(databaseSelectors.tableNameLabel).verifyVisibleElement( "have.text", databaseText.tableNameLabel @@ -66,15 +105,20 @@ export const editTableNameAndVerifyToastMessage = (tableName, newTableName) => { commonSelectors.toastMessage, databaseText.tableEditedSuccessfullyToast(newTableName) ); - cy.get(databaseSelectors.currentTableName(newTableName)).verifyVisibleElement("have.text", newTableName); + cy.get(databaseSelectors.currentTableName(newTableName)).verifyVisibleElement( + "have.text", + newTableName + ); }; export const deleteTableAndVerifyToastMessage = (tableName) => { cy.get(databaseSelectors.currentTable(tableName)) - .find(databaseSelectors.tableKebabIcon).invoke('show') - .trigger('mouseover') - .trigger('mousemove') - .trigger('mousedown') - .trigger('mouseup').click(); + .find(databaseSelectors.tableKebabIcon) + .invoke("show") + .trigger("mouseover") + .trigger("mousemove") + .trigger("mousedown") + .trigger("mouseup") + .click(); cy.get(databaseSelectors.tableDeleteOption).click(); // cy.on('window:confirm', (ConfirmAlertText) => { // expect(ConfirmAlertText).to.contains(`Are you sure you want to delete the table "${tableName}"?`); @@ -84,62 +128,113 @@ export const deleteTableAndVerifyToastMessage = (tableName) => { databaseText.tableDeletedSuccessfullyToast(tableName) ); }; -export const addNewColumnAndVerify = (columnName = [], columnDataType = [], defaultValue = true, columnDefaultValue = []) => { - cy.clearAndType(databaseSelectors.nameInputField("undefined"), columnName) - cy.get(databaseSelectors.nameInputField(columnName)).should("be.visible") +export const addNewColumnAndVerify = ( + columnName = [], + columnDataType = [], + defaultValue = true, + columnDefaultValue = [] +) => { + cy.clearAndType(databaseSelectors.nameInputField("undefined"), columnName); + cy.get(databaseSelectors.nameInputField(columnName)) + .should("be.visible") .verifyVisibleElement("have.value", columnName) .parents(".list-group-item") .within(() => { cy.get(databaseSelectors.typeInputField).click(); cy.contains(`[id*="react-select-"]`, columnDataType).click(); if (defaultValue) { - cy.clearAndType(databaseSelectors.defaultInputField, columnDefaultValue) + cy.clearAndType( + databaseSelectors.defaultInputField, + columnDefaultValue + ); } - cy.get(databaseSelectors.typeInputField).should("be.visible") - .verifyVisibleElement("have.text", columnDataType) - cy.get(databaseSelectors.defaultInputField).should("be.visible") - .verifyVisibleElement("have.value", columnDefaultValue) - }) + cy.get(databaseSelectors.typeInputField) + .should("be.visible") + .verifyVisibleElement("have.text", columnDataType); + cy.get(databaseSelectors.defaultInputField) + .should("be.visible") + .verifyVisibleElement("have.value", columnDefaultValue); + }); }; -export const createNewColumnAndVerify = (tableName, columnName, columnDataType, defaultValue = true, columnDefaultValue) => { - navigateToTable(tableName) - cy.get(createNewColumnSelectors.addNewColumnButton).should('be.visible') +export const createNewColumnAndVerify = ( + tableName, + columnName, + columnDataType, + defaultValue = true, + columnDefaultValue +) => { + navigateToTable(tableName); + cy.get(createNewColumnSelectors.addNewColumnButton) + .should("be.visible") .click(); - cy.get(createNewColumnSelectors.createNewColumnHeader).verifyVisibleElement("have.text", createNewColumnText.createNewColumnHeader) - cy.get(createNewColumnSelectors.columnNameLabel).verifyVisibleElement("have.text", createNewColumnText.columnNameLabel); - cy.get(createNewColumnSelectors.dataTypeLabel).verifyVisibleElement("have.text", createNewColumnText.dataTypeLabel); - cy.get(createNewColumnSelectors.defaultValueLabel).verifyVisibleElement("have.text", createNewColumnText.defaultValueLabel); + cy.get(createNewColumnSelectors.createNewColumnHeader).verifyVisibleElement( + "have.text", + createNewColumnText.createNewColumnHeader + ); + cy.get(createNewColumnSelectors.columnNameLabel).verifyVisibleElement( + "have.text", + createNewColumnText.columnNameLabel + ); + cy.get(createNewColumnSelectors.dataTypeLabel).verifyVisibleElement( + "have.text", + createNewColumnText.dataTypeLabel + ); + cy.get(createNewColumnSelectors.defaultValueLabel).verifyVisibleElement( + "have.text", + createNewColumnText.defaultValueLabel + ); cy.clearAndType(createNewColumnSelectors.columnNameInputField, columnName); - cy.get(createNewColumnSelectors.dataTypeDropdown).click() + cy.get(createNewColumnSelectors.dataTypeDropdown).click(); cy.contains(`[id*="react-select-"]`, columnDataType).click(); if (defaultValue) { - cy.clearAndType(createNewColumnSelectors.defaultValueInputField, columnDefaultValue); - cy.get(createNewColumnSelectors.defaultValueInputField).should("be.visible") + cy.clearAndType( + createNewColumnSelectors.defaultValueInputField, + columnDefaultValue + ); + cy.get(createNewColumnSelectors.defaultValueInputField) + .should("be.visible") .verifyVisibleElement("have.value", columnDefaultValue); } - cy.get(createNewColumnSelectors.columnNameInputField).should("be.visible") + cy.get(createNewColumnSelectors.columnNameInputField) + .should("be.visible") .verifyVisibleElement("have.value", columnName); - cy.get(createNewColumnSelectors.dataTypeDropdown).should("be.visible") + cy.get(createNewColumnSelectors.dataTypeDropdown) + .should("be.visible") .verifyVisibleElement("contain", columnDataType); cy.get(commonSelectors.buttonSelector(commonText.cancelButton)) .should("be.visible") .and("have.text", commonText.cancelButton); cy.get(commonSelectors.buttonSelector(commonText.createButton)) .should("be.visible") - .and("have.text", commonText.createButton).click(); + .and("have.text", commonText.createButton) + .click(); cy.verifyToastMessage( commonSelectors.toastMessage, createNewColumnText.columnCreatedSuccessfullyToast ); - cy.get(databaseSelectors.columnHeader(columnName)).verifyVisibleElement("have.text", `${String(columnName).toLowerCase().replace(/\s+/g, "-")}`); + cy.get(databaseSelectors.columnHeader(columnName)).verifyVisibleElement( + "have.text", + `${String(columnName).toLowerCase().replace(/\s+/g, "-")}` + ); }; -export const addNewRowAndVerify = (tableName, noDefaultValue = true, columnName = [], columnDefaultValue = []) => { +export const addNewRowAndVerify = ( + tableName, + noDefaultValue = true, + columnName = [], + columnDefaultValue = [] +) => { navigateToTable(tableName); cy.get(createNewRowSelectors.addNewRowButton).click(); - cy.get(createNewRowSelectors.createNewRowHeader).verifyVisibleElement("have.text", createNewRowText.createNewRowHeader); - cy.get(createNewRowSelectors.idColumnNameLabel).verifyVisibleElement("contain", databaseText.idColumnHeader); + cy.get(createNewRowSelectors.createNewRowHeader).verifyVisibleElement( + "have.text", + createNewRowText.createNewRowHeader + ); + cy.get(createNewRowSelectors.idColumnNameLabel).verifyVisibleElement( + "contain", + databaseText.idColumnHeader + ); cy.get(createNewRowSelectors.idColumnInputField).should("be.visible"); cy.get(commonSelectors.buttonSelector(commonText.cancelButton)) .should("be.visible") @@ -147,24 +242,32 @@ export const addNewRowAndVerify = (tableName, noDefaultValue = true, columnName cy.get(commonSelectors.buttonSelector(commonText.createButton)) .should("be.visible") .and("have.text", commonText.createButton); - cy.get('body').find(".table>>>th").its('length').then(columnLength => { - if (columnLength != 2) { - for (let i = 0; i < columnName.length; i++) { - if (noDefaultValue) { - cy.clearAndType(createNewRowSelectors.columnNameInputField(columnName[i]), columnDefaultValue[i]) - } - else { - cy.get(createNewRowSelectors.columnNameInputField(columnName[i])) - .invoke('val') - .then(val => { - if (val === "") { - cy.clearAndType(createNewRowSelectors.columnNameInputField(columnName[i]), columnDefaultValue[i]) - } - }); + cy.get("body") + .find(".table>>>th") + .its("length") + .then((columnLength) => { + if (columnLength != 2) { + for (let i = 0; i < columnName.length; i++) { + if (noDefaultValue) { + cy.clearAndType( + createNewRowSelectors.columnNameInputField(columnName[i]), + columnDefaultValue[i] + ); + } else { + cy.get(createNewRowSelectors.columnNameInputField(columnName[i])) + .invoke("val") + .then((val) => { + if (val === "") { + cy.clearAndType( + createNewRowSelectors.columnNameInputField(columnName[i]), + columnDefaultValue[i] + ); + } + }); + } } } - } - }); + }); cy.get(commonSelectors.buttonSelector(commonText.createButton)).click(); cy.verifyToastMessage( commonSelectors.toastMessage, @@ -172,7 +275,6 @@ export const addNewRowAndVerify = (tableName, noDefaultValue = true, columnName ); cy.get('[data-cy*="-column-id-table-cell"]').should("be.visible"); }; - export const verifyAllElementsOfAddTableSection = () => { cy.get(databaseSelectors.tableNameLabel).verifyVisibleElement( "have.text", @@ -208,7 +310,8 @@ export const verifyAllElementsOfAddTableSection = () => { .and("have.text", commonText.createButton); cy.get(databaseSelectors.addMoreColumnsButton).click(); - cy.get(databaseSelectors.nameInputField("undefined")).should("be.visible") + cy.get(databaseSelectors.nameInputField("undefined")) + .should("be.visible") .parents(".list-group-item") .within(() => { cy.get(databaseSelectors.typeInputField).should("be.visible"); @@ -216,7 +319,6 @@ export const verifyAllElementsOfAddTableSection = () => { cy.get(databaseSelectors.deleteIcon).should("be.visible").click(); }); }; - export const filterOperation = ( tableName, columnName = [], @@ -252,14 +354,17 @@ export const filterOperation = ( cy.get(filterSelectors.selectOperationField).last().click(); cy.contains(`[id*="react-select-"]`, operation[i]).click(); cy.get(filterSelectors.valueInputField).last().clear().type(value[i]); - cy.get(filterSelectors.selectColumnField).last().should("have.text", String(columnName[i]).toLowerCase()) - cy.get(filterSelectors.valueInputField).last().should("have.text", value[i]); + cy.get(filterSelectors.selectColumnField) + .last() + .should("have.text", String(columnName[i]).toLowerCase()); + cy.get(filterSelectors.valueInputField) + .last() + .should("have.text", value[i]); cy.wait("@dbLoad"); } - cy.get('.table-responsive').click(); + cy.get(".table-responsive").click(); cy.get(databaseSelectors.idColumnHeader).should("be.visible"); }; - export const sortOperation = (tableName, columnName = [], order = []) => { navigateToTable(tableName); cy.get(sortSelectors.sortButton).should("be.visible").click(); @@ -275,39 +380,154 @@ export const sortOperation = (tableName, columnName = [], order = []) => { for (let i = 1; i < columnName.length; i++) { cy.get(sortSelectors.addConditionLink).click(); cy.get(sortSelectors.selectColumnField).last().click(); - cy.contains(`[id*="react-select-"]`, String(columnName[i]).toLowerCase()).click(); + cy.contains( + `[id*="react-select-"]`, + String(columnName[i]).toLowerCase() + ).click(); cy.get(sortSelectors.selectOrderField).last().click(); cy.contains(`[id*="react-select-"]`, order[0]).click(); } cy.get(sortSelectors.sortButton).click(); cy.get(databaseSelectors.idColumnHeader).should("be.visible"); }; - export const deleteCondition = (selector, columnName = [], deleteIcon) => { cy.get(selector).click(); - cy.get('.card-body').eq(1).should("be.visible"); - cy.log(columnName.length) + cy.get(".card-body").eq(1).should("be.visible"); for (let i = 0; i < columnName.length; i++) { cy.get(deleteIcon).eq(i).click(); } }; export const deleteRowAndVerify = (tableName, rowNumber = []) => { - cy.get('body').find(".table>>tr").its('length').then(totalRowLength => { - cy.log(totalRowLength) - let rowsWithoutHeaderLength = totalRowLength - 1; - cy.log(rowsWithoutHeaderLength) - for (let i = 0; i < rowNumber.length; i++) { - cy.get(databaseSelectors.checkboxCell(rowNumber[i])).click(); - } - cy.get(databaseSelectors.deleteRecordButton).should("be.visible").click(); + navigateToTable(tableName); + cy.get("body") + .find(".table>>tr") + .its("length") + .then(() => { + for (let i = 0; i < rowNumber.length; i++) { + cy.get(databaseSelectors.checkboxCell(rowNumber[i])).click(); + } + cy.get(databaseSelectors.deleteRecordButton).should("be.visible").click(); - // cy.on('window:confirm', (ConfirmText) => { - // expect(ConfirmText).to.equal('Are you sure you want to delete the selected rows?'); - // }) + // cy.on('window:confirm', (ConfirmText) => { + // expect(ConfirmText).to.equal('Are you sure you want to delete the selected rows?'); + // }) + cy.verifyToastMessage( + commonSelectors.toastMessage, + databaseText.deleteRowToast(tableName, rowNumber.length) + ); + }); +}; +export const verifyRowData = (rowNumber, columnName = [], rowData = []) => { + for (let i = 0; i < columnName.length - 1; i++) { + cy.get(editRowSelectors.getRowData(rowNumber, columnName[i + 1])) + .invoke("text") + .then((text) => { + expect(text).to.contain(rowData[i]); + }); + } +}; +export const editRowAndVerify = ( + tableName, + rowNumber, + columnName = [], + rowFieldData = [] +) => { + cy.reload(); + cy.intercept("GET", "api/tooljet_db/organizations/**").as("dbLoad"); + navigateToTable(tableName); + cy.wait("@dbLoad"); + cy.get(editRowSelectors.editRowbutton).should("be.visible").click(); + cy.get(editRowSelectors.editRowHeader).verifyVisibleElement( + "have.text", + editRowText.editRowHeader + ); + cy.get(editRowSelectors.idColumnNameLabel).verifyVisibleElement( + "contain", + databaseText.idColumnName + ); + cy.contains(createNewRowText.serialDataTypeLabel).should("be.visible"); + cy.contains(editRowText.selectRowToEditText).should("be.visible"); + cy.get(editRowSelectors.selectRowDropdown).should("be.visible").click(); + cy.get(editRowSelectors.selectRowDropdown).type(rowNumber); + cy.get(`[id*="react-select-"]`).should("be.visible"); + cy.contains(`[id*="react-select-"]`, rowNumber).click(); - cy.verifyToastMessage( - commonSelectors.toastMessage, - databaseText.deleteRowToast(tableName, rowNumber.length) - ); - }) -} \ No newline at end of file + for (let i = 0; i < columnName.length - 1; i++) { + cy.get( + createNewRowSelectors.columnNameLabel(columnName[i + 1]) + ).verifyVisibleElement("contain", columnName[i + 1].toLowerCase()); + cy.get( + createNewRowSelectors.columnNameInputField(columnName[i + 1]) + ).should("be.visible"); + cy.get(createNewRowSelectors.columnNameInputField(columnName[i + 1])) + .realClick() + .clear() + .realType(`${rowFieldData[i]}`); + cy.wait(500); + cy.get(createNewRowSelectors.columnNameInputField(columnName[i + 1])) + .invoke("val") + .then((text) => { + expect(text).to.contain(rowFieldData[i]); + }); + } + cy.get( + commonSelectors.buttonSelector(commonText.cancelButton) + ).verifyVisibleElement("have.text", commonText.cancelButton); + cy.get(commonSelectors.buttonSelector(commonText.saveChangesButton)) + .verifyVisibleElement("have.text", commonText.saveChangesButton) + .realClick(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + createNewRowText.rowCreatedSuccessfullyToast + ); + verifyRowData(rowNumber, columnName, rowFieldData); +}; + +export const editRowWithInvalidData = ( + tableName, + rowNumber, + columnName, + rowFieldData +) => { + cy.intercept("GET", "api/tooljet_db/organizations/**").as("dbLoad"); + navigateToTable(tableName); + cy.wait("@dbLoad"); + + cy.get(editRowSelectors.editRowbutton).should("be.visible").click(); + cy.get(editRowSelectors.editRowHeader).verifyVisibleElement( + "have.text", + editRowText.editRowHeader + ); + cy.contains(editRowText.selectRowToEditText).should("be.visible"); + cy.get(editRowSelectors.selectRowDropdown).should("be.visible").click(); + cy.get(editRowSelectors.selectRowDropdown).type(rowNumber); + cy.get(`[id*="react-select-"]`).should("be.visible"); + cy.contains(`[id*="react-select-"]`, rowNumber).click(); + + cy.get( + createNewRowSelectors.columnNameLabel(columnName) + ).verifyVisibleElement("contain", columnName.toLowerCase()); + cy.get(createNewRowSelectors.columnNameInputField(columnName)).should( + "be.visible" + ); + cy.get(createNewRowSelectors.columnNameInputField(columnName)) + .realClick() + .clear() + .realType(`${rowFieldData}`); + cy.wait(500); + cy.get(createNewRowSelectors.columnNameInputField(columnName)) + .invoke("val") + .then((text) => { + expect(text).to.contain(rowFieldData); + }); + cy.get( + commonSelectors.buttonSelector(commonText.cancelButton) + ).verifyVisibleElement("have.text", commonText.cancelButton); + cy.get(commonSelectors.buttonSelector(commonText.saveChangesButton)) + .verifyVisibleElement("have.text", commonText.saveChangesButton) + .click(); + cy.get(commonSelectors.buttonSelector(commonText.saveChangesButton)).should( + "be.disabled" + ); + cy.get(commonSelectors.buttonSelector(commonText.cancelButton)).click(); +}; From d53b30b2e7f975af81a0fb225f8abc76070e1aa8 Mon Sep 17 00:00:00 2001 From: Shubhendra Singh Chauhan Date: Tue, 4 Apr 2023 12:31:11 +0530 Subject: [PATCH 03/23] [docs] added how-to: import external libs using RunJs (#5908) --- docs/docs/how-to/import-external-lib-js.md | 96 ++++++++++++++++++ docs/sidebars.js | 1 + docs/static/img/how-to/import-js/flatten.png | Bin 0 -> 110119 bytes docs/static/img/how-to/import-js/imported.png | Bin 0 -> 121513 bytes docs/static/img/how-to/import-js/mathjs.png | Bin 0 -> 91399 bytes docs/static/img/how-to/import-js/newquery.png | Bin 0 -> 129102 bytes .../how-to/import-external-lib-js.md | 96 ++++++++++++++++++ .../how-to/import-external-lib-js.md | 96 ++++++++++++++++++ .../how-to/import-external-lib-js.md | 96 ++++++++++++++++++ .../version-2.0.0-sidebars.json | 1 + .../version-2.1.0-sidebars.json | 1 + .../version-2.2.0-sidebars.json | 1 + 12 files changed, 388 insertions(+) create mode 100644 docs/docs/how-to/import-external-lib-js.md create mode 100644 docs/static/img/how-to/import-js/flatten.png create mode 100644 docs/static/img/how-to/import-js/imported.png create mode 100644 docs/static/img/how-to/import-js/mathjs.png create mode 100644 docs/static/img/how-to/import-js/newquery.png create mode 100644 docs/versioned_docs/version-2.0.0/how-to/import-external-lib-js.md create mode 100644 docs/versioned_docs/version-2.1.0/how-to/import-external-lib-js.md create mode 100644 docs/versioned_docs/version-2.2.0/how-to/import-external-lib-js.md diff --git a/docs/docs/how-to/import-external-lib-js.md b/docs/docs/how-to/import-external-lib-js.md new file mode 100644 index 0000000000..27b6b49c97 --- /dev/null +++ b/docs/docs/how-to/import-external-lib-js.md @@ -0,0 +1,96 @@ +--- +id: import-external-libraries-using-runjs +title: Import external libraries using RunJS +--- + +ToolJet allows you to utilize external libraries in your app by importing them using the [RunJS query](/docs/data-sources/run-js). + +In this how-to guide, we will import a few JavaScript libraries and use it in the application. + +:::tip +You can import any of the available libraries using their **CDN**. Find free CDN of the open source projects at **[jsDelivr](https://www.jsdelivr.com/)** +::: + +- Create a new application and then create a new RunPy query from the query panel. +
+ + Import external libraries using RunJS + +
+ +- Let's write some code for importing libraries. We will first create a function `addScript` that returns a `Promise`, the `Promise` creates a script tag -> sets an attribute -> and eventListener `resolves` if its loaded and `rejects` if there is an error, and then body is appended at the end. +- We are going to import two libraries using their CDNs: **MathJS** and **Flatten**, and display an alert when the libraries are loaded successfully. + ```js + function addScript(src) { + return new Promise((resolve, reject) => { + const s = document.createElement('script'); + s.setAttribute('src', src); + s.addEventListener('load', resolve); + s.addEventListener('error', reject); + document.body.appendChild(s); + }); + } + + try { + await addScript('https://cdn.jsdelivr.net/npm/mathjs@11.7.0'); + await addScript('https://cdn.jsdelivr.net/npm/flattenjs@2.1.3/lib/flatten.min.js'); + + await actions.showAlert("success", 'Mathjs and Flatten imported') + + + } catch (e) { + console.log(e); + } + ``` + +- Now, when you hit **create** and then **run** the query, the script will be injected into the DOM. An alert should pop-up with the message **Mathjs and Flatten imported**. + +
+ + Import external libraries using RunJS + +
+ +:::tip +Enable the **Run this query on application load?** option to make the libraries available throughout the application as soon as the app is laoded. +::: + +## Examples + +### Flatten the JSON objects using FlattenJS + +- Let's create a new **RunJS** query that will use **Flatten** library(imported in the above section) and the query will flatten the JSON object. + ```js + return flatten({ + key1: { + keyA: 'valueI' + }, + key2: { + keyB: 'valueII' + }, + key3: { a: { b: { c: 2 } } } + }) + ``` +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
+ + Import external libraries using RunJS + +
+ +### Computation using MathJS + +- Let's create a new **RunJS** query that will return the result of calculation performed by [atan2](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2) method and then divided by [pi](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/PI). +```js +return math.atan2(3, -3) / math.pi +``` + +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
+ + Import external libraries using RunJS + +
+ \ No newline at end of file diff --git a/docs/sidebars.js b/docs/sidebars.js index bfa8a57170..8f9a6c800f 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -301,6 +301,7 @@ const sidebars = { 'how-to/access-currentuser', 'how-to/use-axios-in-runjs', 'how-to/import-external-libraries-using-runpy', + 'how-to/import-external-libraries-using-runjs', 'how-to/run-actions-from-runjs', 'how-to/run-query-at-specified-intervals', 'how-to/access-users-location', diff --git a/docs/static/img/how-to/import-js/flatten.png b/docs/static/img/how-to/import-js/flatten.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b22877e7ee37d79ef9d2bee68d753c294a6a40 GIT binary patch literal 110119 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ⅆYaqdf` z%FaP5j$ZsY7K*Vh0mt<{ERks*C8USN$r2Km)6ZINsuG<3+lZuhz3AF5ZTbP;mO6FP z$_}2CU!9$P{)-9XHtEd5Rgp-K>GG@53}2BrTa)hWdCc*4Hr_H7ErVpZnqe`rPc9!V zXjNMgL-QVkVLw4{EE+bIXCxPysf%pkENZ{o5M)Ow1LP|7btN*}*-#L_Cot49+KNYZi= zLyqJc>jo2oG&}MnVV0`N95M8T&^({pc<1UV#VZrDKRF=ZcU!I~Y{x@TI!da(`{&Gm z`622jq~kGP)K81vT7gQP5UNTi4PMQZsUI06)o|a3kIai%ErVGgl4S)` zgf5AwKOL9rY=g$Fq0Nu}8|VRWIT8q8VZeiHAigRGu44i7iv=V_4lXKn;(^?Mdao=l za&>BEwpzmqQAEhP=h}uF&D9e*xEGN&j9l^DpPpM00hFOX{_tlZ(;wUKND5R|)|a2G zYiu~YHe%as1)A^7*sQuwEx@{sKP;Bo;5YMzWM-s>`N|`CHMxq;VxKbnImDF;wq03@ z^}6fQlQ?X`Z0qHNVIKm0UG3b7)k#9~h@fHE?0qNq@1P;O2Z>-^Kv>0~8kE!La71|d zc#Z@)cmG8lD$>4O(alA_sXw~aeGHORD%ryJ0l>Z=T~NUqxemRP4-;R7{txII>eJ7i zG0XAn0QD{whG-i~9SbCyzR!Z`3j*AsU6Z~gHXB(4u-W{x54Cl42|Re6jx?_IZ0W15|qy-!vF0( zt_ZC6_F3HQv5Tc;>3h09Q2k?H{sUqHMz{(X`=7Vf%h1&S4>^I?93UBY71xs5wcKyKdpbgbB?xmuF znQ?dP?e$Jv3kp(a>pP$I2KoAR&%#n+^=@{5y~XLn z_MplhtST%5LXV*9x=m4to#=o&BP-Uz`Ad-=%A^O6P0lb=_vpXb`q88qWa| zaR2V}fs5WCx@Mar!Y-|56^Q%@$UciO;LX7HT6}$(;^7ZOJ~w948&vi#6Src0Il7m6MxN@#9Z_cyufh3JuJD^%@y3QSkID9GtZn8tk{{ucb0) zE3$eViRJ$_j8}+%S%~dR;d%!y!I#NMcsxqzj5O`WAr~f-`;*Vw7)#5`(|M<#*!UiT zVZ0mOR`j)~Hd^xRP=};We}2YWt~B3y6NY&L4~*XId%AYYZF!A4#R1Z=ugBF!nDn}+ zM@!8ZI)6~Juab}p_J{s?mtft?ywYES4sW?Uyszic>tUZDmVIx5 zPIB!cNYA|)SXCyYu9V?L>)Qo{i@k{tO885?@nAOD^Gz|z^i{;I9~tp+5(|E$yKvQw*;WgK0?C(vrs^&2wU z6=6ZaI5}H`(KxYM5WXJ*ysSRL&e|4a;!rYjg-f*@s?fig$t)=?A}uW?UEInX2S^G5 z+Q>+-ufakvdeFZJ8`?9ED@NfDM(q{Jk0>|CRw9qhghAc4>i{NDoybiRIYPwCwKo~h zjmG-{7~*X%wkSBCMZQV&qudlo0LItLUW5Y<=b$nh?ap!8YfnocY4bF~f~hp|1%_TN8sTcy<>EcwGTM}+N7X6ZIo>3F786ff`KHg_bb#Z&z( z>rumdRvR>$6~M#i^GhI?gJdaEm{B&O1yrG~PjXMEN%Oo%(TWfatzG4XgqI<;jhCiWAL7N zob|TAgWN(MnWd%Dct4#JqwP-@748Irnxu_!!1d;CdMotLb{KSphu3Fka_54Jj-P_W zpEZ5s?2qM()fD50^pfiBv6ib7K1TaM#c?gJdRhzJbIg9yW`_;pXq`y zl(b8OpFh-}0#xaM*qa0?dI<#|8_}rgp7B-FpUpnG_O>8J#KgOl;c&)b5QWQS_mGktDnheEMWvH&#!N&PgzFhZINPG5QNM5{xv@E zUE1eC1yb=miGphr$y|vH4VG@P)vq1=6@)i8dy}8VB+Smm#ne_??8t@#jY0swd(Yaz zLGCJghW5@*DCpK?4|BXObQu(OEs4U$w#=ZvbHnL!Mcr6`s4NM5jt2H1Lt{G!&YpUa zRU4gJU7&B$#hR~W6?^I_?r8N@XP{ej2z0rJ+Q^@uE!oOS6o z#!Hzfv7YT{r5TCWi|H7sKTc(^X~{{e%A0p?^u+BlRdt2btdx@CrpAl!)w`=qGdj^I zN!8u%E^(sKB)W-|mw3Tf^As=w&R>&SOrw*wRJ>Rl*JF1+NJ=?Zq*Rbu?4K>GF_9~N z2>JoTNn2lZj-Dw}G}f538&Oz^jn8KOrFWL&h)Fsk?WVvS%cB{iUv4mVp+AiwXTNXZ zc4-MmHhvGE7tdM!=0W)~CsL+JMV4mpz#$4AlWBi!N8N)*)wvxOh!x(qdR^o+14^E- z)E)e`7<%6W#k-$f`OV2;q@fw^jkdZYnSUs&4h;KD`f){x-l!t#PKVR=Su`g?L3C}s zG09T)Ks@%MZoO@wYKj%(=f9&8l=tG-BT4M$1n*}jmmh3(0e?f&;}|+N#;8E~2%pZz zh3cHwRuZKZm=6SJkaHvI34`cy*glvb@!>VtyYmZ7KK9sJ6utg%63R-l++=t#6Ws2I zpEw(SVc8rEdASoObD=6kJwCUumrhWV36Jd#x~VdypJDC)N7q?LwGnpfzC{X@Qlx0n z;w~+&r9g2g7Tm441ec)2U4pwi!QI`9JH_24I5+*|-1D7#?pm|5lC1e-X7Xn5nZ19{ zv!&M`Ymv^vA>g;Dk>0R=ca@Puuni$t{I^Gv6>(LYR?lX?Z6>N1LXu^*!CCws z3@%E$BdYb?MKArmdH0)bbG&a{#N_|HBgAlqTkD~<0+;LLVDpv!xqD6l-vgQL- zk=oPUJ_&(=ZW#AjrYzU5b~cW})KT$@kZ71k(2a>MH^jnFN&6``*aWGee$`jDYemkw zdA1u>kCh$eXgM#pAJ!d+HQU^nKzpm9@APvz0mNoXd4OX(b(p>dYc%ePR1gb>7oeyr zW}kH{AIfQ8m>g>5K%pjJiHB_xSykO~Hz( zRxpHh_q~9NOelsJ^rMIusr-X|A${M2$=>|AIpMsb$>GV$&$-$ZL6Vu{X6JbFyi=QQ z3{i9kn(C6#7=nR9>M5=s{1}c}l ztjG&U@VIP;yY@rnDX3)>H^Xzc!3Js(m}6c}f=8@rZ<47hD>Uq2V> z;#|F{#$z@YnR%(ow&@N33>>YYp-b{=290aYD|6pJPSz#c;;;BO*7&wOn=0A0m02_ovXOc1J{vlqpR{ zbiFwpECr~<7*I(qTH1FNmiXsj7Jj*l_idW!c>{)Gq>;exI;-NAIwn{oyS_7f#$SK0 zwqRksrpDVg?GemVf94vrOB`Bu`D@|lLu$QG292_p1JTv3BL+##=iqpTBi_N?Y+3fm zCrOClNk!2fk8M<2J4bHe4sbhbv)@rlYGVbWYU6M!^n>nDZUXh1bZ@>*jHN5QcX@fU z;amP#h1S|+<7mUv3?Y}nt2EPv_~dv2{`$Mb27=A8!SjN9G~#mXPJSBKW&TJt;iAE8 zoRVpt7~RrKSN~nw&_;;G^{q4eXf=w1ww;}m0-$B>abEpYu+0;yW8m}+r`}1ho?X1= z8AQPO?U+<>?FOF}qtx37;y}FRVfa0j+92%}VbZ*2kMH2BJK6iExr%F)Hj5(nY5;e; z++7FW?x|+&tA|D%N;JDV#-z&d)ffnNE?2gP-Db3&T{x}XLkzLZkbydb54vZiq26tP zo3LsY67SEr zas+1*CjM+vYnasJz(sNkO=wa7l2`h+8AL361!j>{n0)SU5w4$2-})C&5b;WPa}l)i zjgECpw<%1<$W!@cN`pSuX1QP_xr|Xwqkcl$;_kKW*ap=VpyhiDM%6Drli=xCl4K~U zUem}C%}y{z@wE0ug{u(82r(UK6*11;7h zRWX_^W(p3)I4;%+xc_bd30!-ROZ5u3x|_{hwQKxX^V%I(z{Rn=?s=QaFlRI2cVd|L zDuvYpSsj3_f;;{AibH?Vfiay;d#%rZU1U&^KgG?vWa*J1Pb*QtHKxj+A&Q2D`bhxZ z)9WCcWvz7+eP}2GhkPWI^j5?3?w4Cb4ZApuoj4629c_j;66*+wENYKbfCgFC_H3%x z8<&70Qc5h$S09`8Db%Sv!&bHVN+6MUhM(n>e!i;v_&F}wh^KEBWJ+6st$uzi=>d!BGmzS> z%Bvep8It~LLvbTg2f@;%%lgCA0NYB$EPYqOH|oDFr26EZLrdA|y?2S%#BsA99IanM z1JEQE8ni}FuS4+)@w(C$Yel-jYkDN=JU4su!W{jxbV_{@aLqChW729p27VG!RHRmu zVgAwN=&6xWytZ>RmCDUFS$`;X@P%YCzIeO|9P|%$jk>*_U5Qd94p;AN`jl;8|_A@ZI$7&e1Hi zEOvo_5cL!aLodSI9d9SW-9s{)=Dfqq9bB^k3BvYA4eCn0MQneBKn>mIgY95`9$;ZgW?3_|sA6Hc_2p|kQz8p` z`KrgIEb*FNb+BM)ULD5=FO`WAp%?3UUpu820ClPQXX9MLEewDEUeB)TrN#S|-96dj z*m4@)bHb2y)o=4paxbJfQyVgNu1-`x+8yBgU|qPucZ=cH><7xAV^F^ojV!;wY772P z*SbgENli1S|5=bf&X6!TmcSztZ;IxM`@!4E7uz-V!>0%QgR#63$bhJH+Z{M`Jyw~{ z_^mA2q^Ef)pL}gOwv_DdIp-JO1WZ!%#fJozqk|OFk!`#Tg7Ugu0nVOB?c#O9@pr(r;PA>7wDFL|9Mpx(H zQX931bpE1em!$Y4OXBR{#wLxnb(UtlbG&Dlu?z0z=d;%ISbZKROhaSl=0q?V9!;Im z&ntBS75}oc+cqEy9kcrUN55b2Gga<-20>p&DR61r1`8#H;Tg_h%IvZos%Dd_{th&I ztF1s=T!3YzZ@q_ES_xx;tLf;FkPWgIt@p}2eGOwyoV1p=cB6~V`7&&Tvadaz@f;T} zAhYuG!8=a}@z{4}Q*_%{6}yA+N>mm@hC1t)$QkYLdY3))EeHkEOGo8_{Xu!2o0vc$ zi}LdI+Ztod-B7^lw9PYr6VKQz%cIOx;!gC9OxFpprIml215t^y>1CEucjR2*bDvn~ z;dcHmrJ&Fv{mxiL(ifu|7i&YrC`jdoEMc>Ly1gM)uO6&yvwwN_Xv64HYJPoZj4-bB zqWUZmuLvbF)zZFIq&MWdRd3KjRi`(y>?PMQ#jP-Yo zc|J_kJ~|9kuzfdrXaj`u_Mw$JTpluB<`rdYD5jQE>%*Jjx9%#+V9TDpc z^PSOH3UE}PbaWs!yDfP( zu*Z{5Qp-6zQD~jVW;si1=Q~xlco<#i=drqv`4Lwxga#@1pN*xVcd86Fx&4!{-l5}I z?iU3I21U`vL9tkrQsBrh=8*T#uP&s~|2CG~dzez?ZmjPv52w^6afpkRM$T2Y)#Bi! zbie(p$V1jl{)`jkz{8Kl2_$vz{yS^$tI5QK2iB18uu5cbY zXcOE8B4sESWs{_H-}KgLH(&eca!{droyV^|Uyw4eysM|kg5NsiLJ}k4Hz`$&!KO5h zOz3r z4au9=3GwVcPg)){?@?2G-HW>v&~@(VLIN39>bu&%Mt9Zv9$L_i?#>w;pAx<$=?IKk zDa7Ix_skGb5t*F7Wa%fE!Y1GhpUa$xJYJ+PVR4E!98QL*>Qfw|Hxs;SEvA1+Db>lW z9~T1lDQ2*ce0JO=tYqXpGK%k_k{KVcq`BXqpRxdb9`Cq~xPAbb&%0SQ@6Ec-r_?4D zTj(viz+{a3v~QBBOVuWKkTqM*tFq3V-n>bvwl3hxvk5Aynfqlhnt(7i-m}V8H#VM|nH$@f|ieM!@yLh4B1 z?Y__|!aPgTQ;IrU4^1x4A!o07iAxsT9-k%qV$Cg<7@f5eR5vhFY%>5dbhb3Od$n^E zNdQ#NRH*YefXs3xz~VN~V5tMNvm5&zbL*rW0|Pm)D`Y|FK@>=KQJYdvCx$;492v(H zL(KPHS3#xm=?L4@3=6WY9yH>- zACclK&r6PyG-7{d`!C2Qi1amR&ydaIkDjUxc*@fFt8jukyDA1~Z%aP28o%w+j@qYl z%=h>sZ-dT7yp#Y;N4%`b%c1Q0&S;=+e&ZdYYu0kQsQI`4c{}|oKZ;VV!ydoUk(^rB zl&{`y|7kkX=r=T!row%HTPAs9sZIx;IBZZ_L}k*vnCkT?iezfwCGf}#iWhs#Oo+aD z-8@t22#2I^%4Xc!vp?H6Xv~PhKs4VP3UhtJGT7>PO&xj(;&wW4{A#+YS~B44uYJV* z^K4ezeOho5TbgD(O=;*IK-pdf?EjX*$feYhr5JS={k@uXOAG?F|dgHNm+SYbwj^PQi|oNjZb`L%_<_2Dx1t z%k1J929SAu-aJ{1bX;E$-2QW-L*rU>yxz$=R64LoagQ---tEHB{@jp_Yj8?`oWg!#FV1?=q49 za#)Mn0bE^+l_e9hXT{ek3bk1${u7x_vez?sWtLfRcgnvbhvFzdxTht#uqpCFDj5id z6V@CRbzL8VHrO1@AHtslmNb@%KRJKoJ^qXPBwq$X&H$M zZ>A1rl=-PZiNTRugYhCNOSN9@_GX)$>fAqSs2vA~LbUO@aewVxbYvWxB>0+D?-t`x ztN%=bcfEvnU9;A%Ee3eqb;go1-yQx8z}3`J0KVv#kT~scRJ>GXkACT+%ICD=Ln2QX zbWRVk>C%n;f-Qabs2E}hDqU-mRS!NB;r2QXYiH-Uj0`>q)g1A-${joi)jyK!XEUln za_(rSrdE%6`BqLcqbwO0y zp0k7P8J54lrHP2lSqUVlHyyrT?v*ynDEOht{{bv)vQfV8WG@bCJ(TdMvt4xr#r|1dZ1>LslMc=QG%xU$1cR72=f;`7gzt zJ(|o7*J7up_YZ|^6jkp`+TE!2%2<3m(SpGXDoYwU_QoNv>%`T84tLLdN}~&@Cf03d zuJoTSrzYDVoZPbOLql~VTRX|AC%T)TbxUi3VU`p~?i-{PECh58A{zwG?CZUw z_9E7?9zMFxRczV&*?xoa+L4sGV<-)@;-zS#dAF0|SHP@YtKlh_w0ZYas(|Zbs3fbI zzO?IOkvqtp-{}HdB?kWYh2QTLBoEQx}~(&vPhw}N)Q*XfN-dwrd8gtJ0W>#p8X51v)7vnN;-2pF?CzaO3N1T8Y4!8g!mGU3yf|g41Hjupd znY!3`<+OI25^Ui|4$hN|hb^*!qnIIPHHtTnaL-sU6S~T58KCO);uJ`Ip%0+&SSyH| z-rkN*P#UM-vO=U97+=^@*3|ftb1&KgSlg=TeBKf>O_-0g+1Wv5h_p)1cykPVS$wRi zu~EA#>5t8YnT2#tyL*Im$`7e zXWxF`VIOduTX!>;xEl<+p>lLx(NkI-IGNAqNOMk~oP*7J;eYQmYM|C{s}8)LiYxCk zibFtj1^@ah9OC1l`L^HlY%j(}!&H{%i;@ zj(IeU?>M*v!XUFHADNV#vWV$1M324ieJRXXDDkk0@$UpChgm*5tCD{JNSn3tj#`J( zu75kEe*u-3(|_VVAO3nHx!=X4RKN>79&`zr!?Ich;J1smv{yp=5ulsvD1Vg~c!WI0 zg)_`rZukxrRSAIg*jw1}HqwU_ZbK>IVIxov6l+yT^qB}=^Xbhb-nLBZOkG}E?F~;N z5ZTJF=q8D+U*Y%i*1LY=7E7ztzHPKQ9$Tkan9yh7d>HY(seEu{;=Dz@|ZpS zGQ+^3>qX4=k;~?x=Uy?>Zq36Ih>ThX$Bw%S0PHP%ZVx~FSl(~kMrj1nSmX-WWUC#~ zb>F%yTwktqY)dpBSN=F2SUJHOTl$yVPlg4;yz)F?3e$Dty9|re{ltxD?fnLgcH@-$ z#jPQpFJ{b(H~i+q^R+xy{JY`(W(N&04ZBr@T5(3yVdgr%k-E6I$dss<=mL(oB~F8O zAbHw<(_VEvBgi1S&wlR(PzGmdZQRTsaJLzlh1JyzG82RSnfPVsylQx74>X5W-=b96 zvr>)B&j#99Y_iV?7C=h+hH44peg!k>G8q2K;n~KjFQ5~0;bH6f=;wd(avL!>4dN)s zo#wXvu?8<5L2nVPU}B(s4%(_HPQoG%oda%L(IzzLD#_e-Ha>Xk(yjhSksTE^XxnZt^ z2K-RV{cc!M9(=F0lW~V?7r`i#!eL(6=Fn(=>=u`gUs^|>(151dXMM=e?zjvjO;$^x z03W3A$<@?tb6F#pb3Vgqf|=@S6QR(cer!tSlT$OUZgCZ&uvTQ9S4MZAsHo7Tj6+34AdsCBABHF>bh~ z(J|Xss1L;an@Lkbc-Gb0lCet3Mfn$p^%wNwo8PleTlQ}%|39P%e@{b58b&t1ENHV3GXFE6{Nv~! zFw|;6@Zbt{Q>EQVPfs@c4N{k@tzg;h4~ly#U%d|w^T&_<*<<${GX&k=kSIy~{8?JZ zbvz&3C=KqDk`BWO??xld==pi_QWri@_*1Lt>Fw{|`CNAWlDZD5F0&3h?y2U-w?sn5 zA0yJai|WWIDG|^~1gj2b)d>A+k0FPDU>7qg2!V3InY`=K%lcrscNnJb1kcFw1J|)g z1S4KXRh5;oosI;&J2Lf3JPGiSBZClLsFcYma?bt?hWc|Fx<8%iiE6E&ii(jP>@$f9 zv>3UsG{kLz%8%-FHnqe1?1Y6Bf!uQkaF-r}9TDL5G~4mkH%Mz3ZDzNS>Ysj1t?XVM)-l3F_XaEF4Kt8DZJ=?shYk5pdrwg$LGissVdV6sF|FSS zdE$2~!V~O=!gH%LE?6~eivL$~;c|#zz0&4)@`RLa`~0ZJ=1z_KB!CkxR1ygBdPZ!A zioOQpW5}fo1itPTkHLw8QAs^}TTHbI5L+pk6AkQMdnzw!ftHt1&SF(0B`;DmaU`T> zv>WXR{q3gf#A@2}vNy+XhWmRG@e%=F>BCe0<-w2xr*KM zr14Rf2iR+erKdk$@LPIn1+;!B)60eQ;@MLae1CVjBfKIn=u=&7?Zv18d3$%U^}WcT z>B;qQjM#Fm6|XGW(?_DJoQp%Z#_5iW{PV{zoXdUthb-%9o$xrQ1zqJz@@#uc9%t@2 z5y1@BnU2Sn14#-nX(5U0y9{xdy7$wlbNi1Yo=farAdSd@QF(Eh7w2kUkp)Y%Kx?z) zT%#3@2jp(=12+$ErrmZJtuAZcx~&1zB?yL5VUv@S|HwB&SrpGx5xo4ofxK z@CIYb_1Zklh13b>t~CYC8J7W69|Ol*-3K!GxI!k`tZ0v(_qX=^HQ43Vm~|R`V@=1h zwi9G$nog%o4^q2^@|vNfd;J|rvvs?@(t@N`%9lkLbhb*A@&VqNWRA@1_v4T0hNoE~ z4fe;p_HL%)e!R8o2L~ZZsJI(gqju@tUv`+jhEj*aXf71Mn^Pfsgy-jqA6b@W*i32? zLPCuKn4iwdk@>y!7n3ivug9NYTuyUt8nWkKeG8blSs&`teLq`ww45{9gpMCV;eh!W z+sXA1RuBX|cw*6e&La5r$z&3C&wV(3+-A7FXqKb5nG9P9P_fbg?Hxwe6vcGS^b(B8 zMbJil@hh&^KXtX72c}yWld~G$ff%*Cl-E{QH|HS6FJgbaDU}kAdK*i4KP>qb*w8Z+ z8mH){xK)dNNYJdiL&#@Z3Dp)a-&8#^u}_NZpbbgN-M;Kr3rrU>obBp`5hU>xkE|wgoK|Z-Advt%#P`j`Xasz6y6oJP z_^9BDj&Z+0ZxLkwDLmlqx+{!XDPAt|{%X0>N_gDlG}Rx}C<~PX;<9wIh=@mJ`&~F6 z1Hi%sP z`4E5(hxty%Wlswu9S-|87M|g+)vI&Ec=GQhedwz&tVfA%3|yfTO4F~Yv%IA#E95-C;5|pdU%F;gj=vJhEl_0=goqJp-?FdjqzcM=u=aPyHH|0u>W37gnM<}Xu) zv(3}0w*VUi$@O(q!RfWdS}Vl5nDO|n%IJ)fuw7U6}7n4h^f+FHYDM;P28(eaw-uG=PsE<7M$ZsM(irbK)=h(F_ z7SF>3f%|B>PFJU^1WG2OUrNoV>^rpxAg(Wnd9UbWxThn&=aQY7HCtZ~n zVO~VHE#KMr-3}tVO|5@xQViROT!(*TNzXb9r=)ecYw~#r~r>UR`dB1$NM4-z_*L!PK4Yua?b~Os` zd2oK(K$JMx{v~(3n592#!y3uh;pT9pr*;*-9biPTadZ^6Ss)Lqp3mB{uAB5O=?%n{ zxv8CZJ+!)Q&qDz=4j8d|+`8|EE3YS+L!zfIVj1_=6rpesB)U}2=wAw2+e0g_h`3J+ zO4IJy$IFTd>#n!NXrCXUxQkw3;+2#G#&E%7poF@_3}ark_td>nXeC{>2?ImzEK_oc z5nvgTUBf&oBKrns`EAZh%?Z%}G)O__$Wa zES`Dvgzy3S%=^Wds;~~v56LRK5}2?Se5X$Dq-#f>tQYG<)DO`}C*;v6ywaDs?RL6R zkE{oNfM5Dy#_tj;p8Ag|$JDq^W={JjSnwEh(HO6B_%JY8F*j}Mvx8Q`L%h8mLf|G> zMkg67JDg6RPaCUk5|h#vPM*rgM%?R9Pg{v^Jl)3{^Afz5>wD8^S#h8^1M9a25j?WT zb@pq=-F9oj+6Iak-$mA{}s% zG$1NZ`E-1lfi)b#iFL=?e@kymR? zjp~f{s?bzqbOT|k_Cx$46OQWmTD8}Menmlwh9oU(v~_oJwfIE}er`kImT7`3B_Nxa z8vSA1rx-&!#1F%06v3#Oou6o~!<{%Y2)>0P%P!<$Y#&f=#87r0OCoe8&lFok(-)fK zFv&>VC7o4YWR)fK9OP7QSgJ_`TP)U`PW!cEz1v=tj9Gcux~+z;3Wu9_@{T`SHCG{g zsHekBpbTzSs4rL5e~{b7HMsHQ=EGAJv-66XS9&w$RHkuo$YcqmXH{QgnKiUpc9vWT z+}~TG8;DtHsMAeH$Y0Ulsl@Q))xr$@INLOtpvErAYft^&Muu%o+#V#OF1JtsFSQj* zxltT#R7MVhS=RLoD3%+WWJ#50A%_%dQi1S+u_w`&8E1y2mY{triAL{%BDUNq zqneWHdvJqM`EGG(atxzb#QVqewO7#h-O)Aod_65j&*EbW0z1*KP@=w?eflA;UN%o7 z?t0_sqH}=~G&3;qK+^HnxRt_J3?Ao!wt!BMSw|>NsDyB$#2jYVP5Y=EBGTBjY(2dU+?unYpbnb-`1#sXrhq*&z2nG!@ZuAWZkRllU6 zw8&tD5I^rDUXA5oF972SLsa*9AbJyuGsAFR%1HxhHC|o+A5bfBe$useqRG)A3t=!; zmvt;4!&zrRa`1c#PoXipqKf*WXFJh_>E6XH(Wc~;kPY!GEjZVv;#-;7!CX-1pnS1z zGi-(_Us!0g9dcyD#oXZI)qZ8!pwlXI{B*aHTXLNdRsuKW?g^>uF#ZrCnZN-fzl|Hp ziT0`32m@0z2`NgfGomyONz^}<3B^RdqqM;GCc!KbIWvK4o)uGS1(Qz(=mnlBg|nA% zT&M)Kt~jlo^1Gy*qN6bnFnU{K$B-iz2e-rp52)M zA{VbtOEZ>d>q$y}ZL}Ko3h{oA&^N{|Gr)ii9}#Ze<*puLyGK@>{S=d2oH;)W*68!- z9kR@+(!z88D!D<=4qSyJhDw$uQnsE=f1uw16Y7ARv+MMlA#-TFYxlCg%{D*mzWx;}Ys1L~77sk0qH)qZngw6*2Pdn9Frs6u4^kFF}NEHue7Gs7yP1rnL0X5oJOm_P1oW4Gv7w99>N5-MCC zmtqse+O40T)f!L^RUWC>K7a13J+Ad0pSH%e9(^F&xpoSA*rGQ69-sAl5k=vEOLocU zSax|z3G?zsB?y$yX|Q^P480MdV_v}8B!ERiIw~^X$&Qr!eZ1a0MK?@h8BNi*3zAZd zNn6*QySjTCSbnt4)0>MWj`7Yy_sY$4qncIIW>GeFs+bl&jiKN@?{)I`l2I$AiW!IQ zMprMvpr~{T zo+=s}9-<*`rhE(gvW!`vXT#)GGr3!dWl|Ovd1)amUtuj!kC^N%W3%x>fu?d&PiRaX zte9S~1}Z4)zArqal`NIn$}+thQgI_D^?WKD<67;>6Nx!`_0vmea7_Di9pnuPC(9*9 zXBIHfsY!coj2L3DZ61V7b>g=6_!v4iKB!qhjkCVF9RkfK=~}Keg?J1jdI+2*=9&Ev zlUFV|3eLdI@NQ_3>^S{(*v+&(i=|ZMO zxHJ@&ic zioz_<{xZ&c9cxaahaOXb(inQVp!(!7IR30E^b`gkh;G3^yuylZ(^_#_ej3j*)3lWi z?$}h%b1Kt3G{DSSq@R&d0lZ=%kSiKaqEda*rR22sozuVh}? z(6vc$Fv1YLPgud`MdfrAr0==4T=nH^sp@OIwQiOSufkD2_xA)@?IT9NuykRpp zc~<+XttsicX!~~TbsA&;EK-g&$IE9LSM+6rXK~?(heD81sOo~*2^2Bq2VIAF6)Iz+ z^T*e&3p5#l`Q!rkL^7a*3TnU!@O3N&qsr5ofIbh{Z@T(H#ghT(MJ0nM!y8x=+P|(S z{KTP*2yaUM8jB3J`NT-+?Pb2^&T=Y@`7;z_H0+9rMwuQOBp*}yELo#=71W_rU?OXb zc80K;dX?tv2~iA&3a&@;yzt#a;%vN*<*Nd2jlpJgNLl`@+otSE93CKZO$3ca1E z-@V3ng{EAq+&>uml=18zaw-FGx zc)u`{QPD%XU?nF?^gwCV{-~F|8ZGaH97}nmg7CTR{FLpz5IE= z_-Ky?*FZj!I0v30^p(TOqigN;z0Ez9aTTYXb1d0Zj0}MnD`A;0;c)kDs7<@ysZe@p zz2zLvv}S!tv%!%c`p@-mPJ&+|&yky)4hl;omOo-P86ojWes2?0u)$iA-ar~W(H!UJ z1aNICVUjSJYCypyS|ZT*>l%$qKczDbUO*|zdC*964<#SvfVlGM|Q~w2v3){@5VbFL^$EiJrIJ>8qu0Rr$ zajvuxT06YBM$dXza@rc%J5_LC-J{66gtSHUj@D38$lAJ`rx5L_8SLq4*BWgkpevph zj40k@KWb0S$YXApM&lFmAuh@oLA8!KmM4fK6mzq`iIJ<960YV}YCcVc74`%68a;Ai>g<`isJu7@6m(cdc# zF+7xnYkjuh=Dgk#)jFU@YT(16H{4KC7NWkT4=p%~L5}L`0oB(WEiNPsUk9rQDMg&T zE=pM$FVGTdRK2*Yra12H5{C;Ib|L>UJoanjdG<>;?*wSoRbbp)0LzQ9Qju!FIjq$5 z53#ewa3Kw;>-^``vyhMwfDqpEy@vYRX`jYZm*F=^iqy>c_K}O1(foE_jLChn$$u;h zx4G8i&BQZzZU%MfEcQ@!x8S)Go z;D}-nB)kzMGRaVahCw>9{I`4`NQth^jx@FlN7U2R_>JO?kQ#lZ7Q&5%B69A>daxhr zZqUnawinWd;mez`Y>23mL_ob%`>G(k;e&hL58yB!V=koD07jDOG!&ZeFA;)bqWCul z)YD4m(Ufnd?mZJAo3_{|`$~LD*B#zruxlA_G*+ni>97g3%HxG_$(-p9D3=F>RXyB| zoZK7dNAZYjJ@xe3ZD~7qsi0JQF{$MuCPi3P*BK2hE8W1f3?Ir%ZvxhY6g8=S%@&n# zGOLw2OJPfk9#Xc1;mgk6*;}40-Rw&G+lm`-_fomL@w3Rlp$lEJQ@5Xg*MA>vwZ`+} zG+f63AoIzlBI6rYxf<^it^ZjN=gN*#J&65-2`C8sdwu?~h4_018DItW*+S`Kgn1;2 z$jHdMNLidZG~0BN-@19+h{OGo?3kaVF4^y-slA?m-j?Ke`83O_g{h%TJmzki?qI4Ey~3%N|gB~Dixt*=aUtT-40*?ZJS zJ(5QPF0{j0gWuQ5rf$nrxg_cqLelB~1CNRG2yBB znoviGhTF2ICdmj$_%Vqqo7RZWMx(c>#b0xDawU*QaS08e=}mXp0Ic;7AS&4Hdga3{5hp zi7u;5dAi|2-_1bX&(a>$_gBq1uA z-p!`z9=Y*JS|5&RyX6}!4M2U}mY%v^_p+61>WXqY{g6nBou zTsKMYlZO|xGm5N~m;~4W&<_s^LeijRE(&EG$ET2o9Vh8FBJN_+muuVHG`^ooEF~W> zKWvl4xwGAL>wFE^i*Inr9x4ggL#f5&gQSQBNefiHXR~pfh3YRRwSvpju47^Nf}5;; zWM9i<7vn(@VC+8l>6V((CL=U%B^2}FcR2Xj^?xk=A2kTicQ&%W-|y+Mzm<8P88=84b@)e`I z5HU_Ax!X&Eyp}>oldEW4&?`E=-R{%7>oa$=5?&qetAQyn=gl<}Vk5VNGBjO0fp4bO zO%279kP#pvDJ|p;J(E0hH>OdXX-#YKj5y&qY35s3Tn`yAdAD7f(SvBydDyp$dDcmg zOCw5Q);-Pmz;?e$^FJe9VS#RbjNDhPO&ynE#_tZt^CXeWUJ0XdrYu^%@@;pRCnwf> z%WY+{>T+^DdB?>QdJTy(XVB|O7BlE(X|06B=VnUJFPclrZv}6k<*UsX8&!}sIE#x8nYF9&enU{Wz1ZHQlUVOnAQTqIKiRD- zzB6H2i@>IWQ+|6UEapXe)tH}Tt%PB-uV9M#5M1?B5&gNGL$mAu5cU;NQFhz=iXbIY z5=sd&bSOwS(%m_9DLr%z9nu}r-3%Q=tAv1bcXxNgf4INzepkKUUH`QP);nuv-gC}= z_u2c|&)(;p?LNkny!D0JssyZK5yT`tsnq5xAf3CA(oww@GJqzBSo_KNK%a&irex^J z3ubI;$+`Dv$R6B~5=AMT!teK|;Hc2-dw0(+Mhpgss(V|uPPCO#>ntk6XktDqs2`HHe)(2xjuVyQzL38gr}mx6rOF5O z=k0P3_8X{l0BY|{g^fyI?J~)fp?7Ng!_`0ZQ zDna4dYDUU=BUnBwCwErAAw7>WD^ZDCsyc>c^~YA{1k_&#y5>r3QXALGeJQFx@a#hP z6yM)kEr_N}X$#J(ydc>dTxIYgJxD22m^Hz{INwdtD30QU*iU^mnc@DyBHdsOKZhi#ZqFo3W`$)ZB zNSvmvosx9N4*sc~l^lVOyiyjJv?;mBcv#Ya25&E2Fti5-;W}&)S!((BH@aP+lANP z6TScYb}nA;Y+)U%KIsy;6OZ+~6Y$v6#Zy+`XOd~te3<7tTDWF6(U}2tHILZbdoA?? zpo$99bWEMxtis2m0;IHnyice^{qFq*r(uIe>Y=naLkz^@Z~>j8=bBeGP78)w3aY`* z-7K^)8f&UsGMHE*1{2hEekdHl@tQ~4k=CAQm5Wf(s9wdYkgkR7r$wxC=vtcI%axBn zOh+k+kuDlQ>5arZ0fRtjvI;h)q{0caJ;tqqEdgHHMH-3kdT2kjSKsiEwvbeNO*+Fkji`h^#b^X!Y1-8pxvn|U5c$(qo!A(f9beUZ4-vDROz zHi+t2_8@c#W3-3T$WSt4;lvh#HVY;m8sPczhIYJ@c-U3sQ|%`@UP#(D;V8D@+r&0g z;V&-2lAfH8JsGKYEn0@wGtB>iYJyVv&&?nVR|2~tjr!Vps;$FOA6mbEf0AKu_NGih zxUFrfzQ|&>njn@|r43w5yNwWQ*<6n9{w38unc_Ouet!gs#hXSq56fN1&~!E%x4s6d z|I$Ebo*nN{d`g|N+?z?=#E>vx3`NMZA`FW*|5mgYy~U(YI8${z7wOsdxkY*1VpyX=I94$&-G+2CVk#BW? zX4Sh&vhzSZm>V^Jf@8^hby5{7QLr+1`TUmpoi~s`y9ihX`6-D)ZXBW3UN_nz;j986 zU0tC0%pK`+!547b*6bRJh zjXS(5-&R8?0?uUl6*#Ep3+zB#+BdPA=0Hq(!V<~zW9HO`IVRmMndN{kz-aKg3A5=rX}SU+`&XcIwDi=lg`WJ;LrJgS0c}_(=NI zSgleCoDP$y)bA!`4%35#$Wo(9Gr7qWB(msQqocy=8fv>rd8zyMSbBx6 z(G_)v8_bXQdar?-oCF|oI{mhszU9T2ajXnm8Cq>L{f`-+SQ-c8VA_&D4eRQiRp@8O z*d`3@#l97MW3*{UEG|hw^O#hqAtUh78hHO)<71TW@YEDJ!;l`|oTEpUP$sRV-B62K zQ5%sOLj1FF*6$^<-B?Q2yDRj}i{NR|DFqts_W8(|lYP9YsdjhZZg)<%u+qWKbuon2 zs;?tfcQ9-W08yi0^stCrb-ra6;(2NK+&48F{=;fTPV^x)rOZ(~*3YJ8i?yql`%4TI zxZ+p@w9dCyQ@d~X8XEKz_6(y4Lur?iDzkkuJw`;;w;G?-=CW;=!a&cs*lu3}>5Fcb zcs02KJ%Z{D>|1>UdK%om-Yx7r|I?T)RuXr)>G5qbgQTN?qA)Nf;FdK5X0RrsTT`FRpEQ_sAb!4S%E^6Q=ymNRY>xb{XqSUUrfC!32X4 z-_szE@!NPOo#5oNsBmoLp%j-5zRw$^WPWNshVfB%mx7(ekxqOfSm$XgM8}JR7Vojv zn{o}_1!_hoVL^tXV~wI+7VyTY%3omBa;Ckr^%Pp|&QVAX5?C3_rkr_YuNWs`M%v&Q z7%QuB;jU$Ab8I~o-h>cinLan8d8Yg>)m)w-oub2!VDP>Mky-b$iy5zkHRwGA ziLVPeVs=~#$E?svBClF)6GB%#6dN0v-DX5WN>3)G8I>bUI4l?i--#Q~@=|sNx5?7I zM-Ob^-lch`G+tahA~^^q0+tjU$#RCqkr@kk>;tS-r;EbM#*cZyok)%efQ-t!Gym9C9Y z&WqJ*t5LyrBhFyuZPs+XCOJCwa;EXhdCIG|T=m7i$7Cx3cwzB^zf^UBdw9na&o=?ULYjVyh3 z=r+F07tUT$|D6zuF_J-SQ!*YNB1kvd&+|=>Q=dk2S4L{k9f3v_(nTxXPe952C?Vqy zQ{cHw?Hf?LNg)Y9hzj)mI@PK-N1`eU(Yc%)lQzx{fFi~Rsn*og2=-D~uaLkmHA6u#-X%d26KCvKH9;a%Tbu|sNFfzQNb1X!(3C!C8cA^BoI=fYTA?- z@iL3^=e33QwA5n);DR^eaGjz&1>QTf48#%}(HHWT-R%m%Bf};#g_m7s7XjUXBVL@9 zYdo-yI9MDsKVQ@?SZ)`!uZo^{V5k)w|J#VZl9Z6P>dVNaV zlseSecQxqe_T~>r>HsGj&T^00$WE!RfIhd`&f%3DLWGO!9}y9etkhf47dGoUSm-=V zx6Mx5SYraOLXU2z0?fZ;Y~n(OZ8=%_GRvrv;^J~xoYQIuZ$7_HvhoDf5Jz8jf1p>K zdY&hJyCZ`Ytq_qMg~CTtiK^ysikis{P*%^RDx!uWtlw2)v-r?vf-4)L7e*{3m^f{w zKR&;UQJyXCZu1k{@5m)?+l_|r#uXrIxZoR-nOU>rlSr?Sg>H$i8IX{OmN4^(oLZ%& z_12vo|2T!(h`vB2nM9T@ZZD2Lz$jcTEU z0MT2q572;>MD@TJj;-)mF@8+ghP2)vo@=L?o=cT5CykI`k9bMsJ{$kIJpA#ahvmv~ z^k01819E$928ZlC!%n-cZL2NeMIBHaq^R57^&-nazgiA^A*~4@A#+6=#MywJ(vesq zy0Eu~g6_y>vAeRIqTWay1hszle_5m(?DW1529UCsDYnV7K7+%F8B|8Tu|$XdL{MSLm8@h_{JtChnKYT z_;oJ-K*>>!!vFNbkT}I+cm9V@AA+0~c#(NWt8&KF{|_U#P($i-JXhzbp`c6iI%3EF zKg0PI<_7t+_IpS%hQZ2%vRe&(d?^2LXn(zxt4DHUTOHR=dy9~(-vXcfPh26)LdICa zy-1KahjIVn|HKq_b9gma5~=LKC`X)Yz`{TGNbEK2JmkjXutqk9^tcxZC`jZDq`yz9 zhh!h@<+b$st?k^+68@O66p9opyORPIaxyPTV9ZEW6niyX%J6DWH*$KSVsMi z9`jF99t^6^zqlrw4FW$+<`1NN3qHgJ*4YVPz_9l>A~t)P0cS?d2J}!tZ#fu+D0SO+ zZ$fF=oPk!Tbkw61mlhIxU(%UqPXO9!qkh&{j(2t1%*!`xG<|mRr7~Z>DRJ0kU-}LX zmQY&w>MF`!50e*U{1PK0*?b@X2G`H#D42v-Vnsb1ekY zcII3kp~lg5db&3aWXt<_@1@@U#YO)zh8IkaJ7weixTzW#!SEXIi@gvnp&BigyW<(H zc-DLR@Aa3X3C~<%X$hp_jqNhJ(l4E|so(N+z~PV-u7!;2J^sqv(BmoPuqk0-;pIaU z?Y@e=*1M*`-KnCA;^_Eq9H?;%0o21xEI3}fJ^SumF;<4f+6|brDiDFv?Na6nl-){L zsb9VZ0E5I`99}H>)KPe`@jpDuF7RUPRkT>;uaZvRdI6SO#;4zy%>|n5o zDhtG?=i8z2Y3_u1{r(0wJyuJdvV5Ka4P4KOIf7Iv-F>Nbq{fc5nveMCw4kr%w6)c) z`Xx>p_g-;x9`VAf6ebj%!q%7N-)UJ)-Edkxxzd`3i>1BLZNIwBU)c9?=ruLyoz#0ilI4fkI=SQ%q=#IQdD@Ss{STL@si?nesp&$%ViWL0cuy|;H3#Ye63=|>ubjK zUMPA%mypjEQ}S-QsIxK0Q4_`!4R(sk3hPcLHq}d8r}M%5H0(gq=wXlrMTtyqe`0_U zt;*((aL?Uf8v3jUq7b~x$!7dOvxQ`c>xFyc<(%k*<3Sm2I%Ie1<^0VB?VV-=vUJk> zwzZOJdB!RRVviL8CDi9b;GLN!yflwv=Dw5`Pn5@Z2WMw0w=;P?ck+VLg*M06?>=l` znq{WWmJS-N_lfF$L$!L%LXYD(>wx-d41M(SC@vx*zf-Fg6l}>j#$zBl8%*OBTbUAG z6&@P=J*L28sW(0?Rx#w3iQ2b)7Qd=Q7*7!S`qOUH+I8$Kdd`g z9Q3S{WWxMcJxDx`J&_oT`W%;4PyTZ2bO6zn<-Bh-bJ0b*`PXJ!)>V9GnK%07kE zVV@L4nZ@as_nYHmO_X+(>_#AReb4MVUqf>8MEZy&?5LQ9Wp6G-I}s%*IGN<8?Cl*+ zCyjP|iPkdSUC?-IABHMdIc)dyomT)E=jHk^wA1p>l2L71dv}`kFwmqGOv|a*bX&Xn zHgTlLf7)ut^PwP(izp*FIn=C*nU|}|B8NVnn}=txRuz5q)%cUI%0;jF0|nX8cY>Ks z`Zo*F`JC7i-xr6YVy<1z^X?c|cL)j5=8{d+B>>B;yHK=Lg)&v=5`9I`1P|kAw)3ud z2;85?D*-H$m8*@W`D*fuOswZ z5~H--GUb9tX>-vRLl%;(Xb;sAp9U=A5@Fh`pFKT_4OzXKRX=}JT*h3g9x$ra3MD<> zk-2f}h10))qB;P$0smz$e+0Eg;oKW41Idl5bZM}DA~65(oMT(~%4Id2QvETCD;^^6 z7(Spvs{gghVx0Kd<~*BfbfIbk$`or!$@Img6YL-Z>1d4z7lGJYOm|Y043;P5_aE8Y zM*FNCipKFt&ALpb=8hZ6msC8f(4MhA>j3EX-#A9s*9wpy`vB zGN&6Wp7-5`?3pV9C%Y?X%WMD_*VmfeXpdL!8mxv@c*taWHS3h(OXsT)$R@aXjkB@B zr9RH&^ENg%$<;c*)SX(bQ(NP%pJs+fKR<_WnSX1%SY8?#_*f+F?uDKO#Ky{%KXe=- zEt$e*ywWr^x_9!$dRByqs8>`~#R|)$KqYjm<5O-wtd_CNbsk4RfrgxB@TkYiLj_kV z;H~~e@0Y0;D*i}%HWu1oS1e*8Fkd2G#k9U&iO=nSa)AG5ieUw|PPRjaK(>;F50DjO zqAJ~Pv=V*DG!#6|-J32QY>XS9C4uv#idM~%>*(}sM4$#RP!pfmV9D@J%zyDkRFtB5 z{fYciI63lbdR*=(Awrv4+sa`Cs1r6Dv$%+^>17r1^k5xyLt9l^99j|Q>+37kd+XMF zm@Xv8q+nxH;qc)Fg-Dd=D69xle2pPfUM6}3C-^-HNu^PE)$!rsSZ|5HSJoxI0Z;{3 z{!U$uH1H!u!?=3hO12>(CsrY5iGMjSkk4VU|3cboy`Jjcc4~>TP)+J_Qt?iQWq+F#I3gvM&QByUR1+$B|baw>)txR_wr3SM8_7U+m zozZp&2l7OC;&A4Yz?|Z!x*--72A5%zzVDZ)nB7}6&-w0IwKOjcs|ix<)4mEQSH5`B z?k7uET^yZO-_PrOk7fi`#wK93s$>}I)L%SleIu)PvfOW~a)zVrvJB?F+@a-6jRH@e ze6c-Tu`ONd4NRNB`^5HxWt(;J6pv!z%2L&Y#^mXr)-l4<0Itc^&Jif*3#B-M>Z#-cr>+{rVkB4tLC<@BMV7x_R{;3Es5OO(|47#T{Wbyz)`0q;-hbn?zvfvD{7gm3R}@%h z0IB>EG#F_}>R;05l2WMtP%%C-LjFYZVK!VG*T6LIhoj~Ny}vP`BqW@dDN=?gMe*&g;=5luLG=k9s3TvHE#2+T8_%dC(jJ7fTZy`J(;8{; zaFC>1W79yry1_^xaWSzqPwavnAs(aX)^X!A2i_&Jxcf?!$~F3Lkf!U!-QCc18ZYNf z8dVEzS1TsLtuc|<)^4b2XLn9CznlJIuj_THns1t{NOd9c<*Su`1k4NPD+D{!Wkgw7 z&BGrXPWxY-xNmkaeMgRjnmDyZYVK~p4)EI72joxBATi=@6$J@C*d+agN)?4zFL8W= zaBfO$j@&Qyw^$N54dU*!KZgbj-wt5Z)v>Qd#>>yScvN7;(`J~)(l~!gU1vQaqFHj& z&G~kn+Sju(=WIpBpxx-(5lX;eks1@@3+RbkoDC$=o%KiCnomT51qAiOS9E{R@&CK9 zmP%hpH77jRp|KGb!!pZZ*wrXN%tpBa#7W+|Y8S0DqRT?1(6$3KuGl?D;iet; z236F@wPs)9z`@ZOal(!dInLE#i^o(bOD~@{worXK9QyY4D;z` z><>>*RqdN}D=I!u)fo}g>`wT-8ucDr_b0ZtwH=<9hG9n^OHaK1jY9!MP1RgU#Or0jC!sol_x04VU$hY|7{4lrc>lX$V z-)Nj%9+x_6h()205%)M3V=0iu1dn6)HzQ%D0-6&)D=cnZ^GA(*Iq6!L(1qq-V?=IU z9Aek+jDPabKQhtT+(#)-y;>>Sw`*3D0UsQ$UtO>%ucwHUY%kw52j-KYn1|K`W| zp>O2&=o8306l9`E->+svMh;I-TALi7b(-UNY~F^qjFiW_obTkq*4jz$E#>q$EpB$k za0QbX_v;iB6FX*Jv#3&=h0@eHw!O6&B}bRHYQ9GfOJg^BdG@7K)XXgVRKhJt9&X6& zo&cS3b*$WF_i6EbBO0u-J$L*0-aMkJy(xNm_SIGZbv+~vwnmPGI0D9+W7&$&EQM5Q zK|8z50=n6TW7BRN$;tD?!n!v~>&Y-4$jQ>3&d_6~NukeFTX8qQnXUk^aRfv91@a1kRp zJf%!ZpAC;KE}g==bee_G_|)N3ZKque9NLfAPiIGD)53{PUqkkWx^lyXj7TrX8~vQF z4$Hd*3(%eua)!juyWwqaZcb$S7OqL~L)XJJK?Z3AWgjQ!B~E0N_2Y}ANt`(_BgLB) zZLgXVXYpy{7zB)P6lnkeKu_WBR84!;y!$AwxXJhL#9uWZOmLJ5(QC_7|ZJ@42u?Tb`cjky1yy?&(fL-7)x;jx?KA7LwI7ubN! zu2$4`R6z;2wA-1~9zWaYpIEhZDVm&ETghH2c?8j>L~e~h0y(;aHrES0wpykno9l*O zc3InVIoxEs>*9dKhgekYhZwW8b3$|*VwriDmzD&)y3)V*7b8{Kye8)8?kPmiG9N^- z{Rv=1$1_*Xly85;MyCu)=$O@!MpiW*ER^Kp(`u66h;5xCsBPb9WZ1n~Tr2cVsMpTX z(8YpPq^v~6wr4g3bsCd{c1<&Y#+4Fe&jVM7X3;|jN3+q(-I(Ahkhd(-!hDIw)zjQA zLvzIFDA7sKzNgfpDXU1PEkGg-sxIE|ta%}jF?8`CfvLw*^}CcX#M^R`vlr4|OO~A^ zvY0Lm=oMk6E?s~7Z!8HcX1))=qd3rtNalap88~7 zjaV2xIQn3>9BFp}0C+6one4eni-`fTtaCF+F3#t7m^wO1|E^sH>9AiKXp@^7k>#<~H zKqpRQcho0)-59=iXL?HL&ud~n;{)`M&vo3gwT|2DEpP6%JNk7zjNiDazgk)1Zv!k} zGqt=+NJdMFN~{J%4?A>wZ>|aWyj`l%RHiE$by{yaSAJGlaAm{S9Fnc|9_CTTn#xEvii~vBfR+`3Ajy^kGzRGM*zkC^9;M`aU0D9IH%q zW`>;K%I}fKE(N8EVOSx>N*7%BLJ%9ps1|U83Gbam=y?HJ* zbN>gr6bg6eDW-9T-CnK?@WJUPu~|O6m_2+ctTG+n)ijUWC+mGWtzSQgD(z%5o}7Cj z$>>LtFCDzXF_E5`hQZOHZiftoz1-)QNeJ^qWC?36bW{a#z?;Wk` zFpuLMw;%z_*wPT%xK23nY{TLKW@Ye9BLeE-x1Lh{tC4xRB4cR_qqr1FZOBs-qu+u7 zDoXh7CWL5EO3D2agLf2?%n~mpu8jYLq1B>cmHo-2w#5eqP+S{}<=3H>>T40P6b*a` zU1FPZiE8+E*-o0WTD5T#0|9GY%bqd+Ji)FQ=TYJLDB^}!6>YEc*q7~C!QyEjCwDK7F1(ug{Pw$u{*i}jCyv`Ye#0n3Fz5~#@ z5g3?gaF+Lq!W?KpfnXdz=?8fr|sJ=PFbPc z_*5b*>UcF7R`HZzg1O^mlFqiSw8gLQWIsOM&UFW$sL6&Bga(p;{bAhf*70<}T(O^J z67P{UnI&j!KFfK7tcN0;?}{qb{fxuyW^x^$$tglwYx2cc&PnD17-DybZ17m2YNJvW z4lIAad3$ab9j^nHUbk<_sLcs}db(|Jd{rH1`>!Rb|Bj?#5w@XhYc^a`u8B^GlbNrd zA1OI`wi+cVS#Wf0Df(0xK(a|0VyL_)8(bn^MvGxh>y+(@2@~7U*h5*wL1+G$Ipm9P77K3`KprmT^6}n+T~dP-6{h&omJ+XW72XPKj}L zO`?w~?y2C6n~)_loepM*Vl2;)P{hI$oOB+Z-j-;D6t6Kh^w{sZ;1H9rsi;PK>>1|O zd3plp;MLK-{mC^*!(wa(OL)vLZ50J??{Kf?LJN+E>X+Ueh_GtV|Tl57R| zuZc<3SavS&Ad3y`)y{#@kJo>8uxRzdX`hv-`TWi@y)Jzyy+^fiF4yiBJ};JlZFJCw z^xn!eOkBAyPK&(fR3T1#*!>_;`Ia7b&zQ-@f$Gyo4k-qgs~qq(yGC>fX9gND3%^9 zh$->qbQLrPcriVH_;9Ls54}o|{2Ca+KZjJu9HkNVHBvcDzMSm8IDjA+2LN2uH^QQF zhHvC~tg&Y3q2(J{rvDECw-YSuhLTF{O72AlSXe`Wzknm|jtUf1G(PzzG=cO+uU+Uj zEB!DGxdZqOpyGkl~>wElgiI3S!ex)=jrX1B2hB z`b(gTBGriat2BSTK6>Dtnh(m~{WM8MJD2D6zih@FgV!FSED>NKdIZ#PK`?TC~?R>=!($7L?H9Rx$MjObRf#_ zedEu-NDl^P=o;nybHC)=AC!S_JdyUlN%#k;cnOli$RfG23dMgG7!}`xf~1-C#{S7Q z|HXvC+HX~&Qk$gyy2eSKdr`a-^Uq@IMu#c;>biz) z&i@!66|8?aC@K!H+4%Pi_~l|X0HzN|wk1%7|1rK754ws#%k@9RbMyhG5|_|1;Qtuk z3lv!Y{JdjR{)c!jAH;hDG=uz)@uB#6YG#~h1aV5sHhGR*u$Xq_0{f>7kNmqzo&vd( zR_o~r{;hn!3z%P>RE{$66X@T20YDIPV>UL$nop>QqMol^y41Tk`fK{RF0Qdr^@Gbu zfB*5{PsbQ;RZ}-8F^&-=&fsQxJw=f0v-JeBXn|odwc3 z!d#9>`$xHx%k3e>n0Xbv*WQhZc`cejR*0r|z#}Bcaqiw5;+wf00pn_!Pf9e-M z^@Gr2fK&#F5D4VsYy|)g4laZ)AdRu*>ebeW)#vhXp0Jb#2ae+JQvcLT7)6Z)x61ic zQQ*-}X_5!BVw2ef6BG1UTYIi0bFdrNmMc*f+Pgk#TXk)5%;O#KG}&?KwU1gSC!~?@cG<)@#it;ka0> zz9B~Qb@#qdkN;;KwvqP4m4b@Ioj)zQ)AZrmhpILd11KmKHp&g0F004siT3825Tlvk zGe|rx5qPdo+Ruo%%0H;TuHGI&I6OS8-@7nLZ9iP5jDQh&mOQR{qg$iwu4igrgE{VYB6dz!b@vb%Uc+{J&7azm_wJCnVD%bibxBiKVsbA^r3D4<=IQx}J8y{+mJ%lh4&S=K_$!U>6@I$p;%MZW z_1mk{(Kt!^>1t8y-l>DrPI5q`! zo$vlE5#bl7;76rsC^Bd=OSX?(>5=qy^G&ZaCy`8`Gdbr^qN2PHmojI1Ps2xrUc$M`9P0M4iSQm-a{V9R$QU05JV$94O; z>F!X}9__HglBjoGVinlL`|q4MWdR7h~h;4>y^~Sy}>YEuTqS3f8hZ z#@Ai0I|wq~>~q-d&9r~2d^w!Ayc)05)+*pLkYOO2cdGV_QzVyjK#tkQm$H0Z`>j1o zuNeXYe+OQ5pqqv&<1Ms_>@ZU^}igQ?(T{9KYtUMocKARE;#OHhPd(mTJEOWC3D!= z%;C<_S-5myi3nbl*>LI3IZLq*rZZ#-a%TL^M+l1OHWWW zz;{<8L?_+9t-Ct;QKrwddPS2YHTM=e>KSZO39L2xm+7N2g^P@goM`bNp;0aj$<7vn z(b71lFDeKbwbWI_X)axp1l1Wzd`lex&zf0}N$@pBwll`dKi=kDF_&6xZhi{#I}X(z zR&tilW^BG71Yey9>`qmuJjWx#@nf}^=Abuu{EHI7O19)62o%spig6n2V*<6a()X$` zz$&+g3@abVa7=5?S1ZT5yLA-yLXn#0y~o15J|oR`WZbz}(`-vc6HTAmt(Zrj|Fkzq zDXZUWX0`AQGHVU87v3eF9bAQ)EUfK@zB$Izy&j)`{f4x>~1`~rs{e{;7sW47+y z1fK=x^WHDP7^BAH;e6Z9RdxHsT9%uylYHjm?$Fm6h(;|z3id};nDu^jKUmOrA>oy- zNtIVm2sxp|OUCP4OaAE+r*Eq|Q4dZF^OM|Jk9o;y@ft>|UJ$Z3k1>gyJDjIW`|wVb zIkJxJB=Y?W(c!0-|4Zc@?sa9!W%#TqYYro4fPhm1Yf=HE1vhPOk&L%s~%6EBzl8U zV^}~;A+BEgv*A{z?)oZoH(^lhbKU1A#d}W^Ka`D&5$yb_dYq|HBA@7@`|pFo!Gp#p zRCV;rD60KJ&T@jt6o% zYM+9T4)Mqaw(hP+oQlfTp?0J4`terPrmVN@T$>Yi5jL*Dt=+qdRrd0*NxWIeQuy9s zj9l^V%V(dDxo!E0h0+%}Zzd`{9=mHCkQ2Yu$L)t$fCI1`qRI`Ib0A$RE&u8g_k8_bMdFLjW zSJ~{Gmfl^A7v|_7cl*i0=hm~$JW@qJhaE?#)t*@Id%g19#*gq4bGO~t1Q#@dYUywtyvlP+#0m&Z@r@`?7*5!0t=$kh*y%u*$~rrFLZ8M zPzcWZ%FC-vm0R$x>|YjjCcU?3f1WmF_~tDUkBw6NsLcYg<3g+ZPuO0isJK5xub&gW zwO)ALQ}6VfdA)lGYCOi1X&+VudI`RfJKlnPxoWQSXz5F0Tk4ZC!gM{$lt8UClF9wX zZ4B=_Vo$>$9soW6|9OsOFlkQe2F1`OjcVd z3-d=K_)3{&nH%);@8<`*pu&5I@Pd1O3O{%){zdEqWRwb!8MBC#w3Kf{8p)NrD}Xmb zeoeEf9+a@%|K6xzg-Y3C@SA*1A9KNl>`{gIr@kkjrblQ!qkkmWs+H{-D4i7fZ^zIA ztGm(49L}HZ@HLB|3L?Dq-6JFVRKMSxLQ=jvWZ015*Je>cu53u6#Qpxg5*~>n8L%g= zgid)iUAbt?WxS3u)d`EI-tl{dk>oqO{7KW^TrwCQ`Olp1MtFz}mzZoL9|90LH+Y({ z(s0{p$5u*q{5^FwXkFcxdvS@NFonm>Pb?^QunFNoU`d5TckY{8(B*+1*ix~Jy&PLU zWGC~^&hc1KX~#K9&yiRiBAhHR&K(MKYIf=u?QdA^L$E>dl43!uGR)wh?Id#KC87n* z(cGD7W`5{^Rz--OVnT4Vu6?hY@=mdVo}P^6sPf?#!4KPd<9#VG(5;~Vi_3@s!!a0n z1Oopr8uJub2tnxpUmTFOwY7cB_z<=l8y9D+M19atQHwUNKQJ_C0CH=GZEE8v;{kEs z#7QcL+Zq{L*W|l~!)!Qzy)^-ngzh|}{B#|!vpiF?t9HL9B&jaW6QMgp*|+P}W(M2B z95pIxd9W^Q($D&KP8~z<(_LcMmzklE(;pBU%5RPa*BLqN*dTuB$YhYTvJxSMc<`7< zuA^VH=c35gj5$)K^4p_=9vxr!i)QOfb`^_zG)Xq&8Zzc7_G?17V~n3^eDmt%ednjA z@?PJfD~rDi{>Lu7_NsUYdW^2GZ0sK%kM0NEo;c~xp`q0)7IRhdB(T&kA~6lIymoZS za;ya-R$D`7_BpBdP`621?F*HC^XCZ`hVZp!0U{p)78Z(ItPStrb}b#J`FiX@ei0bH zC-sl7O>PQws$(VN+GG{v%R|>DJqimM&h|hd@=+*f&_Lm$h>R6>Lu(sq{o( zSvP`GimVsfIO%l*g@=dV7;hc*^;(XNDJGrw4|Da3=Zcq9YITI!sdm&eZhj8)miglR9ABZ0Fs1O2e;9uKFgdS|NF>)-jGpjl2EDM6{xFB6qF zQnXO7`#m2yIeB==WXOZ2AIUs0Klz$m`ylTl-lN#KLu7GP8Hr2znaktuUizo*qeUDc z<1w>GSPWWYE)gceom_23-`eot3I(2S>!IH60Ot*+u zkC-}``?*7@s(a?~y1jqOC%!Y_q~PY!ZW!jdIrtdzlB-Xi>EV!5Jy&1}S(X zhf7O|+62MV(SKJBmxL8J{lIzrP6?#ifzzByfm2CgB2E2vH3Zu%)&frd)M0Z7FrqN_ zv2WB+QeBYvSGYbjb0z%ee*eDl zk!bo)Bq=Q0z<)JnBk4I$1O;?l{W_3`>xeJ>UoaEM)7k#D@Ny;YQ45!iWXS2C^w(?V zhn7LLbwBaqIbgq=#9nX|Jq!7hbM}Om6t zy=>^;uHtEfs$`|5zg|#^E^Q1J&t7F_G8n9-wJer{&KDZ2_&PQfDT55^2_HBPSknYp z-UBYD^vs1iEnYRoL4kqgE3r8~t4Yo6E1%w2AGEpjRGh&;G%Wn{gN0IUh>8Jvletz( z>h%ow_Fc9YMu+f{S{xXv?3)JTkvN?9{$XzpS4un<>c<=>Mk@I(PljdRIt}puFwu_w z>>>4=>dI+6fEIdH8iP~@2FS;uDnA<&RYy>Dm5#Xiq#treoUUe8t+-8rFm3V^J54L`!T;5Han& zR?v?hJsV?9c!D1Y3K0_x)Q;y-=&oIpP!=?aN;Dk#_fsuEOG5aj4V`WJp!ZJ7B>idU%`@)XO5$@3l2Or)J=Mb<65`_J&8+L^Eine2 z!#RyJPMSlZs)2=Ulw69&KrWf*#A0!Kvj#>c3UM+F1q5L)k@L#RtT%_+k3BXv5RXXU zF%CE$#{xNR*Fr*Gx(3QNrO=g9X;Q|+J@GaY+wZcxRgsG^YczrgYTqn8E87KFcT?bcxISB|m& z6uJ@>2ys2zmt_(WB8tBzzJQh^nahgr@Ttk9@NU*a97gz*Qk}0boi`$NB>4H$r&*q3 z@Tc3On9r1HGchx-E(Hg?%z6bjd;ICtzcCV-*>HIdfyrZaf3>FTetpX@k3HM=+6n4% z@&sb*(pi^hN?=AFJp%43Fbn16jZOE&*c=8cjjkGBrn=8QlTW)mUhl#VzXuxkr_z^~ zgL;q5iM=1eA-(qe*FXLb2x4zX6=eWPN<-p+_z}ld_cC6H2~NG5T|gKoR4L7s6W?fb z&7@JJ(RLjY<#AOtZGnvZWYvFvmSS9n=#2s6m)GMmE%G8E_}es!Dk>Cw*PF8)iPAnR zW7B&MDJF=I;WbKI&vrEdfYr}1hbDJ*vb%1J5oy5?)e~?pCu^l>_O^f}PJ~=)eD@hz zSWIS=;t&UCbDu*eK^J+fl19@q-<1XE`<0fW$>gzC0-Gbme6B)V;Pasq6PnAOkRDh%^UL);DeG--$)(RS<@QPxCrADLspWW(giO!b6G@}-MVu?Qj=+6~_zeP_|1^@Ewf{`M03n?2CY4TWEqPjFS=bLZsl?m92 z2NfrquWTYkl|7DoM?p0e3bp$+xp4=Sn2rEfcJhPT9mJEo)=TaLosu`uw{ z&~%?FafK7}>%k@@wO8_v`E2UalKy19QRQ}}^RP&osfm$+xlK=O3wF{)7h+H9Se{bF zN2eAu0Kg!?t?GvDXe=}B$J8vz%ke&$NJRu?G6{>p$k`kVwN)_%@V5(D<2?cO`o+=; z)9dT2k-_AqE2r5#XJz4&+N;Nc2DN2nZ?)RPQn&~-an9fTpJqOcb6^EdDzb>O+>D6A z04=wGz~*!Vz>?TC+}pozF2l%8rm*L60CGNA+?P~Rs!HuvX=;9T&(E<=LWfPMWkDXN z(lx58+|27bb3uDTuql)LBhKS~TUu+>_b^tR&OSZ2>-K1qW0d48FC0=8nU^F3(fV-7 z?cuZYNHH3YleXQox@za6AFiRbJ+l@e+7jb$xTZxNhOJ_Xw5hgNNWtt(Ad%Bymlnrb z%%fl~+%a~Ky}r`eVfet0}efQL>?I-M5Fbj9tFS*aV7zbFyECX9&l- ztUTIBQ8X)wlb4+>1_aJHn@RQ_HNGT5*>W#ROvG~BBb%prWbfW*hH%wz1-C#+7M8-+ ze5^%BPaWBsp6*i8o1NQ?Ml>Qkcdr}xjF<_iS|mcLjIT%~C@9!}{{Pr}%dn`{ux(fo zR74CAkVatW5R^`X?(R@PVCWb+b%RnOInqcoba#k^fOI#~%+SpM!@I_0KhN{y`}-Zo z{x`?KtaYzDt~k&0y4L;t2R@?Y7)1$i3ajwg#0Nz})q{4XyYXyn+3_h8f(jOO3fUf4 zrbvWf?cWPKjd;9`PwUraQmEjeW?W?)%*-;#y;Y;!wvplnLY;eW-u_*gkJ>(WWtSa8 z-Bfgk%+le|LD#Zu3k9ivC|XM0Qk_wKnZr-Bdosl7>W)W5;3=L+x@v1Bo4510c5Jtt z0MqMx6+6vjojaqxj{f^6CC=SqdL6;4G?Gu^#Rpu3MjDjdf9&&R%x^5Bud}r`vuOLt zjBdmuRjuYFG}wx@A@ZOo7~!cG{L?$w%dVYun^W34hh^)XzS@FdF}I1wosV3vqj!)t z=GFab-NCoGe{KF{OhF>5&#GOrA@a)DATBKH(<~}alhc)sP1t_)9@l()wLT&hu*2-)H}2IWJ)(-YA7*s#KkW@XQPluQI~LlS1>WT%6T7v&$`<8uYCp zwttuU&!I>7_Rnc)!_Lro+5r=6ZSG{Tk^XBly$C&trPf zeZFT_nwC51aPw{6o5-uOho|BjfD25zquAhF_~6gzemvV_`9@QeIRT;NBRtveR&!e( z;CS!@*Ojms>*(xUFmtP3SXv7F^8LfdkD9BK=`t4PUL|F_WucqlK_|Mb^H*oa(|R2F z$%|j~U~C`W{t$*e!ZlX1b|OM}vR#J9yJJ`62RVQ{#2;rX*B_f`BwT*BNz`y~rrS0> zY8Sm2G=GF7Q5$Qj2{3qj*?KvyIM4d_+)rN(%*@u4%SloX#ry;AMR8l+i@1HjEcf)1 zuiJG@tiY@p0qxFcds?w_fC{ChJ%vQ5D8GM~l$4~)WdZ{<(B*{wbT+0++l=kZ9o9R` zWbLDD%oS%UBJ>&aqN{`T=K8$fS-J@rMQC2K@4CfVej=w$o(Y*_>A2?(=L`$PD-d}$ z;yD{ZvX3lN$OzPPVwwSO$-jyqa6AL~%v$J`QO5*e-uE z;jB8V8@A9e{CEVZQH^(%V8WM`>&0lus>geLjB6K7AbHHAu(FJ`*N}>x_&nspXhsSf2>HBG*? zfWQZ}=ovbs>qI!y;W2q<6B}6{Za27ThniIzbx@{RX-Y71iC^(7hVx1FNaMX7u#QL2 zme8T3`AdU1P?JniJcN@pSKQ^%KE1c4!fq2otHvUK(sMlruP@_`u=mQ*tJU#ON%x?H zUr~DyPFLeD%z@C2Djj=!`-Q$FVLE(zdB>sUkc1uFo*>qTx)}av&1wnr&DPnYXZe^U zDpQv0bLlTf1m?bunFo7u`rkjnddHellVxsOo{S9r$gFehu)XOSa&-7HEoolzT%75a zC*2c#{X0c!^*2Yts-&0>y14u~hystU1$bB3&CS?EE7e0lVS41BZ~Z`Jd)#xRJOn2U#9%3)q1YM3|adU1@wTI1CPP#2_ zLhPl~&bsH`hEV>qAo+BS*PLits+^WR{C2bu>+K%59!a08GSAIQEvFiqB_EzOGUy$f zj`<5EN&1BGW=pdz#>;bwBM4=leoI$2lWm_UT=qr^2tMv$MXpa&ta4SzCkZb)O-EcQ zqYE#Yl$^x$tC`9O7kh6sLo%=&oCLp56E?VXWE~rqXSL`kRMr}909BeBDbM7^>2Jvo zegkf)~@d^#iK9%i`Xw3)Ne zuME029H(>t3tNC*(DX8F~PV3E&phvAjZ211uj3Ww1>G6#15#J`?RDWB! zJR;*)G~HKU+ToX7B2PhBmOrrNHB#9$>AJ;SmvrAbW^dCqW?DmKse9_`ZDQ&x*KS3Y zhgtR1scsrIP~g+rHXEhj@ec8ve`MbKbhZNT7-%(PZOcAutrowcM-zm>ewK$xJ5A@M z*G57UXpPq(|D{>$C2dVGR!3dg*kRW|YU*Igsk=VwWg0K0a&97Gsf<_(BDYt1R&~9e zx)Oiv&YkV{yRwcf=-nbZg`twEPvd$VMf0)0Um3(AsCyNcME4L^cUzN+4-!(J2}I{c zBsvBoXKnIp11AWl9{m06`gQ(VU4Dr+nU`xWTE!b&W0i;at3;2~hc}Nk6->y~SwEMu zTjiBvn=^x(!;x8ia_-9YVMSMlN()OSCTtqq4;nk&%eUCvU~ykuzQjwf@pAGYTvxp~ zpf!mLy!G;Htr!z-n2|;5krp`&P9bjg2^O>RYE3Z9<7c?Jz7xN*oy(ZD4@6(LlLij@ z0-ixrQZ%n6O<1qmF$^oogXQgQa@x-eizu8M*TaN`S|$6#qFVRL6pS6u5&QUqUuny- zxu8wYrX(=^DguT_EL*FeUU8HEK;Fs#s;gHX=NH0Y;w=oR*Eg0W>J)K!x_SOxNoXUQVv5JEg*f?Bh5yviiDd22{$>=QAP-)=XV8--U^`d2=KAS*<(A39bLYe~_ zgLgFUaU5I&(_2Gf;M%V4Y=k;Z`XoG z4ZojvU$3B;`_ z9q);^gf#l5-fFCz-NhaV;fm)+oXO7f!B6##76y~`O(pIKollbSndCM&?#fksE&TpP z58`6c#{Mcr{vn@o{XJ8!z@nwT`x-;wz3?!paGxj6i2V=HYnIMW}(g(f0oVD#3!#V4^myU{I1vXf@O03>p0WFv!LMW_tjGyl+IBcui>St zmd7P*%Pik|7uVV;)uJCwvt&*SW)jizbZ2SqZC3>_RcQ15%FfXqU)2XQBJ*V=`Yh%$ z8PZ-FjGI>{4M;DW$q$pI=^M<~iv+^nK^QBi)nxf5olo|DSVpM3tO7)5Z@qKQCb+fg z47MDcrbL=x=(aoHZZbX6BR!l=)5_&taiGcy7pgpr%HO^9REmisNEM7{i|G#jUfm zZNRk3YW;yudhp~P;@-EVT*_B5z-{shya?`V8I3vQVBz^({;1|D5WvnVyvXn)p z{g0ikf)-N9OqAn#o782K7;PI4>dX!NdqA)~Ok>+Csk$j6e-LvuXNJgmWAedm;9XKIddRAt(jfmo5yN#V zLo8qQx~nP<&b`rjI*Tsi84F8^KobJRD$B|AV&hdJ`<~n0$^Gp^-WlVae zOH%JrxSvY7ZlO+$o3~#4I@poX(H#d?IxRgthk)Y13O-hnd5@5wukT+=6O2)RSb)R+ zJ#Si(?z<tO=RC&%5doUQA+LZ zVS|*5OJ%N3!{_zHG$HqeqwV>fAbJWYUxT|k3e{?`xX`Yv_X>56qJMjfGCE0kr*J}u z484SiVK3%SR^yV(Yw7z~~ zB#FwhYTZCak8O_q+akJlq9CHGgn8hg011*?&H{4ZB3w1@jNgVZLPpc9HH zL(s{^(mGE=pwGq14#y7qA70o!-_X0q?Vw5JwjUxKOdC;A?%S#`HdGGYCt+k@_<)t< zxui5?;IW-fdy4`*sl!lG@BHQ_xA^15<>gL=US_^rM^PM0mJ3V1j9ka0xGA?!5} z*s_+?S3S9kOPaqK=dnnD3~>a9O~8W=ktZ4yIoVE@0HWfC)ju$>7st?m+>r@U)b$Ye zX6F#+zD4d<HdieK#ps>q3L)^2Y5(e+)uFjcbbhL47qIL_t-85tSz zh=`UU-%{S_A#zpZ0#s6?2EV4m7Q&fyt5C|msC+M07L-c@L~rG(om2qkHLNO-AH2Hl zyRD>ZTX(VL>N2PObCZ|ZwY8H+*q(m>`1=n-NSE)5Ci`M!uM*=;q?!U}HW3*HG}zbyJ552}xn=YxRYg{oWO&43M{vv|#7)Kt z$>E$lm1TKI^!LBO`Ol}jSLIL(%V-RtR6CBYg!Rd)Nu~1@5UdCc?!zqL&y6y^Cg5Yd z1#CR^WrJ91Q|e(l?8Q$>f($_o?kY(>s4Se>p=9eX%-wbTr`mJK;|u@^#h$bT55>yH~6E$2gG z(C4qY?Jz7WD@*&zsAa8`f|bb0@jNXQOfYwGg>doFUfSntT#I?nU5PPY|5ak=;~#EX z#BA$q@*Ucm&64{nrHUIArhNY*@%3cWn<}-fvOogznUwKgfY>sD*%WrhJJObhuCz^Y zj^nO5>GPAWN5!tYuVVPuNdWztdGWF$$Aue(5Kw&{)O@mm4(eH`6*V=f z1e`ar?pkGb>v>RrcH}(&$V+xWvc9_%Fd|Yf6EB~Mc@?uW5oj5>Snl01JFU@CT6Eie zm!mo#NWhQhg4h=V=)E5tPB}M>ATpm`Fg3M|K+qT$JLm^YsHW&_xJ;YW;f4^)o$TYM zWTOt@!K5B>rMR06AQP;eVbj~~-OoCWPd`l1rpR3@xSES63l0hh*ap|BUT}S)D%T5v zH|k_5)1x0pGzf=f<}|vN^N^eGL;YuhAQH$P{B&&R^kk$x3FV&3GI4r)K32uxya(D4 zd06k#q^7=ZoFJHs81+1|@I=MRPz<$$Ab0TYJpfYa!DWSobi^j?ycUJD;B;t(q|}pE zkFCoIkmP)_v!lE)eP!4H?<42u0F1!rHVztw5l$4*AY@0$_7C)X6sIQ@c*}8v*dvwB zOr?`3QX!;jDdyi}MWm9w3uW)SWjY3IFvmrRM5NKotRSWY=sJqxjrr`5x$Vfb(2y`` zKfD>w=XvrH4hJi{Q~b1*dI|~(0|R$MDIf}hRRqp-}26VA>5az zDz@CRQ>1x@U34R1J0qB!SH?Q-)EkeWPmFtAFRL?Hx>n!2U}jh3Y~7LH*c-{e>ZJ6V zB5whQcmYu&^1R=s}F)5PPUft|*)!*zMypEusgb^8tJWVZ%+R>kLRV`Y0dN!3BPMDV6fNJYQe zSAdd+1y`t=+uiyS`VRTnSS6?^Gc!{rEbP)+?|15=F-zQR zfAxYMD$8IUw6sl6G2%fjwM1^}Pa!f$BNZk#bQTrTW><^}N$S(#$r^!+X4Q&UDwg zW_t9^>PXj}{TLDNM8WN&9+QK$F+7W4ej~I&_%*1;Zy2;6zfB4>qYuU7Pol1_Rarby ze*V=8o8Tr1Zr7pT)b8LOciGhlZ6ovNO^#=}QFoY__&^D%^N3)YX-T^5w0=1GdD!G> zDrfEtm$eB_cl-xuA`w{T_>||m1s>UG>$=;}XFvyKvKuYOY2Pdv1DPK)cT*cd>J`@1+deO_v8~G0cM$7l)|)~(Vp3q6r>|1 z$FI#Y==C_}tc5(Sj-xAdgPcM)yx-i5Z;v`>^A>+^Y&o#3v3Vp~KfcFPk#)6AVHh}} z_KxQrkeI>xSpCC;l(*@*DbLw91mq6V^P=)jpeqXcFUpzb#((j(knRC;u4-AUgTNaK zHtB*Fj%^nkI>Vq}_C;Hc&g+rUk+Oq>t$ z(zD-V#I-CnV+wcOp$rkvGc2c!Q=9`-WF@$D#OK(f>9^mD`S6oZm$@Zfa3^aTP~sO5 z6yzY#b{QCOFWIm7Nyb4C)@^zZ8ad?JHGpGcVxp|5NCgkE2jkN1PmObP;jK2WI@Y;3 zoqV-+tJZI*Jwy&>mr%j}e7N1Vm^5DJ;)rCpf zzY9=tl%Nh^N^%Ic$}m-O*1x(v)~)ljw&@_zsyU&t<6YYs?V=>c=G|nQ)eC(%8JLxH znVh%Kpg7n(1Ss$b>rT+&9$O_OyY|~>0vl5m-!M>@>!#BW^Q2uMsy%G2RdyzXeLEyP z1}Zc**A5!O2gCFL!hA1t|KKL;U!=G2^(AaN<~=-)A3W{js>Wn}Xb|#W6q(O5MxMs3Ks-KQ6R z@ca6eg@CKaAyvZo{l%YO0ojruMy=S!uOE6S&F-zLgeNAl`C(z` z2@WbpRE ziKun(G_1jx3|G$PM(UFgqoe}e#U6HK1_r52Ixalhh=-y{&c-(Q%Q5jJCZ{z9ba;yE z=eQD8k$FhJyGALPH|sOSUH`^?d0NTlDDLrCF>?W6D;U1~p{OX&({cRA*Vk7(g;5UU z^h%n+)7Js1a@{!}zHQ{Wf0)rDwjo0m7W<|U>p+hVKc3Gp7c(P7b-&yiw zf?;-#=zlMZuR0x&-$p@ryTky%gIQ5upKhYUDr#%%dKI|i9`^O?_aOPTwJG~4nw5*t z+vlHxrQ@?Bv?y86L)LhYqJjZ%xin~NgCUg;bmJy|gEchp(Wa!y>uhX_C88mX*K`dJ zx{EOw&zG>zYJE`7l|qcRYXy6DE#(dG0M1KqI`7hjtxR-}>a*h$>Ko{Iu>OIq;klR4 z_+r1^yraET8PmgulHMMveoGd9Q%Vmgz4lAxF{U^cZ})TOrbd#a`U-39$ETTs0=}5@ zbVI_m@V!Cg<1Lb|V%fDtvlPTY0F;HPJXC&xty9a?oq=_Ke1B!p7{$S-61yC2i0l(` zmXVi#FNhpyGoEV(giWopsz_6`U$MEWXKb3OqGZ2DH!R;mEAfzMg&&s5fAbeR22<)y_pF7w5fNQ}&s zy*WXO0UU0`=Ba((a#6=V9 z#oh+Rj)>_g&4n68AUI5G`bf=#D#jL`*oZd!D9u(^w(^9Lp(AQcML#m1oCzQ3-Dn+I z+hj>Buq7Vz(6Rg$YsLVTlFB5f!)@v16>mSvRf9C52*ktGc})VrDJ++d8BG0q*57+a^Z$I$hI}#%q;+_ho8oW;dzgPMF#o6XUt znw4zpTl2UMOrKR_cnd3DnX6dN# za6D}6>;wJ-7={OrB-K}!UCks4Bihxk(nWDhjnpN3hA9Qm!uX|WFB%c_~g!Y2w4nnjr& z59E#3=}-F9T9Fc;Q!)m#4(o+nf%;o^Yku}!uHGl0Pe@@Jp;Hd>&RMmESi!Aq;d!=T zcs!H9tHwh(6RgKHNxE+)6X(%X$N!}8rt)3q8!u9L93ZRU9BnSQ_OG;3jmb6pZj$iV z+HbRmSu5>tB$e=HE}0mO$Ca#D)(k!ttdPq)SB>3t^Z%jT{Ozt|<&y2|pO*-|zxIQ* zD2){L@Sr?f0eVe!6d6gFY$npSKO#ik3VqkBQmDyBipvAfdZ|yyJ|Mk6G`>*gKe)$q<|zxmv2s@A2fcp{>s<)$?_!P>{-Lcd`ta|COs37M)^BC z2#KzrKx#)NZ(3#RCbfS=E|0wM$ugE#Bh~c_N$|Ps9N;;ldnV4Cs)XmbXs~Z`u0N3W z@=zrG<+4cd#LclR7rR9M71$RMr{Z@-*QOooSlW1~3VG3ZW%NuO_B;}oN|4)9i@F^w{}9hCLHDruZ%(6Ffez3i2Hb4~`_k(` z-&hCCXZHXj0K-%sctl$+0VT9@u#<`zNh%O$!@|Ur*8Ip(_byKivpaGjAhw^7c(_k9 zlo2L=6AcK2D!Og?JA>wG_G7^Jikq;F7NTR38RFDK(V8$D{CM${uY|8o8_Z~7;HhB0 z`UEjzWVrl|Y@UvyzZ~4-xJ%wAU~Vu4nuY%;k!&^Lw1k}zCEib$mY3C2HL;CT z4TzVJxQ=MKckA)Bs*st?((2a)vFK%#AkpSQsP&Bazn;{!vgjGyB z9^2HaG7tUnaKNLNqHV@7bo}Q9wj>Q(E8B#a6kh!H0>GyFMy1&H^y;hYA@_gBa~GrL zTq*z)x>5H$_^;#q{mCZ)Ftjn14%h!B7W{dUf9C}kMg(|YIzq!R8+_+mpMFf$puucN z14>L4Dk|lj9we9e9p+^vL;+Mhy2lNe-8<%ip=XQv*Rz?3;N*AwGQAl9a0a6R?PoK;lOMQmfmnt1W z6O;7f*@$zg3hSwn7Z}VqQ9{il_B3{!mL7F=-r3FQvpz_XM1~f z%0JDh>FnO;WuweYviER5U6`lY6X0GR4WZ^}`>&YO`03d-5H0O!;OwLm zC~wUr5w^Q{4=Dith+gAqfR?I z?csw`_~KHMzb6@(?xSd6f@a_f+UP?yC}X%eEmW0durPyzK4(Lk4F<5r2+O28KfZdh+9fN>i5lu_=^^wyuFl2ovh}r9|m~oW} z4|nQJtUKAeCmP`|rFrq@k-*K9;PNEso9k-MHlohv9Qo4?o;La6=oB_5rqRYcUfto3 zkg=)X*5Gqm`v^!C1A{5OW3Y52zh1b`M+F~7`y~WEH9EA5Rh@10JwwO6Q#FTX{mZ4Q zi(qNp!Xg(}y$PUg<)X;BtHA+iGbiUdz=T|QmS@0BQoL3|qa%gIjoB)I-Z<^K+upk( z`$zELx}UTFNqfl#B)Yx3dw7H&vY~29%ywY`eSAy-HTLeepnhOzKIvG%$}MEX*_1hw z!f&8{VE;ty{m@K(p|atZK!ek8bCy$be0-XL47r@Ln->l|Fs}~4SQ6vxuAz^E4>s1T z8Q087*AYED${7h&>b!ER-6c8XUXK^5l0)u;2!_R@IkGf7k>w2(YEK^`HZW7p%|k zXtW0STP;G$>cTqyKKnWN0Q?QFj=y?grvvBr$A3-}0Jdb)?Ke-LkN@thwdou^zmrJ{)fs z{S*Pm4>IiJ^h5?8MQz_{={KW*3K5x1`2^$fQj0X53Tujy&$zz^Z76iP2Q~bn?%?hZ z^uCb~gO6{l7$^tebD8ytghG=XhN|E0)_bX=YEEP5tQr9aV7&kS{3`%;MgkGF)QjzG zI?o?uz|K;fjU+&f123F-yjnt{a(wE#3!wHC(0SrE5H)AYv>Ib457DH~=1vIfXfH46 z$s}^x;6ntxd$bj_Yj^l-pC02}p#a=HCr8)VI1OEkOW`srtW~||FmjCC7`5cawi*zR zX3=MvsdCgN3FUs2tGg@qMVm+};as^D2Xn6S3{QI7IseLQp;mmYJM@Nj@YVsmqI z-zey|9{^bTZwU?Sc=22~XMxapi674M5XI{^ZuA2pUWvx9N~!6lJ^K3Y;xcM`6$;)g zfN*G|0hLFG^F2M(I(jD%5BtXTsQ#TtNIrB9(R$QYhmz&G0pj>nAh^B2zEFR%ap-n7 zox61~VH4HpBYM2tfLd27!x=f13RfBVieKS9*XN1LItfewQcz)|Q?4tzrKfA40`sk( zq`6YSXmFoI#6}X+)U_5@<*4m*Um&}oU~rz~&`CUPVHc{dfEAMXJ+^`m?Ho*OcBFN( z7x1t59iD8S>3E$XOpPZF68g)nbV4`M(H0xM;WW{PWf<{@`iFU?{SX_Q5+M_Cb`8*f zyn(zn|4dKWxuGZEN&R_{>fUXeSgvhiH1vLSf+gu!Cp)cm`fg25k5wbMQljZus$lN= zX^YxxDJu>Rj%9YU*Ev|n$DDg}FX-MaoId!-*PYD$nRCt^Dm{aJ1w_Rldcy%{A;NST z3fc5#`F?1#IcxB;N4D+2uYEpoD0frv8H*#4t8RnGg7fpauLv&LWh6rDbxL9Us4 z`bAQ$SMdP)Wg1+G9sOWiqdiL8Ub30){CEdCXFG0k5J{vP+QILtDXe<{ydEdi*swqf zP_rf@w0*okG&_z>B4P9&^}Wxyv<`+e>;W0YPDGO6LUmgNdCk;@lwC#f>X=lq z%X$*1fI()Eq3lDlEiuoLI&s*;sl0feIaLC6)yIPBkn{6;SD->}iUI64JbTp6X%czz zE-#8%ql1~fA#G&ucw*-KleKy8a3ya-@ypH{fHQ%*?ZrxS-df>P$_VisB?!`fglIcN zNmAzU4v{?HpQ2_1GoR5X=@~H#@;~K2TxTL~mq6%<0f=p^wh@mz&562D14lzNDXGZs zG8@rdY(Pb^tF=puHh^MSbHR6U;gnlwR3kX}=2)FORR1O~H+R0+JUH;JcRh-0EV5Qn zd_QSbnvGm?h6*gL{(rDacdDIbBaQgl?dKe0nbY>AC}pIyJ~ca2e&^2&S25SBS%_Od z=f>0QgzRJh%1lJ{xD-G!A!f;hVmHu2=OGa=VkienU$I)um#OTi8{vN@noj~rD#b;Z z(GH^?ob(S@4K0T7;@r6LTrLw12!?c~_JtIs>b|s9tSo4x-CZs}OG4D=c%5gf(3dUe z>qXHG6%08y6xp$H;yIBXvVHh4Yg_g5Xo{25&Ohzdx}$q72_$1!M47V8THS~{lcQ_h z7>OMKC!9(KJnej-7_wRq(bIN(D>Ev6BEKSeWDX>AIFdf#w5dbrvWV(47GB z>RYdkNe--{eg=RuXy7Vk`=O-l1>frQZjntbuOsi~`X7o5@@AFTT6*vL36(k;PkmoS`(F#G2*yoqU_ZBRBGBoKp-&Oqb*gl4D zoijg^)jde$#ajlngZasZNdY zF=E+q#WsurvScmMdVvfp=Txs>M%`W0?p0NC`61O#7~t{_eP_YalTAH@8hX}Shu?8e zXjgNrIL+YKSB+&OEWTz;)A1NKifWa?Nu?xZ&3YfVvgy@Gw!KfFWn`2B-rzur=fB70 zWyNy3r*dY&FT!5%1Y(Q-+c7)?fL1PK00UraeZ_Ie_+1o7I9@c-Cfr0TM_qT)$V8lE z3kFg%dbB)MtnSA=e5PO$+pu$JKe2G`z}3!pYjsjsAK-y}5b@L5!y857oKjQJ`0C-T zd6ju9y9fQ5Ckz!kPkcZ1f6@y^{p0_(8n8=R{`8A-Z= zsrKuI{5VO=O%t27Cba%Pf_k8p$ATaTQNK4C&lmpjBSS$Q3VId9ua>eG>g}QAbuuy2 zz9z7ld-6p0$*)*D>5lDrU!20@0P!C#c92d{@k4<^4v(yw)#b}5{;I*z{g*Jf#p>o) zZlYClb+B8MHoa6{k!qRWRS9XOcE(jQ@=cWaObzT^(QrRQ!jBTz@UR+#tNK*t3%06k z)}GZ52h`q<#{jjkg2xNZ;AZIi`e??COh=Bj1(aQ`kH?p4}>CDu5- zL-%TxA$nX_{EyNp314LfQa^^j&y8$BpmY)Qb$2siyezpPKy*8T3`WMEdYmEb0Y$yh z-2)M6AnGXyP&=z1ELB~vvi;r!&lH-rF^dN;D2KkkLOY=;==m8Y^3JU$8OfCSboVtWue}tO z&h`}P3Q0+H!mIRo%s}?(E+Ghw)HGfka2`nA#9bv2|gsaVfrXS5BZ;rJT4)Oiw zkr5RI*$&_m;()ZtQ%50C{!Z{pOH%=fXAH?94kX8Q|FQNvDobKDqDyu9Bj?w9R zKs}1#t_iX#hmabECmkI@7OLMvc-7L$`5iy#)i{w9q!!%qK1ZGpJry$WZl*(L3T>Gg z9PcUZ<8*Ra$un;(x#K5szC2B!&GgI>fyW1yA=QPt;U`0#gJnrjS7|`&ugWGR7nV~$ zb(&cN;>|@3Ob#OT;9Xuox|6FPB5?x7j2s_)x`jIh6E6c^JjzviW8-)BhJ!sC-}>sn zMMYVemW{1@?FAm7p*czx1-tn-A7qgo4=8srvzbpKx-EhPL_}upL-1bFUOBa>SsPd; zlds`$W7MPP9tR43rBdLy!Y+=f6fr>g@ih~(q*$9;CKh4PaqH7Lu#)Y*dXWQ>TfV-A z(cut@ESNO|=qY+UpQIm-jZf#MnobfxK-jMiYryJBy#d#%1lKX_Tfl)l0D8@PM^R`~ zP)D|fgzP@u_fK-r;4SfZ69SOip3d_)GbPFrtJ`M_Pqb=X!fshCcBtXulOmMffx(l( zhz!K49h}vcxgI4BQ^?6vFp1-~ioCYbpkN;|k6N={7E8zD?oR-PD)Nb~fFjR7m`qt^UcEpYv>vP^aR$Uq zu*@L_2}q7@?C%kQ5}~$gJ&wL#Q&v?~UGEs1YHE7w3aHd*+1WSOqz*0)tkD#B{9{>- z{yV^JXPYn<7Z;1^%`4EL_`${$4e;(4qWV<~P*c+vTA(UB(F+dUxkl5cIzdQCNO#VK zr+AJ!Yyj7M-61CYP;=oW+zyMX}XxG!`gY6f+1-hS9{ekI`DyR0&@e*-zO7{P|cuNv-h z0W&#U)CgdVj`rrwUzO~?99l;L?m(Gx^KrMk5ul?BJ3T$+J-Uqy~jhN5)-C$_`| zK(AUQGw(=%4ZEc|yU-rtMysT&tKew^wC#|xwJkIz6WOrSgG>RkMEwyEHZE=yTD6JX zM<7_fVEya4Gl0a<;($~MjjrGlDh>?6Y``7yJmtckC(^H8`7bOi3~K2W=+^;pPpq8d>Kf(PAP|t4+KyjS&)vG&z z|1>__m|7+b0}@z(miZR*h%4XjUuun9=0@t7;dKFOH18pZcVEz@FfD^D3}~j+!EMB0 z9i_UnyNmz!%L5b&MKPqN^F2A)P-<<)V5uvCx$QmqqiIDA-PF;T6lza4Uf!%$u8T0P zj}HVrdlj4S(CFTlq$tQI!+=KxXp%$k=ZDpw?x4Zv_E?XT^F5+0Mi7=8-2?vT)e;Op>1;+Z9j+T&M*5-(Coww-+L_mG#-aTVkBhoY*H5w?l z%`^jG4Xh;9xHiTbY?7W!NQ}hjD)W#DdyGmx1PxX~|I|mLkBOlbfcgz@h@||SfKf}? zP{dvQ)XcW^$)ab27&C9K-rmo8UwuPkl$n-=B{#p*Ep0HmD{e8-eIu{rCego+ODu2@ zbH{9+hX5CTEJ@Y!F~te!!sl542%op^(xf{qcjLlxkaA2)Wkx5r0)h})XQdOUx0D`K zLhc9Q%muam>w*_F7Qom%(PP_urj15LfFdRL66^5VTEV)d@QRGqy4~)HogEqPaB8E= zn<5QJ?YyFUL`0o6oAopfiSEv0eM;J@CK3P{u!>3^9Obqg%neXhVNn!(4P#RY#q~ z+W-0$fXf0VDJB{J`sH6P@-?#bo>A#2jUsLkm%Kf)3f1huF zYx(cY{Wc?i4bp!GlXVPr2(Ik(*am`nV zjo^ok_bC7%pPiw^biM!mH_=DvJf6;s;;$t0&t;F$`U8V?t#P#Q=+9R8`ROsbGWWmR z{d->ie>0h)qK|~$w*6Sr$BMJx&TTe@lS>$eMc$t)KM-B1lf09LgQ3iNPb?5gq_l>G z!w_vDwpsR~!KqGN^&Xbey(g;IKM}2R?cMUd^YrZpaY>*L7RLhs-H_e!KNMJ|-K?(> zC@D!=B;&o^BN+D~nLcqNX{^S6v7Gr8INIJ4t&v`P@HKeI> z`?z;%yjn=gMo34`Tp}$7=Ox#R)+biuv1u8&L93r9n6gx*M4TBo|-mZ<CqM)n z_{!%k4uIupe(@&$beUbS06YX^q^5paF>RM=U7rn|cG-_AN%WMIlq0}lavGk$w|8l` zX}&8f>IY;cn()`mi&%FX@1-NeqQ!W2a@|%pF zy{e*dJcwrKq@L2XTN&W)Io`v83@tl7#hffs2Y9?DS8hZ&{pAc-93qSU$kh#gZnM!s zFTJwr$|{&@zG`o-F6Cca;7f)bf9CDEyuum(qf?k|ImT2CWT>moda&dyX;{O+BVR$} z{3-BGKID84M=U2KR`_VeJ66D^zUCWj$YKw`2&){NHpfzF@zaoNLB8W9&NfSruX>-? z4cm++1Bxvy%&W#5BJ~AA50Qr=rH*5q&hjr`rjT~NH=hXKvUQ&H-2PzjOngJlFgaA* zLtiJU&MA?ip(5p_>@0(a$?H~yP`l6RHP#H7b~6Ua*-a^0jL`}M_=fs|E;0@I_v)a#ZI6+BzMeV8K@Z82pq51o2Qpo9?2jeZ9rOtTP?e938?H|A0td^0B<^STjF!Zr z$YLZWdE~BD(0G25#QR~?*|kZ&0n_f`*J3i0<+z$-M(&5}&NIgs%&(|E&K<)Jix;hE zgcm+zWuCn2BUjtdO!1RUKbfYe*w_r;8IR0@tGDgQ*X`WD9c2Dh>QjB7#27T}xNVY; zZuED01p|kWt-n<+PBmK@QE(XlIF)+kiXigOy{nw5@U zu>|x+2c|2^;)cJ$jPskT9+g4{*2^c9-rO>TU8m~#P9uon;~On4^egAp&T5$l(Cn9f zJJsjk>F@D-g-?5}gNQ`6t-JGdvr}+5TgZZk4pzvui@+gZ)f`xI%Ibb9AfDI#8!0sA zU|oOcx<9|X1n`Xyv1?EJabN}o(~OyxIL{||n)bcnQd7OD5=&L-(ow4I;h>>(2h)nd zuB$m-q}wt}b~SdedZ&N{T*bOw)CtTJbqog@CpWi$Ra-VrQEod6#3%pnq=s!;XZAI0y zMjsNzyfig`o)0;*uKkqhf9phPs@jq7Mf~Y#SiHw`k&jdZBO>cztZ?$Gv%-9Y?s)Cp z9u4l%y~R-X$45}1*jLkci1@i$<+9a7L?KoN{Rz9LHA=|66Fs-Z)OBk{y{X+GSmH5X zy^yUtRup@j$T{Wi=rhm#>9~T*Z)rs@@Z}1bhX~G5G>>Hy1j^c_wYYF%X|A3{@DtJ;+xe!Z$0< zb067jRDOE^t=T+2%P}3{gpYEMVum{*<~NeK^!&Gh+rhjh^R>6Y+I!vi?=I_J`(D`ytMf2jdT-AS{nr+K zTw}c9dkIWwQSyPax%<8RTDnpTV+*{G$rm@i>6pM0AX=f9L|2lBfuH;Gs@y7S-|3M9 z)$8X$Pork&SO!nhsDPqjRT9B_HLQ1h0;^VuB;~tEj1|Cx8tpBdpPb zxyka_A^lmac13BS=N5|6zP|LAKcrn9AS}IsAp~L(mQbNY&!B`FvMaPkMOspyy$SLQ z@pBmrJ-Ov))2l z1Zh_}P|ES(dHz>hDMY6lpWY;L1RZWevUT&tq~Q|wu2G3zUFvv7l}O)ptndJ<4e-0o zjGB**?S}c?T;(HR_Un&_bG5}5LuVj}i|8q#dZJxO`5zLwPFHPzLO*UDw2nZg;Pyfq4`w>iZBD2!Y zSnZ!p)>;Bhx}wu2AN_o7j>ZOLQB?i~$PU5$xBt?l3(zDR+_ih?#y@&v4HE=jwB`Cp z<)2O7$&iqd2{dWjm7VQ__W>s*DY{x)Q`OhkTL6cumCx629lPCxLZ5y5jr6NO8`ZxN z76p}rNrl{~U6|Voos5h=Z6@VdoR8~#_-wp>=1o?T%6L6pl7=H1*TWz#CRccxD#tjt zx8g^qta_^C8^dkF>i8{ml7K9hlHRS=tNPfqglQ6+ZotPY<7mf!PUh$b;!C?ivWW(J z8t&)nlb6n>r6D=(XEj9o7cQ?=%$P*-80b^8%iWoG(YbPEwbvWlJqhqdg&aLbqO;>N zHo5c?`|;-ch>dPdl-wFWeD_^m)_%!gEVkZZQNO8vpAkCORpYLo|5|THz~r0ueBhhD z3CahK#^D384rqLTYmZK`?Sly6sg(j(x6vGpI21_b+m7Md(`b!YPeo+mGXkk|v#Wq* zMSI-k%i1OO6EhX%#x`rSeSMyu+d21Nk#DbthYHx>b=N#c?*Y4tjR*Ii%Dn|@`DFt} zSFUHkxx0?jVKaPE@q#uQi4>p?pzI*7T1sj`DRdSd9U2;Xu{9YE9D2UtS))~L3V#=N z9v;Q5)6^DuEdE}*1U%pny6=Yp>RKTV;B?Zeix4@gbF`cnQj#DHxH{h&&iRE2Yd#HY zjn(QG6-5vD=w3JDW8iT3xi9Q@lOx}uXq=}DyyB56gBuf|+K8B#(fTuI&e$gVp752C zk-3}a-lCD$iYU{->oT%xBcXX@Op(IowoRnrBQ6Aic}$TM52cG%DZXnKUX=r3b5W~s zG?$ORt1j$3r}p%zkJlwaJOkJw+ieXu3zU;qh8@t2rKaf0sw(-pa~j`L9|}yii?6Nn zwf`{Vz?$3mQy+nY+g5a(AykxqWyB5n0cro7TRqo4b5H zXm&8bMoC6nyR@&_dJ33Xelae&>+(bmq^?$|0%>Z^MfXib@tG(c8+88Q?H$s}O+V;d z|MzuDmx&(35M#n}-Ohsf6j0m-H?s#?F~cVafy%lUz6bPFI583y(x~L~GGpELzDDye z_ZbLykB9)aYUY=hr}P}q0@?_pLY3epO2Kvek|ck^Ew$6S*4N{=mkTY#d+s19r6 z0Y{_WP!)MR&)B14Z!th7-qRc@0z80`Y3^tMx@yydO=5MIQhjqYO4B*}hcm4yzp}BJ zceQzDi9ki7;P6mlLXkldbhmtcC-oIYvGany({%ss72CA>U|O}0F&yj6Iak>VoGR9* z4MTGkpSLulh=|ywq$TgEVNdJYEo@*tr_w!nc@r26V)R8kKKrj`xW1^~mhr@+G+UxT zP7X_gEwdI0&Ph7t$ftG0&RbBE8Qrc-y7IFy8&c0aZ_(ufpr%T9GtI^0R)TFM5xrbP z&`&-}Q92_6mDiEis#XqA4M9J5E7Z(lLf1U@sabEx;BhWuwqm|MXr<8!3n>q88|zyW zwXwxWdGGF_@@MU;bVk6&%h#d>R(pjPDi|KKGkT%p1Oodjr4!+}RKRi2bddtt(mQwI zj!yW@W^cCg)ja-^#7Fz<@%alFReITFw-MX49JRdnu5RC0sS7Nz_r%XKr`mlm)GL6! z<+#Ga$e3%ozmfoCG-btlqt%}D-(h|$I&C3l3^h4kgXgLQDYf_6!&jF)Lm~{uXcS~+ z3IPL!D<=?I&WVmY2vUJai>Ok{zs0n~<)}0_C(R!!mz>DeYAUo<`8mwFY zu8LD!)d%Gr+G6kVf>2Sa(G}JlXC3HH6<4eTwq1P#%QYH=g*cf*eRVFF?tJV=sD23Q zHJ|%bB2=9(S{S2s&Q$05b2n0TKaOp^R-?ZX^D%GJIfb2j6EH<<-%ekOxvP-j=nd?Z zaxA*{@vX@$H>Nd%N?tTGOuNLfA<;Qb@C&4e{nEZ7XB3ZSOK+ZDuiDbsbt9~jsm?5T zrY_TZ7=`j1!JcJE@6-2u2%Lr97hGlC{CAwJgNwiEB>Vk{PC`2|uVUupiPW_L#&2 z=Bfv4D&}>j=HiFj(lL9$CQ|&oEj^*DRdf}w12GwPJeB;chRB^_o8%&KQ@1KZ(s7DE znjH}F5|o(^%Z2u;fUfr0IHRkU8;CdaerH{?o61*Vu9LE3^sqt^+RAnYGx{C^6&9?! zKFHo^#3|YjPp)PZc>?T_yJ=AEmk+jqv;arF%a~Hn6%t;&c)`bmbeg?bwY5Eapp>>n zcOOsgy`}W__QqT~ZoaWov%Z)y;+;G2bG!wXFv&&(YZmaI;OC+m1ezR?m-0ezJr7D< z9{?+deN%($Z}XNH)d)X2f|*6O6MMp)@k!u~LzWp;CMIEi(p-B(Ge5z)YJUAK+~XKh zg<1M0(7kP3>u@}3;ONsLDWD%l79+}~jy>F8>VuUEFu5l#gC6_~@{X_qfX0}_yKz{H z^BBbfy!PV*0B9m#j1M+m|K`qLpK2KomcwV&NtR=B`qwY{iqHUn7EpHfATRJ3eH=9I z@&W)f8<*yxUo3U}`>=omKsz7(;h#;OusP3K`-4(3*8N{9a4swP5UH|^@$&zpH`YxH!+OcQ-V%b}x*M!~n> z>#XBKRvJyU(DtSB6O7pm0?rxw1Y?|Z!|cviGtn)`v~=jydhJO6sp0)Cn{DWF>JYRi zneQ}iJo!?uyZBHRnL|yxllS2FZyN)+fP%jEZ20`@7Ch8)x=d4V-`Rh?_siCUwMKVH z@pZSz!3Lf`ljZA2y~tB0>tOuzN~P*(k3pu{Kpk-os_e?^9YWC70dc;DsSL z>MnnHjRAfy8RnwI5ndOWec@il3ZzYor`UGQC6ZHJ9T!!Nbor)Yo%S-8?r5KP%2N{i z4W1UiL{80vg$CqOT|L#=88QuU=r%S6b2s6APT7M10jqiyQE{tOuiN*Ss0BOyD3#q7 zHev&Z!mAUk%q5F=SPCs`pe(OdLwhM5XmzzK%~7-B4r>=ppVrhY&GJ_XSoqJylzNIl zL;TxyCrjsfgc~mHYsYPQCNzCoURhJO(2ipR4TqI`f9*|lo0#H|5%Iufm>A1w*n0+E z0Ij?+9=VvXl6E@%W!*3^x?di8?$rAE<$$DYTrqxiw`!} zDYWC+x0i>H_>z7{UVHIH^=@8GCimV~7lsZi?by-Pt%!5^F=%DzkuUK_79e4^VCa&= zH?@t-*EGPtoTyVYQM+tZYC-XlMSGpg0q1I2mYTKTPgbN#LxQ!+>X{d?t-`Z{6c!oWu2RdI;`zzGe=Tms43#Knqy8l|5?J|6q-ttuXA;wC?Su zjdzsV2~tDZW2~|q9yBxz?{yc`gm2MgyX)t{jc2oF(E;~qtG#j_DQqbzVwZv^^O$C% zzNvFLBvD)=0DHhZm*%cS^5}6p43)h+iQi2<@l|c3@?zjnd9NqjpeUpHlx8o*NqA2$ zb1oWsU7ojPG@@ovyGD!Mo4@zX-XkR_5o>z8$(1Tdz(9r6za zoziQP>c7RYB+(V%++36}ST(ze98s6So?j*TfoCX>w1?B8KIe>pcukHUao0%&@VNO} z=`cC$iT3rN32SNHk4+(NjvdKtD~(bH8?)cHy}{P`EnejAg-B9Sk18DtLF27QdhT|f zNYNgynj(x$DMpTC&}&;b9A-NE$U+_I&-ujKk{7dXiv%-lj199>f-nwNw;J|nD7mbO z<;-@gr_-a~W_i}JjO*6MFs{WLZ{h(FvJ3artRH%SD zw~op>1PY#Q!Y}MLKV94MC}!+5x$I=4+ztsfKq&CFIx~)1FsNYGkh1Gm{*h?4o7Q5G zB7s=mI8i~tysodv@-8}fZ2GI*`dp`RJZMo(JiVml4sOMST69yR;vM=)v$+n^>4WfE z*I)ac5T4%d_a)&aQxXx+$DmV=XWITan9koIIuX@KOLRB-P&3@9Bo=6nws(q5Vq(g9 zra1H?3Wh<=^yDwyrkA)LNQ$d34WzN$(a)=Lqk>Y(9oOFpbzDDt}W1{N9>F3Qoa5w|rWdFw#7-6?J)mCB_ZW#)w^T^tDa^1Y0Sj~-R5ITF7iAo9P?DA zyZQx#SyYQ2hF{d@IhNd%FZdB!&zRgRAlFR72dBot&Ugk)9sQ}#1^`Te1umPq?p<#mXyvO5*-s;bqHi3|p+m+KEIGeWwT znj4Ap+v8=59MMvS@`;&E@S$0+yYa4rTsIisl4F_X$s?xHSt1x07Yyd(u|E(&R!Z5@ ziR;!2rFxdboh1)47dKuvEucKt(GFVip416?W8kYE5u9TL^rihKk)fPt+ni%2+{_T1 zEHhXj#;fBJpP1l=0sjgU_(&m(C<3~8N|f5+Z1Po?m zc^mLoIJ`pkL9mA8mVFxaTl6QgXSD?y=e!ZY*`BxKs!Vcomm<~@03&1dK0E~Ev*zcj zIxOt$bX!Zl4o_)^mDl??n)*cx(_}^}}$|lrLhPsXx>AYO-3S{S;~(Tm(zvSoK^eu`!cfy{XAHR2`eI7e1?- z+Bx3fQsV8sO9Zu zKXuPxGk3-=sDU>71>;2duE|lz6VeKz-AqAQ!abhXQu0MAk!O#0+QZ9U z639VG1f6+>>Dr@xTE4`zDWs~t%MNx2P~hwEu=d(S!g<|_?cmFSg1!jG0dTXjZIkv7 z{xYL>^o?E!62f>_RQCltkGrAf^q-_hM9gv%0Otpn z&K`Hz{su|%AOM^{EvLsE)+hf@3I;rSz>Tlg-QxbkQGaw)N&&!+H@Or8U5|19Zzlg= z?r@RIcQf4xGElB4-Ndm4E`+!n7LQ98Z2myyMb! zM)tMfyCM%cOYyDH)@p;dz2R7Y6L&5_;RcX)?vD6Anjmt^wpffRKC498-Jb6yiz_@h zlZWL)gIF2ACV^LhMU+4-x~;Eso#}2&A*W_?;nL3PHWF!OvU#I#Va4E5UxyvMV*VH8 z4l^Mo;mti|2?t@RpO(vFJMc)hO_}I_k_3?2z@#9pz7Q&9(Tn50X@H0^$q(r;#J*LR zvCt0LPHvJ0uUI@-)u$d3`uOED$F|ctIYy$Z?WA2fL%w8T=gkXGxHLWYVBz8KsY@IQ z{E!g+@BX@FZk17a$w@*UOQ{({&^IZo?X4%Rjtr+CK|bEqy03zMUa>t#mY%`yNBEwR~HK8#(< z*~u)^9d7o)VCrK>)&~axr>|^I*4k6)GC_inzKDtVZoq4%H;|G!w_(SY+uYu#iPUxb zaQ|l1w+6$h?B}pCV7IVf2%yjPD$OQict*OFDRVTtukazWsu{B`Wd_W`WuA*xE<%uzYTXqLe_UV`GWY%r4iJeNMNz>TJ0^lTR}US4}R$0Z1U$G`DgN;`OVuCqG z4fJJRya&!(7diAySn9|`m)JYVMEHYzjU-9T44EX1sg8|$f3F{)n}EYFyGk93yW&yesIkKW?H>`_%O;vG$4 z0U4xDo7EBIFNq&pZTUEHfX8}qIjI-MakX}}!NA}~t#}7X48Yd88(w9KUjw7mI=`PHZ1qWaia#B`O$goR zO=*AJRr7j|iQ?vG+@{ddpWy5w7?6mrgVa-Ahh})2%xKWkik>aZvZ$g0Wytp`j_V4e zuG`pvEY0?(VbBA!e_}FQOLj5EdIZN`*Sy6Iifp0*G=TvqlB*DDk7?uV<+5}?K;H0X9(*rrJ@~#O>t5KSb^~ML>*f^zO7q5fJ{YPY4Ys?Nz2WBE((m~xi@60< zXQ_;e%ZcLV*a4$Xtr%`Ndl?sOdx#CJ6}Bu@AhV}R8+f#`=qFK>wwUYg^z&Fzp1x?R z^$vLx%t%uIsj8Jh1H95ZBJc3v2s@27vH9gYD1K}CFCt&R%-gk0SfykkwA$9kHwB%# z9Mt*UF$>lO5#67K7*;#JyUd3U!$eP~I_}7ptp1Q<)~$J!%l;!Xor2jP&N3Ck=L z)=?dRPOs~BANbB2TLDI~u9OXDYkerjsTW~XjE9%Y)!AO)1!uCz_Ividyc#K= z@kOUX^ZMujz{-6zyw;kCoeiZ==5Sn3p$2`o#67~are9@SX=ax-;;iNANYp9UA=>+khQO)dE`b7?!`J7~{!tFFhE$c1m|#*BJO(@*cepW_AVaEYX0Mmr^_ zUn16`^clpOXwSg)^CMc`4p`yX9?pwqht{`3v5;hdVjb(QqaY3K16J=A-#KVhAbT+c z&Hcos)!uCSSXmq*$vbD>J|pKwy3EyRNcXDWIqMnSfp@Ed-?!oh z>7=oo4nHievZ&_E^#<&gZON$4>zn+YFB%pBdvgTfu|CQT^(B1K3C5>V@-2I6hX*nf zcZ$WuL`Rp4I6e`!U&HWIpT$k%QqFPFldyh_;c{es>iSt{3WW$<;E zU;dNCTikXx=Z&Zr$!?L zGVV&xoTwO@Dc)p+a6_*l!Uo29A#9Jda<1*!pQH*OpQ$qm+Xh}qe2ON1hb-eGMbUpY zYy5?*X3cHMB{n7KgTY5aLKgjXFFhURYz2+Td{%xOLSkCc#R6Z zlcjziNwG{^hCBZ;;9ZvWxo*F89qj}plq-=JNal~S=seT8qG_w5d+h9WUq8CdDRL0a zZq-kh#UD`q3EIBIfLB{r~e#a$|Bhp_Uo2FG*d=KVJW*QD}&i?}?3sQa628J11m0RE98j+Z=n2LqHv7AeviD_CUnF zv-RAcC&!9CwYxGeqkHD?im!uYEl8H}&a>+GswzEjOG{>Oa!tEIp87kW^mjVKtpue+ zA^6CAyBQ6HyD8MuJUF<6U-ts(3_aU^xEziAbPQH%DWY zF$C54Rvl$8q&J+J-yF^5^+^aSrDC7suRx{wC7*zgbIOfsU$2yI0U!APdh*pY`jFPy z0Hl}!o?iwb(~P9@Jzf$LQlr6k(ij>g$-M=+Fb|K2T?q$_XSL==)4B)r$i#7p27(<6 zZX-k72i8QbIP2nE$1U#u^BKSbyA>-X)jeo*ZC>ba`16Ov{Fdm85R9jUCO<6iHbr0A zIKf@l#P2bM-cPqJ{u`qnH@o`?AT0{>fG{e1>s-e7aDmUKU^gQ{A7XQnW}B_Xhif~gGPV-HW#dQTT*g0Shg+p!aq;cH(2hjtE}jY}z|CfOv8wJXeAw$;VCT%!M% z#}<(o!2EgtVbL{($xrKJ(r;9rC#X%Oe*9c?6vY|+O3d|cWh|gQ?@$>2(Eo2V9FPN- zt$rzqE*n*Rfuq&)S6W%gt*~Ncv_;S><|5}c9)Ilw88+(o^y*jaj2r0r;^XC_R9{)~ zhFiqQW$olwJ`opp3fk81QF#*(E?_#}YsEf{P!I?fxR>F*QK@UrHf>xK5n=;o%#mAS z4R&9$_FSrU0&N;k?E`*PYXj)L{MOrkGLP@gU{tMP39y+0hpt=7D(a(f@Fl< za`%IU@2gARf8DHf_$RnMv$znuzSJ*N@w^tP%~+yS_(uAd6ST2<7_z#nE+a47B|z8b zJT+jj;avTs9ov7er#Y&drzpx)XBuVxm^NC^sDasxSf}*sHKYB~J38%6rR%{K<%*2` z%>(Dyu9;8y-VqS43EcJYREKN3%Db+KA?4bVoDmszS`7t*F!4Q2bBg*F_y*@PtY>rc zv&YYH$AR!!Q~~Z=e|xkXa(Lf-)CFr1RtM;{Q`~~Kn(fIiY+>1Mr<~Ut&3>ts4>cTI zC2BPtpDcH%5QI-fwPTDeV43~SQ<+YyO2}S({}R1a>Ga0RXSN$|-XF#09r75v5?$g9 zP=;f}^iVCm-iu6Xk|(^X2i7+1;?)J*(Ha=Rfr;XbSLaj)l21;!%NuM#XA--t6AlmD zJ9JNsk^oMP%F)XXL5J9|pHO?%L@1UL;27a)L|{Juy(@#6dHr*No}qE5W*Ypt15)aN zsVHOw(K%scOQ%cozNuwOhUI3gCSPJRYhDg!5HT*C^>+Py9>bM3C8q==E+`7WpIqPB z+AeFos&jS-jFJP*x>{##83#EBaBIQ)9?3bO?h3*jT3t&WRaORihWf<`C2}?)36uFH z-9}FVuL8L4;~T(f+x9p9WqYw!4X4wzIZ|u**O#)UNF5GR#LG3KyR?@(_rZ|lw;*0SSQF_Q!ZhInGoFz!KQ@-Tbf=RYda&M z*O%jqa+D62?rxyj7Bh?bR<+%t7X86dGr$D&H*E<|y)i9@cnnHENYIR{kY$@*S#A%X zut9`c4VD=ulUXy1w$Jm|Sh4l!q-9!quIg{F38PNoH&?cu%qJ`)Jk3XZOi!wSvwP6p z?}03=PFi-X9V^(dj9RQKlQ6f=jG=`^Al*&(nBFMxsCeB!4L$NCxJ3Gdy6yx^f7+P4 z2t@kB!p^rRT`PJ3C@+<#vPQ)gz1j8(Bk@^SwNzI|?LX*3r#ly8E`I1lti3UpF#>|qd~^9atg|J;e?11X740XXk&tD^auvoWL!MgR^;?yPDl$L zKI}?wxOlAkdhN`qT}5Z&hF{^{(N$vb=b6pX&K{ey%9Ugh!yTpH$m*^Ok1YZC%VXKm z;I$zj`y+%3WbB+YtjS-yTjFKKgnPL(=L*G)EX{AuvUn#f{Cac;FJ*!ZppapXcYXqW zt=5_1Je>!CuR<-fccx{$?fH$0BT3CV`t86gx4m@huy~X2C$2@nOZ>`pyY-J<49E*6 z3MTI5uyIhrzr@M``K}BsQYr5KV+ovpz~RnG;5$>FNB@!#O5~dcbRD8yaBK_3pI6Y9 z6!@-V5XTz?*?6rh5cOP(I(sQl>;(E11TbAmzd2n&urg#dByyB2kaA%#CZ{q!={ z(gWVEyC?Z8{&aGzV8y!Pi@VR=sx}J2Y|q<*F;Ku0FqYK%vflt|0S1KL=_;m|KlBw?w@c|^lLVRuwaOQf6@;X KB=he-_4^;pRJN4> literal 0 HcmV?d00001 diff --git a/docs/static/img/how-to/import-js/imported.png b/docs/static/img/how-to/import-js/imported.png new file mode 100644 index 0000000000000000000000000000000000000000..8f2004d8a06930dd911b4c038f92cf90e45401de GIT binary patch literal 121513 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

l;C- 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 H%|ibd3rRWa literal 0 HcmV?d00001 diff --git a/docs/static/img/how-to/import-js/mathjs.png b/docs/static/img/how-to/import-js/mathjs.png new file mode 100644 index 0000000000000000000000000000000000000000..9a68aab38e3b132b77513eaeba723ba49135bcc2 GIT binary patch literal 91399 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 F{{@dBGi(3= literal 0 HcmV?d00001 diff --git a/docs/static/img/how-to/import-js/newquery.png b/docs/static/img/how-to/import-js/newquery.png new file mode 100644 index 0000000000000000000000000000000000000000..ee481dfd9daa05c26c040c64bede0a0b95b00522 GIT binary patch literal 129102 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≠+HUIy`qkhk_WTD?lAMq5<) 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 D6J5VP literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/version-2.0.0/how-to/import-external-lib-js.md b/docs/versioned_docs/version-2.0.0/how-to/import-external-lib-js.md new file mode 100644 index 0000000000..27b6b49c97 --- /dev/null +++ b/docs/versioned_docs/version-2.0.0/how-to/import-external-lib-js.md @@ -0,0 +1,96 @@ +--- +id: import-external-libraries-using-runjs +title: Import external libraries using RunJS +--- + +ToolJet allows you to utilize external libraries in your app by importing them using the [RunJS query](/docs/data-sources/run-js). + +In this how-to guide, we will import a few JavaScript libraries and use it in the application. + +:::tip +You can import any of the available libraries using their **CDN**. Find free CDN of the open source projects at **[jsDelivr](https://www.jsdelivr.com/)** +::: + +- Create a new application and then create a new RunPy query from the query panel. +

+ + Import external libraries using RunJS + +
+ +- Let's write some code for importing libraries. We will first create a function `addScript` that returns a `Promise`, the `Promise` creates a script tag -> sets an attribute -> and eventListener `resolves` if its loaded and `rejects` if there is an error, and then body is appended at the end. +- We are going to import two libraries using their CDNs: **MathJS** and **Flatten**, and display an alert when the libraries are loaded successfully. + ```js + function addScript(src) { + return new Promise((resolve, reject) => { + const s = document.createElement('script'); + s.setAttribute('src', src); + s.addEventListener('load', resolve); + s.addEventListener('error', reject); + document.body.appendChild(s); + }); + } + + try { + await addScript('https://cdn.jsdelivr.net/npm/mathjs@11.7.0'); + await addScript('https://cdn.jsdelivr.net/npm/flattenjs@2.1.3/lib/flatten.min.js'); + + await actions.showAlert("success", 'Mathjs and Flatten imported') + + + } catch (e) { + console.log(e); + } + ``` + +- Now, when you hit **create** and then **run** the query, the script will be injected into the DOM. An alert should pop-up with the message **Mathjs and Flatten imported**. + +
+ + Import external libraries using RunJS + +
+ +:::tip +Enable the **Run this query on application load?** option to make the libraries available throughout the application as soon as the app is laoded. +::: + +## Examples + +### Flatten the JSON objects using FlattenJS + +- Let's create a new **RunJS** query that will use **Flatten** library(imported in the above section) and the query will flatten the JSON object. + ```js + return flatten({ + key1: { + keyA: 'valueI' + }, + key2: { + keyB: 'valueII' + }, + key3: { a: { b: { c: 2 } } } + }) + ``` +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
+ + Import external libraries using RunJS + +
+ +### Computation using MathJS + +- Let's create a new **RunJS** query that will return the result of calculation performed by [atan2](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2) method and then divided by [pi](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/PI). +```js +return math.atan2(3, -3) / math.pi +``` + +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
+ + Import external libraries using RunJS + +
+ \ No newline at end of file diff --git a/docs/versioned_docs/version-2.1.0/how-to/import-external-lib-js.md b/docs/versioned_docs/version-2.1.0/how-to/import-external-lib-js.md new file mode 100644 index 0000000000..27b6b49c97 --- /dev/null +++ b/docs/versioned_docs/version-2.1.0/how-to/import-external-lib-js.md @@ -0,0 +1,96 @@ +--- +id: import-external-libraries-using-runjs +title: Import external libraries using RunJS +--- + +ToolJet allows you to utilize external libraries in your app by importing them using the [RunJS query](/docs/data-sources/run-js). + +In this how-to guide, we will import a few JavaScript libraries and use it in the application. + +:::tip +You can import any of the available libraries using their **CDN**. Find free CDN of the open source projects at **[jsDelivr](https://www.jsdelivr.com/)** +::: + +- Create a new application and then create a new RunPy query from the query panel. +
+ + Import external libraries using RunJS + +
+ +- Let's write some code for importing libraries. We will first create a function `addScript` that returns a `Promise`, the `Promise` creates a script tag -> sets an attribute -> and eventListener `resolves` if its loaded and `rejects` if there is an error, and then body is appended at the end. +- We are going to import two libraries using their CDNs: **MathJS** and **Flatten**, and display an alert when the libraries are loaded successfully. + ```js + function addScript(src) { + return new Promise((resolve, reject) => { + const s = document.createElement('script'); + s.setAttribute('src', src); + s.addEventListener('load', resolve); + s.addEventListener('error', reject); + document.body.appendChild(s); + }); + } + + try { + await addScript('https://cdn.jsdelivr.net/npm/mathjs@11.7.0'); + await addScript('https://cdn.jsdelivr.net/npm/flattenjs@2.1.3/lib/flatten.min.js'); + + await actions.showAlert("success", 'Mathjs and Flatten imported') + + + } catch (e) { + console.log(e); + } + ``` + +- Now, when you hit **create** and then **run** the query, the script will be injected into the DOM. An alert should pop-up with the message **Mathjs and Flatten imported**. + +
+ + Import external libraries using RunJS + +
+ +:::tip +Enable the **Run this query on application load?** option to make the libraries available throughout the application as soon as the app is laoded. +::: + +## Examples + +### Flatten the JSON objects using FlattenJS + +- Let's create a new **RunJS** query that will use **Flatten** library(imported in the above section) and the query will flatten the JSON object. + ```js + return flatten({ + key1: { + keyA: 'valueI' + }, + key2: { + keyB: 'valueII' + }, + key3: { a: { b: { c: 2 } } } + }) + ``` +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
+ + Import external libraries using RunJS + +
+ +### Computation using MathJS + +- Let's create a new **RunJS** query that will return the result of calculation performed by [atan2](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2) method and then divided by [pi](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/PI). +```js +return math.atan2(3, -3) / math.pi +``` + +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
+ + Import external libraries using RunJS + +
+ \ No newline at end of file diff --git a/docs/versioned_docs/version-2.2.0/how-to/import-external-lib-js.md b/docs/versioned_docs/version-2.2.0/how-to/import-external-lib-js.md new file mode 100644 index 0000000000..27b6b49c97 --- /dev/null +++ b/docs/versioned_docs/version-2.2.0/how-to/import-external-lib-js.md @@ -0,0 +1,96 @@ +--- +id: import-external-libraries-using-runjs +title: Import external libraries using RunJS +--- + +ToolJet allows you to utilize external libraries in your app by importing them using the [RunJS query](/docs/data-sources/run-js). + +In this how-to guide, we will import a few JavaScript libraries and use it in the application. + +:::tip +You can import any of the available libraries using their **CDN**. Find free CDN of the open source projects at **[jsDelivr](https://www.jsdelivr.com/)** +::: + +- Create a new application and then create a new RunPy query from the query panel. +
+ + Import external libraries using RunJS + +
+ +- Let's write some code for importing libraries. We will first create a function `addScript` that returns a `Promise`, the `Promise` creates a script tag -> sets an attribute -> and eventListener `resolves` if its loaded and `rejects` if there is an error, and then body is appended at the end. +- We are going to import two libraries using their CDNs: **MathJS** and **Flatten**, and display an alert when the libraries are loaded successfully. + ```js + function addScript(src) { + return new Promise((resolve, reject) => { + const s = document.createElement('script'); + s.setAttribute('src', src); + s.addEventListener('load', resolve); + s.addEventListener('error', reject); + document.body.appendChild(s); + }); + } + + try { + await addScript('https://cdn.jsdelivr.net/npm/mathjs@11.7.0'); + await addScript('https://cdn.jsdelivr.net/npm/flattenjs@2.1.3/lib/flatten.min.js'); + + await actions.showAlert("success", 'Mathjs and Flatten imported') + + + } catch (e) { + console.log(e); + } + ``` + +- Now, when you hit **create** and then **run** the query, the script will be injected into the DOM. An alert should pop-up with the message **Mathjs and Flatten imported**. + +
+ + Import external libraries using RunJS + +
+ +:::tip +Enable the **Run this query on application load?** option to make the libraries available throughout the application as soon as the app is laoded. +::: + +## Examples + +### Flatten the JSON objects using FlattenJS + +- Let's create a new **RunJS** query that will use **Flatten** library(imported in the above section) and the query will flatten the JSON object. + ```js + return flatten({ + key1: { + keyA: 'valueI' + }, + key2: { + keyB: 'valueII' + }, + key3: { a: { b: { c: 2 } } } + }) + ``` +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
+ + Import external libraries using RunJS + +
+ +### Computation using MathJS + +- Let's create a new **RunJS** query that will return the result of calculation performed by [atan2](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2) method and then divided by [pi](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/PI). +```js +return math.atan2(3, -3) / math.pi +``` + +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
+ + Import external libraries using RunJS + +
+ \ No newline at end of file diff --git a/docs/versioned_sidebars/version-2.0.0-sidebars.json b/docs/versioned_sidebars/version-2.0.0-sidebars.json index d715f048b7..bb0aa95d25 100644 --- a/docs/versioned_sidebars/version-2.0.0-sidebars.json +++ b/docs/versioned_sidebars/version-2.0.0-sidebars.json @@ -289,6 +289,7 @@ "how-to/bulk-update-multiple-rows", "how-to/access-currentuser", "how-to/use-axios-in-runjs", + "how-to/import-external-libraries-using-runjs", "how-to/run-actions-from-runjs", "how-to/run-query-at-specified-intervals", "how-to/access-users-location", diff --git a/docs/versioned_sidebars/version-2.1.0-sidebars.json b/docs/versioned_sidebars/version-2.1.0-sidebars.json index bade4397c8..54a661e6e3 100644 --- a/docs/versioned_sidebars/version-2.1.0-sidebars.json +++ b/docs/versioned_sidebars/version-2.1.0-sidebars.json @@ -288,6 +288,7 @@ "how-to/access-cellvalue-rowdata", "how-to/bulk-update-multiple-rows", "how-to/access-currentuser", + "how-to/import-external-libraries-using-runjs", "how-to/use-axios-in-runjs", "how-to/import-external-libraries-using-runpy", "how-to/run-actions-from-runjs", diff --git a/docs/versioned_sidebars/version-2.2.0-sidebars.json b/docs/versioned_sidebars/version-2.2.0-sidebars.json index 8470c46427..1342f28433 100644 --- a/docs/versioned_sidebars/version-2.2.0-sidebars.json +++ b/docs/versioned_sidebars/version-2.2.0-sidebars.json @@ -291,6 +291,7 @@ "how-to/access-currentuser", "how-to/use-axios-in-runjs", "how-to/import-external-libraries-using-runpy", + "how-to/import-external-libraries-using-runjs", "how-to/run-actions-from-runjs", "how-to/run-query-at-specified-intervals", "how-to/access-users-location", From d6b58c8630220cfaff9050875e22d30abf626221 Mon Sep 17 00:00:00 2001 From: Shubhendra Singh Chauhan Date: Tue, 4 Apr 2023 12:31:28 +0530 Subject: [PATCH 04/23] [docs] added how-to: import external libs using RunJs (#5908) From c36d77ec21d521b818289340b7cbf1a6c689b9d4 Mon Sep 17 00:00:00 2001 From: Shubhendra Singh Chauhan Date: Tue, 4 Apr 2023 12:31:44 +0530 Subject: [PATCH 05/23] [docs] version 2.3.0 (#5910) * added dynamic column * added docs-v2.3.0 --- docs/docs/widgets/table.md | 26 + docs/docusaurus.config.js | 2 +- .../img/widgets/table/dynamic_column.png | Bin 0 -> 457992 bytes .../version-2.3.0/Enterprise/_category_.json | 5 + .../version-2.3.0/Enterprise/audit_logs.md | 84 + .../version-2.3.0/Enterprise/superadmin.md | 130 + .../version-2.3.0/Enterprise/white-label.md | 39 + .../version-2.3.0/actions/_category_.json | 5 + .../version-2.3.0/actions/close-modal.md | 19 + .../actions/control-component.md | 98 + .../actions/copy-to-clipboard.md | 18 + .../version-2.3.0/actions/generate-file.md | 42 + .../version-2.3.0/actions/go-to-app.md | 20 + .../version-2.3.0/actions/logout.md | 18 + .../version-2.3.0/actions/open-webpage.md | 18 + .../version-2.3.0/actions/run-query.md | 18 + .../version-2.3.0/actions/set-localstorage.md | 59 + .../version-2.3.0/actions/set-page-var.md | 20 + .../version-2.3.0/actions/set-table-page.md | 24 + .../version-2.3.0/actions/set-variable.md | 24 + .../version-2.3.0/actions/show-alert.md | 23 + .../version-2.3.0/actions/show-modal.md | 18 + .../version-2.3.0/actions/switch-page.md | 18 + .../version-2.3.0/actions/unset-page-var.md | 18 + .../version-2.3.0/actions/unset-variable.md | 23 + .../version-2.3.0/app-builder/canvas.md | 55 + .../version-2.3.0/app-builder/left-sidebar.md | 68 + .../version-2.3.0/app-builder/overview.md | 20 + .../version-2.3.0/app-builder/query-panel.md | 177 + .../app-builder/right-sidebar.md | 29 + .../version-2.3.0/app-builder/toolbar.md | 133 + .../contributing-guide/_category_.json | 5 + .../contributing-guide/code-of-conduct.md | 81 + .../version-2.3.0/contributing-guide/l10n.md | 69 + .../contributing-guide/setup/_category_.json | 5 + .../contributing-guide/setup/architecture.md | 25 + .../contributing-guide/setup/docker.md | 182 + .../contributing-guide/setup/macos.md | 134 + .../contributing-guide/setup/ubuntu.md | 126 + .../contributing-guide/slackcoc.md | 90 + .../contributing-guide/testing.md | 57 + .../troubleshooting/eslint.md | 43 + .../tutorials/_category_.json | 5 + .../tutorials/create-widget.md | 27 + .../tutorials/creating-a-plugin.md | 226 + .../data-sources/_category_.json | 5 + .../version-2.3.0/data-sources/airtable.md | 229 + .../version-2.3.0/data-sources/amazonses.md | 61 + .../version-2.3.0/data-sources/appwrite.md | 160 + .../version-2.3.0/data-sources/athena.md | 67 + .../version-2.3.0/data-sources/baserow.md | 269 + .../version-2.3.0/data-sources/bigquery.md | 160 + .../version-2.3.0/data-sources/clickhouse.md | 211 + .../version-2.3.0/data-sources/cosmosdb.md | 91 + .../version-2.3.0/data-sources/couchdb.md | 311 + .../version-2.3.0/data-sources/custom-js.md | 56 + .../version-2.3.0/data-sources/dynamodb.md | 38 + .../data-sources/elasticsearch.md | 80 + .../version-2.3.0/data-sources/firestore.md | 163 + .../version-2.3.0/data-sources/gcs.md | 41 + .../data-sources/google.sheets.md | 112 + .../version-2.3.0/data-sources/graphql.md | 55 + .../version-2.3.0/data-sources/influxdb.md | 129 + .../version-2.3.0/data-sources/mailgun.md | 64 + .../version-2.3.0/data-sources/mariadb.md | 49 + .../version-2.3.0/data-sources/minio.md | 51 + .../version-2.3.0/data-sources/mongodb.md | 109 + .../version-2.3.0/data-sources/mssql.md | 42 + .../version-2.3.0/data-sources/mysql.md | 65 + .../version-2.3.0/data-sources/n8n.md | 51 + .../version-2.3.0/data-sources/notion.md | 234 + .../version-2.3.0/data-sources/openapi.md | 25 + .../version-2.3.0/data-sources/oracledb.md | 53 + .../version-2.3.0/data-sources/overview.md | 42 + .../version-2.3.0/data-sources/postgresql.md | 57 + .../version-2.3.0/data-sources/redis.md | 44 + .../version-2.3.0/data-sources/restapi.md | 46 + .../version-2.3.0/data-sources/rethinkdb.md | 52 + .../version-2.3.0/data-sources/run-py.md | 55 + .../version-2.3.0/data-sources/s3.md | 137 + .../version-2.3.0/data-sources/saphana.md | 48 + .../version-2.3.0/data-sources/sendgrid.md | 62 + .../version-2.3.0/data-sources/slack.md | 81 + .../version-2.3.0/data-sources/smtp.md | 48 + .../version-2.3.0/data-sources/snowflake.md | 52 + .../version-2.3.0/data-sources/stripe.md | 192 + .../version-2.3.0/data-sources/twilio.md | 54 + .../version-2.3.0/data-sources/typesense.md | 92 + .../version-2.3.0/data-sources/woocommerce.md | 64 + .../version-2.3.0/data-sources/zendesk.md | 96 + .../version-2.3.0/getting-started.md | 249 + .../version-2.3.0/how-to/_category_.json | 5 + .../how-to/access-cellvalue-rowdata.md | 115 + .../how-to/access-users-groups.md | 54 + .../how-to/access-users-location.md | 85 + .../how-to/build-plugin-for-marketplace.md | 381 + .../bulk-update-multiple-rows-in-table.md | 115 + .../how-to/import-external-lib-py.md | 98 + .../how-to/loading-image-pdf-from-db.md | 45 + .../how-to/oauth2-authorization.md | 66 + .../how-to/run-action-from-runjs.md | 195 + .../run-query-at-specified-intervals.md | 42 + .../how-to/s3-custom-endpoint.md | 18 + .../version-2.3.0/how-to/upload-files-aws.md | 137 + .../version-2.3.0/how-to/upload-files-gcs.md | 73 + .../version-2.3.0/how-to/use-axios.md | 62 + .../how-to/use-form-component.md | 90 + .../version-2.3.0/how-to/use-inspector.md | 112 + .../version-2.3.0/marketplace.md | 120 + .../org-management/permissions.md | 21 + .../release-management/multi-env.md | 32 + docs/versioned_docs/version-2.3.0/security.md | 23 + .../version-2.3.0/setup/_category_.json | 5 + .../version-2.3.0/setup/client.md | 96 + .../version-2.3.0/setup/digitalocean.md | 64 + .../version-2.3.0/setup/docker-local.md | 29 + .../version-2.3.0/setup/docker.md | 149 + .../versioned_docs/version-2.3.0/setup/ec2.md | 78 + .../versioned_docs/version-2.3.0/setup/ecs.md | 77 + .../version-2.3.0/setup/env-vars.md | 301 + .../version-2.3.0/setup/google-cloud-run.md | 151 + .../version-2.3.0/setup/heroku.md | 142 + .../version-2.3.0/setup/http-proxy.md | 12 + .../version-2.3.0/setup/index.md | 12 + .../version-2.3.0/setup/kubernetes-aks.md | 53 + .../version-2.3.0/setup/kubernetes-gke.md | 79 + .../version-2.3.0/setup/kubernetes.md | 61 + .../version-2.3.0/setup/openshift.md | 68 + .../version-2.3.0/setup/tooljet-subpath.md | 21 + .../version-2.3.0/setup/try-tooljet.md | 38 + .../version-2.3.0/setup/v2-migration.md | 33 + .../version-2.3.0/tooljet_database.md | 302 + docs/versioned_docs/version-2.3.0/tracking.md | 23 + .../version-2.3.0/tutorial/_category_.json | 5 + .../version-2.3.0/tutorial/actions.md | 31 + .../tutorial/adding-a-datasource.md | 36 + .../version-2.3.0/tutorial/adding-widget.md | 66 + .../tutorial/app-menu-options.md | 69 + .../tutorial/building-queries.md | 53 + .../version-2.3.0/tutorial/creating-app.md | 31 + .../version-2.3.0/tutorial/debugger.md | 19 + .../tutorial/keyboard-shortcuts.md | 122 + .../tutorial/manage-users-groups.md | 184 + .../version-2.3.0/tutorial/mobile-layout.md | 26 + .../version-2.3.0/tutorial/multiworkspace.md | 49 + .../version-2.3.0/tutorial/pages.md | 205 + .../tutorial/sharing-and-deploying.md | 55 + .../version-2.3.0/tutorial/transformations.md | 93 + .../tutorial/versioning-and-release.md | 67 + .../workspace-environment-variables.md | 65 + .../user-authentication/general-settings.md | 38 + .../user-authentication/password-login.md | 32 + .../user-authentication/sso/_category_.json | 5 + .../user-authentication/sso/github.md | 67 + .../user-authentication/sso/google.md | 85 + .../user-authentication/sso/openid/azuread.md | 67 + .../sso/openid/google-openid.md | 82 + .../user-authentication/sso/openid/okta.md | 53 + .../user-authentication/sso/openid/setup.md | 33 + .../user-authentication/user-lifecycle.md | 167 + .../version-2.3.0/widgets/_category_.json | 5 + .../version-2.3.0/widgets/bounded-box.md | 100 + .../version-2.3.0/widgets/button-group.md | 95 + .../version-2.3.0/widgets/button.md | 96 + .../version-2.3.0/widgets/calendar.md | 199 + .../version-2.3.0/widgets/chart.md | 389 + .../version-2.3.0/widgets/checkbox.md | 108 + .../widgets/circular-progressbar.md | 78 + .../version-2.3.0/widgets/code-editor.md | 209 + .../version-2.3.0/widgets/color-picker.md | 84 + .../version-2.3.0/widgets/container.md | 60 + .../version-2.3.0/widgets/custom-component.md | 105 + .../widgets/date-range-picker.md | 81 + .../version-2.3.0/widgets/datepicker.md | 108 + .../version-2.3.0/widgets/divider.md | 56 + .../version-2.3.0/widgets/dropdown.md | 140 + .../version-2.3.0/widgets/file-picker.md | 172 + .../version-2.3.0/widgets/form.md | 76 + .../version-2.3.0/widgets/html.md | 72 + .../version-2.3.0/widgets/icon.md | 64 + .../version-2.3.0/widgets/iframe.md | 67 + .../version-2.3.0/widgets/image.md | 107 + .../version-2.3.0/widgets/kanban-board.md | 137 + .../version-2.3.0/widgets/link.md | 68 + .../version-2.3.0/widgets/listview.md | 140 + .../version-2.3.0/widgets/map.md | 87 + .../version-2.3.0/widgets/modal.md | 101 + .../version-2.3.0/widgets/multiselect.md | 89 + .../version-2.3.0/widgets/number-input.md | 97 + .../version-2.3.0/widgets/overview.md | 85 + .../version-2.3.0/widgets/package-lock.json | 32216 ++++++++++++++++ .../version-2.3.0/widgets/pagination.md | 69 + .../version-2.3.0/widgets/password-input.md | 82 + .../version-2.3.0/widgets/pdf.md | 56 + .../version-2.3.0/widgets/qr-scanner.md | 71 + .../version-2.3.0/widgets/radio-button.md | 101 + .../version-2.3.0/widgets/range-slider.md | 76 + .../version-2.3.0/widgets/rich-text-editor.md | 56 + .../version-2.3.0/widgets/spinner.md | 49 + .../version-2.3.0/widgets/star-rating.md | 85 + .../version-2.3.0/widgets/statistics.md | 93 + .../version-2.3.0/widgets/steps.md | 92 + .../version-2.3.0/widgets/svg-image.md | 59 + .../version-2.3.0/widgets/table.md | 329 + .../version-2.3.0/widgets/tabs.md | 116 + .../version-2.3.0/widgets/tags.md | 60 + .../version-2.3.0/widgets/text-input.md | 111 + .../version-2.3.0/widgets/text.md | 77 + .../version-2.3.0/widgets/textarea.md | 70 + .../version-2.3.0/widgets/timeline.md | 63 + .../version-2.3.0/widgets/timer.md | 80 + .../version-2.3.0/widgets/toggle-switch.md | 76 + .../version-2.3.0/widgets/tree-select.md | 157 + .../version-2.3.0/widgets/vertical-divider.md | 57 + .../version-2.3.0-sidebars.json | 369 + docs/versions.json | 1 + 216 files changed, 50211 insertions(+), 1 deletion(-) create mode 100644 docs/static/img/widgets/table/dynamic_column.png create mode 100644 docs/versioned_docs/version-2.3.0/Enterprise/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/Enterprise/audit_logs.md create mode 100644 docs/versioned_docs/version-2.3.0/Enterprise/superadmin.md create mode 100644 docs/versioned_docs/version-2.3.0/Enterprise/white-label.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/actions/close-modal.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/control-component.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/copy-to-clipboard.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/generate-file.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/go-to-app.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/logout.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/open-webpage.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/run-query.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/set-localstorage.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/set-page-var.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/set-table-page.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/set-variable.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/show-alert.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/show-modal.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/switch-page.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/unset-page-var.md create mode 100644 docs/versioned_docs/version-2.3.0/actions/unset-variable.md create mode 100644 docs/versioned_docs/version-2.3.0/app-builder/canvas.md create mode 100644 docs/versioned_docs/version-2.3.0/app-builder/left-sidebar.md create mode 100644 docs/versioned_docs/version-2.3.0/app-builder/overview.md create mode 100644 docs/versioned_docs/version-2.3.0/app-builder/query-panel.md create mode 100644 docs/versioned_docs/version-2.3.0/app-builder/right-sidebar.md create mode 100644 docs/versioned_docs/version-2.3.0/app-builder/toolbar.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/code-of-conduct.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/l10n.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/setup/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/setup/architecture.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/setup/docker.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/setup/macos.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/setup/ubuntu.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/slackcoc.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/testing.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/troubleshooting/eslint.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/create-widget.md create mode 100644 docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/creating-a-plugin.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/airtable.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/amazonses.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/appwrite.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/athena.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/baserow.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/bigquery.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/clickhouse.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/cosmosdb.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/couchdb.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/custom-js.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/dynamodb.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/elasticsearch.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/firestore.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/gcs.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/google.sheets.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/graphql.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/influxdb.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/mailgun.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/mariadb.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/minio.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/mongodb.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/mssql.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/mysql.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/n8n.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/notion.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/openapi.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/oracledb.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/overview.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/postgresql.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/redis.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/restapi.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/rethinkdb.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/run-py.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/s3.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/saphana.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/sendgrid.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/slack.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/smtp.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/snowflake.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/stripe.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/twilio.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/typesense.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/woocommerce.md create mode 100644 docs/versioned_docs/version-2.3.0/data-sources/zendesk.md create mode 100644 docs/versioned_docs/version-2.3.0/getting-started.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/how-to/access-cellvalue-rowdata.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/access-users-groups.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/access-users-location.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/build-plugin-for-marketplace.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/bulk-update-multiple-rows-in-table.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/import-external-lib-py.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/loading-image-pdf-from-db.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/oauth2-authorization.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/run-action-from-runjs.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/run-query-at-specified-intervals.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/s3-custom-endpoint.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/upload-files-aws.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/upload-files-gcs.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/use-axios.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/use-form-component.md create mode 100644 docs/versioned_docs/version-2.3.0/how-to/use-inspector.md create mode 100644 docs/versioned_docs/version-2.3.0/marketplace.md create mode 100644 docs/versioned_docs/version-2.3.0/org-management/permissions.md create mode 100644 docs/versioned_docs/version-2.3.0/release-management/multi-env.md create mode 100644 docs/versioned_docs/version-2.3.0/security.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/setup/client.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/digitalocean.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/docker-local.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/docker.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/ec2.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/ecs.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/env-vars.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/google-cloud-run.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/heroku.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/http-proxy.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/index.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/kubernetes-aks.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/kubernetes-gke.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/kubernetes.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/openshift.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/tooljet-subpath.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/try-tooljet.md create mode 100644 docs/versioned_docs/version-2.3.0/setup/v2-migration.md create mode 100644 docs/versioned_docs/version-2.3.0/tooljet_database.md create mode 100644 docs/versioned_docs/version-2.3.0/tracking.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/actions.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/adding-a-datasource.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/adding-widget.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/app-menu-options.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/building-queries.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/creating-app.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/debugger.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/keyboard-shortcuts.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/manage-users-groups.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/mobile-layout.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/multiworkspace.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/pages.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/sharing-and-deploying.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/transformations.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/versioning-and-release.md create mode 100644 docs/versioned_docs/version-2.3.0/tutorial/workspace-environment-variables.md create mode 100644 docs/versioned_docs/version-2.3.0/user-authentication/general-settings.md create mode 100644 docs/versioned_docs/version-2.3.0/user-authentication/password-login.md create mode 100644 docs/versioned_docs/version-2.3.0/user-authentication/sso/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/user-authentication/sso/github.md create mode 100644 docs/versioned_docs/version-2.3.0/user-authentication/sso/google.md create mode 100644 docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/azuread.md create mode 100644 docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/google-openid.md create mode 100644 docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/okta.md create mode 100644 docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/setup.md create mode 100644 docs/versioned_docs/version-2.3.0/user-authentication/user-lifecycle.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/_category_.json create mode 100644 docs/versioned_docs/version-2.3.0/widgets/bounded-box.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/button-group.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/button.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/calendar.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/chart.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/checkbox.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/circular-progressbar.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/code-editor.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/color-picker.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/container.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/custom-component.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/date-range-picker.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/datepicker.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/divider.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/dropdown.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/file-picker.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/form.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/html.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/icon.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/iframe.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/image.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/kanban-board.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/link.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/listview.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/map.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/modal.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/multiselect.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/number-input.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/overview.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/package-lock.json create mode 100644 docs/versioned_docs/version-2.3.0/widgets/pagination.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/password-input.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/pdf.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/qr-scanner.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/radio-button.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/range-slider.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/rich-text-editor.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/spinner.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/star-rating.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/statistics.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/steps.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/svg-image.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/table.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/tabs.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/tags.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/text-input.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/text.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/textarea.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/timeline.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/timer.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/toggle-switch.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/tree-select.md create mode 100644 docs/versioned_docs/version-2.3.0/widgets/vertical-divider.md create mode 100644 docs/versioned_sidebars/version-2.3.0-sidebars.json diff --git a/docs/docs/widgets/table.md b/docs/docs/widgets/table.md index 22f2a1d232..15b05f6fbd 100644 --- a/docs/docs/widgets/table.md +++ b/docs/docs/widgets/table.md @@ -109,6 +109,32 @@ Along with `changeSet`, `dataUpdates` property will also be changed when the val If the data of a cell is changed, "save changes" button will be shown at the bottom of the table. This button when clicked will trigger the `Bulk update query` event. This event can be used to run a query to update the data on your data source. +### Use dynamic column + +Enabling the **Use dynamic column** toggle will allow users to set the **Column data** where users can link the column data dynamically from a query. + +The **column data** field expects a JSON value: +```json +{ + "name":"Name", + "columnType":"string", + "key":"first_name", + "cellBackgroundColor":"#000", + "textColor":"#fff", + "isEditable":true, + "regex":"", + "maxLength":10, + "minLength":5, + "customRule":"" +} +``` + +
+ +ToolJet - Widget Reference - Table + +
+ ## Validation Under column properties, expand the detailed view of a column type to access a toggle button called `make editable`. You can toggle it `ON` to apply the validations for each column respectively using the following. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index a58f000e82..f7b4717b6e 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -127,7 +127,7 @@ module.exports = { // Please change this to your repo. editUrl: 'https://github.com/ToolJet/Tooljet/blob/develop/docs/', includeCurrentVersion: false, - lastVersion: '2.2.0', + lastVersion: '2.3.0', }, theme: { customCss: require.resolve('./src/css/custom.css'), diff --git a/docs/static/img/widgets/table/dynamic_column.png b/docs/static/img/widgets/table/dynamic_column.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b5c7f2bdeccb80a06cae621b8aea6f09005c09 GIT binary patch literal 457992 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 z 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

a3SB({RpqbuZx+LGOz=ngs^rEgH}WVlWbmD~ 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

$xKdA| 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

yBgCS%_`aN8jLYu4cr{9@@e5Cku*##==h1? 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�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 literal 0 HcmV?d00001 diff --git a/docs/versioned_docs/version-2.3.0/Enterprise/_category_.json b/docs/versioned_docs/version-2.3.0/Enterprise/_category_.json new file mode 100644 index 0000000000..b9b132f890 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/Enterprise/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Enterprise", + "position": 9, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/Enterprise/audit_logs.md b/docs/versioned_docs/version-2.3.0/Enterprise/audit_logs.md new file mode 100644 index 0000000000..a18980d1b1 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/Enterprise/audit_logs.md @@ -0,0 +1,84 @@ +--- +id: audit_logs +title: Audit logs +--- + +

Available on: Enterprise Edition
+ + +The audit log is the report of all the activities done in your ToolJet account. It will capture and display events automatically by recording who performed an activity, what when, and where the activity was performed, along with other information such as IP address. + +
+ +Audit logs + +
+ +### Filter audit logs + +Audited events can be filtered using the below characteristics: + +#### Select Users + +Select a specific user from this dropdown to check all their activities. + +#### Select Apps + +The dropdown will list all the apps present in your account. Choose an app to filter the logs associated with that app. + +#### Select Resources + +| Resources | description | +| ----------- | ----------- | +| User | Filter all the User events like `USER_LOGIN`, `USER_SIGNUP`, `USER_INVITE`, AND `USER_INVITE_REDEEM`. | +| App | Filter all the App events like `APP_CREATE`, `APP_UPDATE`,`APP_VIEW`,`APP_DELETE`,`APP_IMPORT`,`APP_EXPORT`,`APP_CLONE`. | +| Data Query | Filters the events associated with Data Query like `DATA_QUERY_RUN`. | +| Group Permission | All the events associated with Group Permissions will be filtered. Group Permissions include `GROUP_CREATE`, `GROUP_UPDATE`, `GROUP_DELETE`. | +| App Group Permission | Within each group, you can set apps for read or edit privileges. These events get recorded as App Group Permissions. | + +#### Select Actions + +| Actions | description | +| ----------- | ----------- | +| USER_LOGIN | This event is recorded everytime a user logins. | +| USER_SIGNUP | This event is recorded everytime a new signup is made. | +| USER_INVITE | You can invite users to your account from `Manage Users` section and an event is audited everytime an invite is sent. | +| USER_INVITE_REDEEM | This event is recorded whenever an invite is redeemed. | +| APP_CREATE | This event is recorded when a user creates a new app. | +| APP_UPDATE | This event is recorded whenever actions like renaming the app, making the app public, editing shareable link, or deploying the app are made. | +| APP_VIEW | This event is logged when someone views the launched app. (public apps aren't accounted for) | +| APP_DELETE | This event is recorded whenever a user deletes an app from the dashboard. | +| APP_IMPORT | This event is recorded whenever a user imports an app. | +| APP_EXPORT | This event is recorded whenever an app is exported. | +| APP_CLONE | This event is recorded whenever a clone of the existing app is created. | +| DATA_QUERY_RUN | This event is logged whenever a data source is added, a query is created, or whenever a query is run either from the query editor or from the launched app. | +| GROUP_PERMISSION_CREATE | This event is recorded whenever a group is created. | +| GROUP_PERMISSION_UPDATE | This event is recorded whenever an app or user is added to or removed from a group, or the permissions for a group are updated. | +| GROUP_PERMISSION_DELETE | This event is recorded whenever a user group is deleted from an account. | +| APP_GROUP_PERMISSION_UPDATE | For every app added in to user group, you can set privileges like `View` or `Edit` and whenever these privileges are updated this event is recorded. By default, the permission of an app for a user group is set to `View`. | + +:::info +It is mandatory to set a Data Range in `From` and `To` to filter audit logs. +::: + +### Understanding information from logs + +
+ +Audit logs + +
+ + +| Property | description | +| ----------- | ----------- | +| action_type | It is the type of action that was logged in this event. Refer [this](#select-actions) to know about actions. | +| created_at | Displays the date and time of a logged event. | +| id | Every event logged has a specific event id associated with it. | +| ip_address | Displays the IP address from where the event was logged. | +| metadata | Metadata includes two sub-properties - `tooljet_version` and `user_agent`. `tooljet_version` displays the version of ToolJet used for the logged event and `user_agent` contains information about the device and browser used for that event. | +| organization_id | Every organization in ToolJet has an id associated with it and is recorded when an event occurs. | +| resource_id | There are several [resources](#select-resources) and for each resource that is created, an id gets associated with it.| +| resource_name | Displays the name of the [resources](#select-resources) that were logged in the event. For example, if an app was created or deleted then it will display the name of the app. | +| resource_type | Displays the type of the [resources](#select-resources) that were logged in the event. | +| user_id | Every user account in ToolJet has an id associated with it and is recorded when an event occurs. | diff --git a/docs/versioned_docs/version-2.3.0/Enterprise/superadmin.md b/docs/versioned_docs/version-2.3.0/Enterprise/superadmin.md new file mode 100644 index 0000000000..10ebe5551b --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/Enterprise/superadmin.md @@ -0,0 +1,130 @@ +--- +id: superadmin +title: Super Admin +--- + +
Available on: Enterprise Edition
+ +A Super Admin is the user who has full access to all the Workspaces, Users, and Groups of an instance. An instance can have more than one Super Admin. A Super Admin has full control over other users' workspaces and can create users, groups, and other super admins. + +The user details entered while setting up ToolJet will have Super Admin privileges. + +## How is Super Admin different from Admin + +| Privilege | Admin | Super Admin | +| --------- | ----- | ----------- | +| Manage Users in their workspace (Invite/Archive/Unarchive) | ✅ | ✅ | +| Manage Groups in their workspace (Create Group/Add or Delete Users from groups/ Modify Group Permissions) | ✅ | ✅ | +| Manage SSO in their workspace | ✅ | ✅ | +| Manage Workspace Variables in their workspace | ✅ | ✅ | +| [Access any user's personal workspace (create, edit or delete apps)](#access-any-workspace) | ❌ | ✅ | +| [Archive Admin or any user of any workspace](#archiveunarchive-users) | ❌ | ✅ | +| [Access any user's ToolJet database (create, edit or delete database)](#access-tooljet-db-in-any-workspace) | ❌ | ✅ | +| [Manage any workspace's setting (Groups/SSO/Workspace Variables)](#manage-workspace-setting-groupsssoworkspace-variables) | ❌ | ✅ | +| [Manage all users from all the workspaces in the instance](#checking-all-the-users-in-the-instance) | ❌ | ✅ | +| [Make any user Super Admin](#make-the-user-super-admin) | ❌ | ✅ | +| [Restrict personal workspace of invited users](#allow-users-to-create-personal-workspace) | ❌ | ✅ | + +
+ +Super Admin: Enterprise + +
+ +## Super Admin features + +### Access any workspace + +If a user is a Super Admin then they can switch to any workspace created by any user in the instance from the dropdown on the top-left of dashboard that is used to switch between workspaces. + +The dropdown will list all the workspaces including workspaces created by the Super Admin or Any User. + +
+ +Super Admin: Enterprise + +
+ +### Create Edit or Delete apps from any user's personal workspace + +Once the Super Admin accesses the workspace of any other user, they can create, edit or delete app on the workspace. + +This also includes - modifying folders and importing, exporting, or cloning apps to any user's workspace. + +### Archive/Unarchive Users + +Super Admin can not only archive/unarchive users/admins on their workspace but also from the workspaces of any other user. + +If a user is Super Admin, they just need to open the workspace in which they want to archive or unarchive a user. Then go to the **Workspace Settings** from the sidebar -> **Manage Users** -> **Archive/Unarchive** any user/admin + +
+ +Super Admin: Enterprise + +
+ +### Access ToolJet DB in any workspace + +Super Admins have access to the database of any user's workspace - just like Super Admins can access any application in any workspace. They have full access to modify or create any table in the ToolJet DB of any workspace. + +### Manage Workspace Settings (Groups/SSO/Workspace Variables) + +Super Admins have all the privileges that an Admin of a workspace have, Super Admins can: +- **✅ Manage Groups**: Creating/Deleting/Updating a Group in any workspace +- **✅ Manage SSO**: Full control over General Settings, Password login and other SSO options +- **✅ Workspace Variables**: Adding, updating or deleting workspace variables + +## Instance Settings + +Only Super Admins can access the Instance Settings: + +- **Manage All Users** +- **Manage Instance Settings** + +### Checking all the users in the instance + +**Manage All Users** can be used to check all the users that are there - altogether from all the workspaces in an instance. + +
+ +Super Admin: Enterprise + +
+ +### Archiving a user from workspace + +Super Admins have the privilege to remove any user from any of the workspace they belong. + +Super Admins can go to **Manage All Users** page, Under the **Workspaces** column they'll see the number of workspaces a user belongs to. Click on the **`View(n)`**, a modal will pop up that will have the list of **`n`** number the workspaces, click on the **Archive/Unarchive** button next to the workspace name to remove the user from the workspace. + +
+ +Super Admin: Enterprise + +
+ +### Make the user super admin + +Super Admins can make any user as Super Admin or remove any Super Admin from the **Manage All Users** in the Instance Settings page. + +Click on the **Edit** button next to any user, **Enable** the **Make the user Super Admin** option, and then **Save** it. + +The user will become Super Admin and the Type column will update from **`workspace`** to **`instance`**. + +
+ +Super Admin: Enterprise + +
+ +### Allow users to create personal workspace + +When a user joins a workspace, they are provided with their own personal workspace and option to create new workspaces. + +Super Admins can control this behavior from the Manage Instance Settings page, they can **toggle off** the option to **Allow personal workspace**. Now whenever a user joins a workspace they won't be provided a personal workspace nor they will be able to create a new workspace in the instance. + +
+ +Super Admin: Enterprise + +
diff --git a/docs/versioned_docs/version-2.3.0/Enterprise/white-label.md b/docs/versioned_docs/version-2.3.0/Enterprise/white-label.md new file mode 100644 index 0000000000..6848686df6 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/Enterprise/white-label.md @@ -0,0 +1,39 @@ +--- +id: white-label +title: White Label +--- + +
Available on: Enterprise Edition
+ +White Label feature will allow you to remove the ToolJet branding from the ToolJet platform and add your own custom logo and text. + +This feature allows you to rebrand the following: +- **App logo** (Logo on login screen, dashboard, and app-editor) +
+ + ToolJet - Enterprise - White label + +
+ +
+ + ToolJet - Enterprise - White label + +
+ +- **Favicon** + +- **Page Title** (next to Favicon) +
+ + ToolJet - Enterprise - White label + +
+ +## Configuration + +To enable white labelling, you'll need to set the below mentioned **environment variables** in the .env file: + +- `WHITE_LABEL_LOGO`: URL of the logo. Preferred dimensions of the logo are: width 130px and height 26px +- `WHITE_LABEL_TEXT`: The text that you want to display as Page Title +- `WHITE_LABEL_FAVICON`: URL of the favicon. Preferred dimensions of the logo are: 16x16px or 32x32px \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/actions/_category_.json b/docs/versioned_docs/version-2.3.0/actions/_category_.json new file mode 100644 index 0000000000..f5b2dfe045 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Actions Reference", + "position": 7, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/actions/close-modal.md b/docs/versioned_docs/version-2.3.0/actions/close-modal.md new file mode 100644 index 0000000000..bb772142f9 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/close-modal.md @@ -0,0 +1,19 @@ +--- +id: close-modal +title: Close modal +--- + +Use this action to close the modal that is already shown. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference - Close modal + +
+ diff --git a/docs/versioned_docs/version-2.3.0/actions/control-component.md b/docs/versioned_docs/version-2.3.0/actions/control-component.md new file mode 100644 index 0000000000..3a959c2921 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/control-component.md @@ -0,0 +1,98 @@ +--- +id: control-component +title: Control component (Component Specific Actions) +--- + +Control component action invokes the component specific actions. Component specific actions are the actions that are exclusive actions for a particular widget. Component specific actions can be triggered either through the event handlers or from the Run JavaScript code query. + +:::info +Check out the **[live demo](https://youtu.be/JIhSH3YeM3E)** of Component specific actions demonstrated in one of our community call. +::: + +## Available Component Specific Actions + +| Widget | Component Specific Actions | +|--------|---------------------------| +| Button | Click, Set label, Disable, Visibility, Loading | +| Checkbox | Set checked | +| Color picker | Set color | +| Dropdown | Select option | +| File picker | Clear files | +| Kanban | Add card, Delete card, Move card, Update card data | +| Map | Set location | +| Modal | Show, Close | +| Multiselect | Select option, Deselect option, Clear selection | +| Radio button | Select option | +| Tabs | Set tab | +| Table | Set page, Select row, Deselect Row, Discard changes | +| Text | Set text, Set Visibility | +| Text Area | Set text, Clear | +| Text Input | Set text, Clear, Set Focus, Set Blur, Disable, Visibility | + +:::info +Currently, Component specific actions are supported only by the above listed widgets. We are working on bringing component specific actions for the remaining widgets. +::: + +## Using Component Specific Actions + +### Set a value for text input widget using button's event handler + +- Drag a **Text Input** and a **Button** widget onto the canvas. + +- Go to the **Inspector** on the left sidebar to check the exposed variables available for the `textinput1` widget under the `components`. You'll see that the variable `value` is an empty string because the field value of the text input widget is empty right now. + +
+ +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/inspector.png) + +
+ +- Now enter some value in the text input widget and you'll see that the `value` in inspector has been updated. + +
+ +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/updated.png) + +
+ +- Now, click on the button's widget handler to open up its properties in the right sidebar and then add a event handler for **On Click** event to trigger **Control Component** action. Select `textinput1` in component dropdown, `Set text` as Action, and in `Text` field enter the text that you want to update in the field value. + +
+ +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/button.png) + +
+ +- Now when you'll click on the button you'll see that the field value of the text input widget has been updated with value that you set. + +
+ +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/set.png) + +
+ + +### Clear value of text input widget using JavaScript query + +- Let's clear the value that we set in the previous section, using Run JavaScript code. Create a new Run JavaScript Code query and call the component and the CSA that component provides. + +**Syntax:** +```js +await components.textinput1.clear() +``` + +
+ +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/jsoption.png) + +
+ + +
+ +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/clear.png) + +
+ +- Finally, hit the **save and run** query button to fire up the query, and you'll see that the field value of the text input widget has been cleared. + diff --git a/docs/versioned_docs/version-2.3.0/actions/copy-to-clipboard.md b/docs/versioned_docs/version-2.3.0/actions/copy-to-clipboard.md new file mode 100644 index 0000000000..81f97c360e --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/copy-to-clipboard.md @@ -0,0 +1,18 @@ +--- +id: copy-to-clipboard +title: Copy to clipboard +--- + +Use this action to copy the text to the clipboard. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference - Copy to clipboard + +
diff --git a/docs/versioned_docs/version-2.3.0/actions/generate-file.md b/docs/versioned_docs/version-2.3.0/actions/generate-file.md new file mode 100644 index 0000000000..8484d291a5 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/generate-file.md @@ -0,0 +1,42 @@ +--- +id: generate-file +title: Generate file +--- + +# Generate file + +This action allows you to construct files on the fly and let users download it. +Presently, the only file type supported is `CSV`. + +## Options + +| Option | Description | +|--------|-------------| +| Type | Type of file to be generated | +| File name | Name of the file to be generated | +| Data | Data that will be used to construct the file. Its format will depend on the file type, as specified in the following section | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +### Data format for CSV + +For `CSV` file type, the data field should be supplied with an array objects. ToolJet assumes that the keys of each of +these objects are the same and that they represent the column headers of the csv file. + +Example: + +```javascript +{{ + [ + { name: 'John', email: 'john@tooljet.com' }, + { name: 'Sarah', email: 'sarah@tooljet.com' }, + ] +}} +``` + +Supplying the above snippet will generate a csv file which looks like this: + +```csv +name,email +John,john@tooljet.com +Sarah,sarah@tooljet.com +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/actions/go-to-app.md b/docs/versioned_docs/version-2.3.0/actions/go-to-app.md new file mode 100644 index 0000000000..02d15e6aef --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/go-to-app.md @@ -0,0 +1,20 @@ +--- +id: go-to-app +title: Go to app +--- + +This action allows you to open any ToolJet application when an event occurs. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference - Open webpage + +
+ + diff --git a/docs/versioned_docs/version-2.3.0/actions/logout.md b/docs/versioned_docs/version-2.3.0/actions/logout.md new file mode 100644 index 0000000000..0e3187471c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/logout.md @@ -0,0 +1,18 @@ +--- +id: logout +title: Logout +--- + +This action allows you to log out of the application (ToolJet). + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference -  Logout + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/actions/open-webpage.md b/docs/versioned_docs/version-2.3.0/actions/open-webpage.md new file mode 100644 index 0000000000..749b205eb9 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/open-webpage.md @@ -0,0 +1,18 @@ +--- +id: open-webpage +title: Open webpage +--- + +You can use this action to open a webpage(on a new tab) for any event. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference - Open webpage + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/actions/run-query.md b/docs/versioned_docs/version-2.3.0/actions/run-query.md new file mode 100644 index 0000000000..55eb1f16aa --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/run-query.md @@ -0,0 +1,18 @@ +--- +id: run-query +title: Run Query +--- + +This action allows you to fire queries when an event occurs. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference -  Run Query + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/actions/set-localstorage.md b/docs/versioned_docs/version-2.3.0/actions/set-localstorage.md new file mode 100644 index 0000000000..3dead574aa --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/set-localstorage.md @@ -0,0 +1,59 @@ +--- +id: set-localstorage +title: Set localStorage +--- + +# Set localStorage + +This action allows you to specify a `key` and its corresponding `value` to be stored in localStorage. + +## Example: App that stores a name in localStorage and displays it on reload + +1. Add an input field, button and a text as shown + +
+ +![ToolJet - Action reference -Set local storage sample app](/img/actions/localstorage/1.png) + +
+ +2. Select the button and add a `Set localStorage` action with `key` set to `name` and value pointing at the value of the text field + +
+ +![ToolJet - Action reference -Set local storage sample app](/img/actions/localstorage/2.png) + +
+ +3. Select the text label we've added and set its value to the name item from localStorage. + +:::info +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` +::: + +
+ +![ToolJet - Action reference -Set local storage sample app](/img/actions/localstorage/debounce.png) + +
+ + +4. Now save the application, this is important as we're about to reload the page. + +5. Type in anything you wish on the input box and click on the button + +
+ +![ToolJet - Action reference -Set local storage sample app](/img/actions/localstorage/5.png) + +
+ + +6. Reload the page, you'll see that the value stored in local storage is persisted and it is displayed on screen! + +
+ +![ToolJet - Action reference -Set local storage sample app](/img/actions/localstorage/6.png) + +
+ diff --git a/docs/versioned_docs/version-2.3.0/actions/set-page-var.md b/docs/versioned_docs/version-2.3.0/actions/set-page-var.md new file mode 100644 index 0000000000..1129a32e96 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/set-page-var.md @@ -0,0 +1,20 @@ +--- +id: set-page-variable +title: Set page variable +--- + +Page variables can only be accessed within a page on which they are created, unlike normal variables that can be accessed throughout the application. + +Use this action to create a variable and assign a `value` to it in the [Multipage Apps](/docs/tutorial/pages). + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference - Switch page + +
diff --git a/docs/versioned_docs/version-2.3.0/actions/set-table-page.md b/docs/versioned_docs/version-2.3.0/actions/set-table-page.md new file mode 100644 index 0000000000..6c6414650c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/set-table-page.md @@ -0,0 +1,24 @@ +--- +id: set-table-page +title: Set Table Page +--- + +Use this action to change the page index in the table widget. + +## Options + +| Option | Description | +|--------|-------------| +| Table | Select table from the dropdown | +| Page Index | Numerical value for the page index. ex: `{{2}}` | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference - Open webpage + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/actions/set-variable.md b/docs/versioned_docs/version-2.3.0/actions/set-variable.md new file mode 100644 index 0000000000..ef611d43ba --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/set-variable.md @@ -0,0 +1,24 @@ +--- +id: set-variable +title: Set variable +--- + +This action allows you to create a variable and assign a `value` to it. + +## Options + +| Option | Description | +|--------|-------------| +| Key | Name(String) of the variable through which you can access the value | +| Value | A value can be a string, number, boolean expression, array, or object | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference -Set variable + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/actions/show-alert.md b/docs/versioned_docs/version-2.3.0/actions/show-alert.md new file mode 100644 index 0000000000..f92ec12cd7 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/show-alert.md @@ -0,0 +1,23 @@ +--- +id: show-alert +title: Show alert +--- + +This action allows you to display an alert message. + +You can set a custom **message** for the alert and choose a particular alert type. + +There are 4 types of alert messages - **Info**, **Success**, **Warning**, and **Error**. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference -  Show Alert + +
+ diff --git a/docs/versioned_docs/version-2.3.0/actions/show-modal.md b/docs/versioned_docs/version-2.3.0/actions/show-modal.md new file mode 100644 index 0000000000..10f5d9ab17 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/show-modal.md @@ -0,0 +1,18 @@ +--- +id: show-modal +title: Show modal +--- + +Use this action to show the modal for an event. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference - Show modal + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/actions/switch-page.md b/docs/versioned_docs/version-2.3.0/actions/switch-page.md new file mode 100644 index 0000000000..db07767412 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/switch-page.md @@ -0,0 +1,18 @@ +--- +id: switch-page +title: Switch Page +--- + +Use this action with different events to switch to a different page in the [Multipage App](/docs/tutorial/pages). + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference - Switch page + +
diff --git a/docs/versioned_docs/version-2.3.0/actions/unset-page-var.md b/docs/versioned_docs/version-2.3.0/actions/unset-page-var.md new file mode 100644 index 0000000000..16dcfb84bf --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/unset-page-var.md @@ -0,0 +1,18 @@ +--- +id: unset-page-variable +title: Unset page variable +--- + +Use this action to clear the variable that was created using the set page variable action. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference - Switch page + +
diff --git a/docs/versioned_docs/version-2.3.0/actions/unset-variable.md b/docs/versioned_docs/version-2.3.0/actions/unset-variable.md new file mode 100644 index 0000000000..1e6b35f99f --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/actions/unset-variable.md @@ -0,0 +1,23 @@ +--- +id: unset-variable +title: Unset variable +--- + +This action allows you to remove the variable variable that was created using the set variable action. + +## Options + +| Option | Description | +|--------|-------------| +| Key | Name(String) of the variable through which you can access the value | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
+ +ToolJet - Action reference -Unset variable + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/app-builder/canvas.md b/docs/versioned_docs/version-2.3.0/app-builder/canvas.md new file mode 100644 index 0000000000..73e5a253d8 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/app-builder/canvas.md @@ -0,0 +1,55 @@ +--- +id: canvas +title: Canvas +--- + +Canvas is the center area of the ToolJet app builder where the application is built. You arrange the **components** by dragging them from the Components library(right-sidebar). + +
+ +App Builder: Canvas + +
+ +### Arrange Components + +All the components are fully interactive in editor mode - to prevent interaction you can **click and hold** the **[Component Handle](docs/app-builder/components-library)** to change component's position. + +
+ +App Builder: Canvas + +
+ +### Resize Components + +Components on the canvas can be resized from the edges. + +You can precisely set the position of selected components using keyboard arrow keys after clicking the component handle. + +
+ +App Builder: Canvas + +
+ +### Group Components + +ToolJet comes with flexible components to group other components together, such as **Container** and **Form**. When you drag and drop components in containers/forms they create a group of nested components. All components can be nested in this way. + +### Hide or Disable Components + +Hide or Disable a component by setting its **Visibility** or **Disabled** property to `true`. Click on the component handle to open **config inspector** on right side. These values can also evaluate to true based on a truthy value. For example, you can use the property of one component to toggle the Visibility property of another component dynamically, you just need to write a conditional statement. + +For example: We want to disable a button when a checkbox is checked so we can simple use `{{components.checkbox1.value}}` in **Disable** property of the button. `{{components.checkbox1.value}}` evaluates to `true` when the checkbox is checked, and false when unchecked. + +
+ +App Builder: Canvas + +
+ +### Clone Components + +You can clone existing components on the canvas by **cmd/ctrl + d**. Check other **[Keyboard Shortcuts](/docs/tutorial/keyboard-shortcuts)** + diff --git a/docs/versioned_docs/version-2.3.0/app-builder/left-sidebar.md b/docs/versioned_docs/version-2.3.0/app-builder/left-sidebar.md new file mode 100644 index 0000000000..c67d7ec43f --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/app-builder/left-sidebar.md @@ -0,0 +1,68 @@ +--- +id: left-sidebar +title: Left-sidebar +--- + +Left-sidebar has the following options: + +- **[Pages](#pages)** +- **[Inspector](#inspector)** +- **[Datasources Manager](#datasources-manager)** +- **[Debugger](#debugger)** +- **[Theme switch](#theme-switch)** + +
+ +App Builder: Left-sidebar + +
+ +## Pages + +Pages allows you to have multiple pages in a single application, making your ToolJet applications more robust and user-friendly. + +Check the detailed documentation for **[Pages](/docs/tutorial/pages)**. + +
+ +App Builder: Left-sidebar + +
+ +## Inspector + +The Inspector can be used to inspect the data of the **queries**, properties and values of the **components** that are there on the canvas, ToolJet's global variables and the variables that have been set by the user. + +Check the detailed guide on **[using Inspector](/docs/how-to/use-inspector)**. + +
+ +App Builder: Left-sidebar + +
+ +## Datasources Manager + +Datasources Manager is used to connect or remove the datasources. + +Check the detailed **[Datasources documentation](/docs/data-sources/overview)**. + +
+ +App Builder: Left-sidebar + +
+ +## Debugger + +The debugger captures errors that happens while running the queries. For example, when a database query fails due to the unavailability of a database or when a REST API query fails due to an incorrect URL, the errors will be displayed on the debugger. The debugger also displays relevant data related to the error along with the error message. + +
+ +App Builder: Left-sidebar + +
+ +## Theme switch + +Switch ToolJet into light or dark mode from this button. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/app-builder/overview.md b/docs/versioned_docs/version-2.3.0/app-builder/overview.md new file mode 100644 index 0000000000..f2c53bdcb1 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/app-builder/overview.md @@ -0,0 +1,20 @@ +--- +id: overview +title: Overview +--- + +# App-Builder: Overview + +ToolJet's App Builder allows you to build applications. ToolJet's app builder has the following major components: + +- **[Toolbar](/docs/app-builder/toolbar)**: configure app settings +- **[Canvas](/docs/app-builder/canvas)**: Arrange the components to build the interface of app +- **[Left-sidebar](/docs/app-builder/left-sidebar)**: Add **[pages](/docs/tutorial/pages)**, **[datasources](/docs/data-sources/overview)**, **[inspect](/docs/how-to/use-inspector)** the components, queries or variables, and **[debug](#debugger)** the errors. +- **[Components library](/docs/app-builder/components-library)**(right sidebar): Drag any component or modify the property or styling +- **[Query Panel](/docs/app-builder/query-panel)**: Create, edit or manage the queries + +
+ +App Builder: Overview + +
diff --git a/docs/versioned_docs/version-2.3.0/app-builder/query-panel.md b/docs/versioned_docs/version-2.3.0/app-builder/query-panel.md new file mode 100644 index 0000000000..1b54f3634b --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/app-builder/query-panel.md @@ -0,0 +1,177 @@ +--- +id: query-panel +title: Query Panel +--- + +The Query Panel is present at the bottom of the app-builder, this is where you create queries to interact with connected datasources. You can perform API requests, query **[databases](/docs/data-sources/overview)**, or **[transform](/docs/tutorial/transformations)** or manipulate data with **[JavaScript](/docs/data-sources/run-js)** & **[Python](/docs/data-sources/run-py)**. + +The Query Panel has two sections: +- **[Query Manager](#query-manager)** on the right that includes a list of all the created queries +- **[Query Editor](#query-editor)** is used to configure the selected query + +
+ +App Builder: Component library- right sidebar + +
+ +## Query Manager + +Query Manager will list all the queries that has been created in the application. Query Manager is used to: + +### Search + +On the top of the query manager is search box that can be used to search for a specific query. + +
+ +App Builder: Component library- right sidebar + +
+ +### Add + +Add button is used to add more queries in the application. When Add button is clicked, the Query Editor will show you a list of options for creating a query from: **Rest API**, connected **[datasources](/docs/data-sources/overview)**, **[ToolJet Database](/docs/tooljet-database)**, **[JavaScript Code](/docs/data-sources/run-js)**, **[Python Code](/docs/data-sources/run-py)** or Add a new datasource. + +
+ +App Builder: Component library- right sidebar + +
+ +### Delete + +Delete button will delete the selected query, the button will only show up when you hover over the query name. + +
+ +App Builder: Component library- right sidebar + +
+ +### Edit + +Edit button is used edit the name of the selected query, the button will only show up when you hover over the query name. + +
+ +App Builder: Component library- right sidebar + +
+ +## Query Editor + +Query editor used to configure the query parameters, preview or transform the data return by the query. + +
+ +App Builder: Component library- right sidebar + +
+ +### Topbar + +On the top of the query panel there are a few options: + +#### Query Name editor + +Edit the name of the query by clicking on the edit button next to the default query name. + +
+ +App Builder: Component library- right sidebar + +
+ +#### Preview + +Preview gives you a quick look at the data returned by the query without triggering the query in the app. + +The Preview of data is returned in two different formats: + +**Raw** + +
+ +App Builder: Component library- right sidebar + +
+ +**JSON** + +
+ +App Builder: Component library- right sidebar + +
+ +#### Save + +Save is used to save the changes whenever a change is made in query. + +
+ +App Builder: Component library- right sidebar + +
+ +#### Run + +Run is used to trigger the query, running the query will interact with the application unlike `Preview`. + +
+ +App Builder: Component library- right sidebar + +
+ +### Query Parameters + +Query Parameters are the values required for the query to return a response from the server. Parameters include **endpoints**, **methods**, or **operations**. Query Parameters are different for each datasource. + +
+ +App Builder: Component library- right sidebar + +
+ +### Transformation + +Transformations can be enabled on queries to transform the query results. ToolJet allows you to transform the query results using two programming languages JavaScript & Python. Check the detailed documentation on **[Transformations](/docs/tutorial/transformations)**. + +
+ +App Builder: Component library- right sidebar + +
+ +### Advanced options + +#### Run this query on application load? + +Enabling this option will fire the query every time the app is loaded. + +#### Request confirmation before running the query? + +Enabling this option show a confirmation modal to confirm `Yes` or `No` if you want to fire that query. + +#### Run this query on application load? + +Enabling this option show a success toast notification when the query is successfully triggered. + +#### Event Handlers + +Event Handler are used to add some action when a particular event happens. You can add event handlers to the query for the following events: + +- **Query Success** +- **Query Failure** + +:::info +Learn more about [Event Handlers and Actions](/docs/widgets/overview#component-event-handlers). +::: + +
+ +App Builder: Component library- right sidebar + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/app-builder/right-sidebar.md b/docs/versioned_docs/version-2.3.0/app-builder/right-sidebar.md new file mode 100644 index 0000000000..3b371a8641 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/app-builder/right-sidebar.md @@ -0,0 +1,29 @@ +--- +id: components-library +title: Components Library +--- + +The **Components Library** on the right sidebar contains all of the available components. Use this to drag-and-drop a component from the library to the canvas. It organizes components into sections and you can enter a search term to quickly find a component you need. + +
+ +App Builder: Component library- right sidebar + +
+ +:::tip +Check the **[Components Catalog](/docs/widgets/overview)** here to know more about specific component. +::: + +## Component Config Inspector + +The Component Config Inspector is also called as component inspector. It contains all the available settings for the selected component and is where you **set values**, **update component names**, and **create event handlers**. The Compoenent Inspector organizes settings into different sections, such as **Property** and **Styles**. + +To open the Component Config Inspector, click on the component handle that is present on the top of the component including **⚙️ + Component Name** and the component inspector will open up on the right side: + +
+ +App Builder: Component library- right sidebar + +
+ diff --git a/docs/versioned_docs/version-2.3.0/app-builder/toolbar.md b/docs/versioned_docs/version-2.3.0/app-builder/toolbar.md new file mode 100644 index 0000000000..03a26077f0 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/app-builder/toolbar.md @@ -0,0 +1,133 @@ +--- +id: toolbar +title: Toolbar +--- + +Toolbar is present at the top of the app-builder, and is used to configure the app settings. + +
+ +App Builder: Toolbar + +
+ +### App name + +App name can be edited from the left side of the toolbar next to the ToolJet logo. + +When a new app is created, by default its name is set to **Untitled app** + +
+ +App Builder: Toolbar + +
+ +### Global Settings + +To configure the app's global settings, click on the kebab menu(three vertical dots) on the left of the app name. Global settings include: + +- **Hide heaeder for launched apps**: Toggle this on to the hide the tooljet's header when the applications are launched +- **Maintenance mode**: Toggle this on to put the application in maintenance mode. When in **maintenance mode**, on launching the app, the user will get an error message that **the app is under maintenance**. +- **Max width of canvas**: Modify the width of the canvas in **px** or **%**. The default width is 1292 px. +- **Max height of canvas**: Modify the width of the canvas in **px** or **%**. The default height is 2400 px and currently it is the maximum height limit. +- **Background color of canvas**: Enter the hex color code or choose a color from the picker to change the background color of the canvas. You can also click on the **Fx** to programmatically set the value. + +
+ +App Builder: Toolbar + +
+ +### Desktop or Mobile layout + +Switch the canvas mode in Mobile or Desktop layout from the toolbar. + +#### Adding existing component to mobile layout + +Click on the component handle to open component config inspector on the right side. Scroll down to the **Layout** section and enable Mobile Layout. The width of the widget will be adjusted to fit the Mobile Layout. + +#### Adding a new component to mobile layout + +Switch the layout to mobile by clicking the button on the toolbar. Drag and drop a component to the canvas. This widget will not be shown on desktop layout unless **Show on desktop** is enabled from the component config inspector. + +:::info +Width of the component will be automatically adjusted to fit the screen while viewing the application in app viewer. +::: + +
+ +App Builder: Toolbar + +
+ +### Undo or Redo + +Use the undo or redo buttons from the toolbar to undo or redo any change on the canvas. + +You can also **[Keyboard Shortcuts](/docs/tutorial/keyboard-shortcuts)** to perform such actions. + +
+ +App Builder: Toolbar + +
+ +### Version Manager + +Create or Remove Versions of the applications from the Version Manager. You can also edit the version name from the edit button. + +When many developers are working on an app, **Versioning** allows them to save their own version of the app. This also prevents developers from overwriting the other developer's work. + +
+ +App Builder: Toolbar + +
+ +### Comments + +Comment anywhere on the canvas and collaborate with other users in the workspace. Click on the comments button to enable it and then drop comment anywhere on the canvas. + +
+ +App Builder: Toolbar + +
+ +### Share + +Share your applications with a unique URL generated automatically or edit the URL slug to personalize it. + +- When **Make the application public** is off and URL is shared then the users will have to login to ToolJet to use the application. Toggle on the option then anyone on the internet will be able to access the application without logging in to ToolJet. +- ToolJet generates the **Embedded link** which can be used to embed application on the webpages. + +
+ +App Builder: Toolbar + +
+ +### Preview + +Clicking on **Preview** button will open up the currently opened version of the app in the new tab. This is really handy when the app developer wants to immediately check the app preview in production. + +
+ +App Builder: Toolbar + +
+ +### Release + +Release the app to publish the current version of the app and push the changes into the production. + +:::caution +ToolJet will block editing of the Released version of an app and will display a prompt to create a new version to make the changes. This is to prevent accidentally pushing an unfinished app to the live version. +::: + +
+ +App Builder: Toolbar + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/_category_.json b/docs/versioned_docs/version-2.3.0/contributing-guide/_category_.json new file mode 100644 index 0000000000..317067020d --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Contributing Guide", + "position": 11, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/code-of-conduct.md b/docs/versioned_docs/version-2.3.0/contributing-guide/code-of-conduct.md new file mode 100644 index 0000000000..03f7184d51 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/code-of-conduct.md @@ -0,0 +1,81 @@ +--- +id: code-of-conduct +title: Contributor Code of Conduct +--- + +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at hello@tooljet.com . All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/l10n.md b/docs/versioned_docs/version-2.3.0/contributing-guide/l10n.md new file mode 100644 index 0000000000..196a10aba2 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/l10n.md @@ -0,0 +1,69 @@ +--- +id: l10n +title: Localization +--- + +Welcome to ToolJet Localization Guide. The goal of the Localization is to make ToolJet easy to use and close to all countries, languages, and general cultural groups. On this page, you will find instructions on how to contribute to ToolJet through Localization and make a more friendly ToolJet for all regions. + +## Adding Translations + +- For adding the translations of your language in ToolJet, you'll need to create a new **languagecode.json** file which will include all the translations for the keywords in your language, and then list the language in the **languages.json** file for the language to be listed in the dashboard of the ToolJet. + +- Go to the **frontend** directory which is at the root of ToolJet, then go to the **assets** and inside assets, you'll find the **translations** directory. You have created a new json file with the **language code** as the file name. The language code should follow [ISO 639-1 Code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes). + + ``` + \frontend + |--\assets + |--\--\translations + |--\--\--\languages.json + |--\--\--\en.json + ``` + +
+ + files + +
+ +- Let's localize ToolJet in the **French** language. Create a new json file inside the translations directory and name it **fr.json**. `fr` is the language code for French. + +- After creating the new file, open the **en.json** file and copy all the contents of the file to the newly created **fr.json**. + +
+ + files + +
+ +- Once copied, you can now start adding the translations for the keywords in the french language. + +- After completing the translation, all you need to do is list the language in **languages.json** file. You'll need to add an object with three key-value pairs. **lang** - the name of the language that you added, **code** - the language code, and the **nativeLang** - name of language in the native. + + ```js + { + "languageList": + [ + { "lang": "English", "code": "en", "nativeLang": "English" }, + { "lang": "French", "code": "fr", "nativeLang": "Français" } + ] + } + ``` + + + +:::note +Feel free to reach us on [Slack](https://tooljet.com/slack) for any help related to Localization. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/setup/_category_.json b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/_category_.json new file mode 100644 index 0000000000..90bb09deae --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Setup", + "position": 1, + "collapsed": true +} diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/setup/architecture.md b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/architecture.md new file mode 100644 index 0000000000..763ddcd622 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/architecture.md @@ -0,0 +1,25 @@ +--- +id: architecture +title: Architecture +--- +# Introduction + +ToolJet has two main components: **ToolJet Server** and **ToolJet Client**. + +### 1. ToolJet Server + +ToolJet server is a Node.js API application. Server is responsible for authentication, authorization, persisting application definitions, running queries, storing data source credentials securely and more. + +**Dependencies:** +- **PostgreSQL** - ToolJet server persists data to a postgres database. +- **Email service** (SMTP/Sendgrid/Mailgun/etc) - Required to send user invitations and password reset emails. +- **PostgREST (Optional)** - Standalone web server that converts PostgreSQL database into queryable RESTful APIs for Tooljet Database. + +### 2. ToolJet Client + +ToolJet client is a ReactJS application. Client is responsible for visually editing the applications, building & editing queries, rendering applications, executing events and their trigger, etc. + +## Requirements + +1. **Node version 18.3.0** +2. **npm version 8.11.0** diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/setup/docker.md b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/docker.md new file mode 100644 index 0000000000..899918f4eb --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/docker.md @@ -0,0 +1,182 @@ +--- +id: docker +title: Docker +--- + +# Docker + +Docker compose is the easiest way to setup ToolJet server and client locally. + +:::info +If you rather want to try out ToolJet locally with docker, you can follow the steps [here](https://docs.tooljet.com/docs/setup/docker-local). +::: + +## Prerequisites + +Make sure you have the latest version of `docker` and `docker-compose` installed. + +[Official docker installation guide](https://docs.docker.com/desktop/) + +[Official docker-compose installation guide](https://docs.docker.com/compose/install/) + +We recommend: + +```bash +docker --version +Docker version 19.03.12, build 48a66213fe + +docker-compose --version +docker-compose version 1.26.2, build eefe0d31 +``` + +## Setting up + +:::tip +If you are setting up on a Windows machine, we advise you to setup Docker desktop with WSL2. +Please find more information [here](https://docs.docker.com/desktop/windows/wsl/). +::: + +1. Clone the repository + ```bash + git clone https://github.com/tooljet/tooljet.git + ``` + +2. Create a `.env` file by copying `.env.example`. More information on the variables that can be set is given in the [environment variables reference](/docs/setup/env-vars) + ```bash + cp .env.example .env + cp .env.example .env.test + ``` + +3. Populate the keys in the `.env` and `.env.test` file + :::info + `SECRET_KEY_BASE` requires a 64 byte key. (If you have `openssl` installed, run `openssl rand -hex 64` to create a 64 byte secure random key) + + `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) + ::: + :::tip + If you are setting up on a Windows machine. Please make sure that .env file line endings to be LF as it will be CRLF by default unless configured for Windows machine. + ::: + + Example: + + ```bash + cat .env + TOOLJET_HOST=http://localhost:8082 + LOCKBOX_MASTER_KEY=13c9b8364ae71f714774c82498ba328813069e48d80029bb29f49d0ada5a8e40 + SECRET_KEY_BASE=ea85064ed42ad02cfc022e66d8bccf452e3fa1142421cbd7a13592d91a2cbb866d6001060b73a98a65be57e65524357d445efae00a218461088a706decd62dcb + NODE_ENV=development + # DATABASE CONFIG + PG_HOST=postgres + PG_PORT=5432 + PG_USER=postgres + PG_PASS=postgres + PG_DB=tooljet_development + ORM_LOGGING=all + ``` + + ```bash + cat .env.test + TOOLJET_HOST=http://localhost:8082 + LOCKBOX_MASTER_KEY=13c9b8364ae71f714774c82498ba328813069e48d80029bb29f49d0ada5a8e40 + SECRET_KEY_BASE=ea85064ed42ad02cfc022e66d8bccf452e3fa1142421cbd7a13592d91a2cbb866d6001060b73a98a65be57e65524357d445efae00a218461088a706decd62dcb + NODE_ENV=test + # DATABASE CONFIG + PG_HOST=postgres + PG_PORT=5432 + PG_USER=postgres + PG_PASS=postgres + PG_DB=tooljet_test + ORM_LOGGING=error + ``` + +4. Build docker images + + ```bash + docker-compose build + docker-compose run --rm plugins npm run build:plugins + ``` + +5. Run ToolJet + + ```bash + docker-compose up + ``` + ToolJet should now be served locally at `http://localhost:8082`. + +8. To shut down the containers, + ```bash + docker-compose stop + ``` + +## Making changes to the codebase + +If you make any changes to the codebase/pull the latest changes from upstream, the tooljet server container would hot reload the application without you doing anything. + +Caveat: + +1. If the changes include database migrations or new npm package additions in the package.json, you would need to restart the ToolJet server container by running `docker-compose restart server`. + +2. If you need to add a new binary or system library to the container itself, you would need to add those dependencies in `docker/server.Dockerfile.dev` and then rebuild the ToolJet server image. You can do that by running `docker-compose build server`. Once that completes you can start everything normally with `docker-compose up`. + +Example: +Let's say you need to install the `imagemagick` binary in your ToolJet server's container. You'd then need to make sure that `apt` installs `imagemagick` while building the image. The Dockerfile at `docker/server.Dockerfile.dev` for the server would then look something like this: + +``` +FROM node:18.3.0-buster AS builder + +RUN apt update && apt install -y \ + build-essential \ + postgresql \ + freetds-dev \ + imagemagick + +RUN mkdir -p /app +WORKDIR /app + +COPY ./server/package.json ./server/package-lock.json ./ +RUN npm install + +ENV NODE_ENV=development + +COPY ./server/ ./ + +COPY ./docker/ ./docker/ + +COPY ./.env ../.env + +RUN ["chmod", "755", "entrypoint.sh"] + +``` + +Once you've updated the Dockerfile, rebuild the image by running `docker-compose build server`. After building the new image, start the services by running `docker-compose up`. + +## Running tests + +Test config picks up config from `.env.test` file at the root of the project. + +Run the following command to create and migrate data for test db + +```bash +docker-compose run --rm -e NODE_ENV=test server npm run db:create +docker-compose run --rm -e NODE_ENV=test server npm run db:migrate +``` + +To run the unit tests +```bash +docker-compose run --rm server npm run --prefix server test +``` + +To run e2e tests +```bash +docker-compose run --rm server npm run --prefix server test:e2e +``` + +To run a specific unit test + +```bash +docker-compose run --rm server npm --prefix server run test +``` + +## Troubleshooting + +Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our Slack channel (https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) if you encounter any issues when trying to run ToolJet locally. diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/setup/macos.md b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/macos.md new file mode 100644 index 0000000000..b317f3a592 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/macos.md @@ -0,0 +1,134 @@ +--- +id: macos +title: Mac OS +--- + +# Mac OS +Follow these steps to setup and run ToolJet on macOS for development purposes. Open terminal and run the commands below. We recommend reading our guide on [architecture](/docs/contributing-guide/setup/architecture) of ToolJet before proceeding. + +## Setting up + +1. Set up the environment + + 1.1 Install Homebrew + ```bash + /bin/bash -c "(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" + ``` + 1.2 Install Node.js ( version: v18.3.0 ) and npm (version: v8.11.0) + ```bash + brew install nvm + export NVM_DIR=~/.nvm + source $(brew --prefix nvm)/nvm.sh + nvm install 18.3.0 + nvm use 18.3.0 + npm install -g npm@8.11.0 + ``` + + 1.3 Install Postgres + :::tip + ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. We do not plan to support other databases such as MySQL. + ::: + + ```bash + brew install postgresql + ``` + + 1.4 Install PostgREST(optional) + + :::info + Required only if Tooljet Database is being used. + + Please use PostgREST version 10.1.1.x + ::: + + ```bash + brew install postgrest --version 10.1.1.20221215 + ``` + + 1.5 Clone the repository + ```bash + git clone https://github.com/tooljet/tooljet.git + ``` + +2. Set up environment variables + + Create a `.env` file by copying `.env.example`. More information on the variables that can be set is given in the [environment variables reference](/docs/setup/env-vars) + ```bash + cp .env.example .env + ``` + +3. Populate the keys in the env file + :::info + `SECRET_KEY_BASE` requires a 64 byte key. (If you have `openssl` installed, run `openssl rand -hex 64` to create a 64 byte secure random key) + + `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) + ::: + + Example: + ```bash + cat .env + TOOLJET_HOST=http://localhost:8082 + LOCKBOX_MASTER_KEY=1d291a926ddfd221205a23adb4cc1db66cb9fcaf28d97c8c1950e3538e3b9281 + SECRET_KEY_BASE=4229d5774cfe7f60e75d6b3bf3a1dbb054a696b6d21b6d5de7b73291899797a222265e12c0a8e8d844f83ebacdf9a67ec42584edf1c2b23e1e7813f8a3339041 + NODE_ENV=development + # DATABASE CONFIG + PG_HOST=postgres + PG_PORT=5432 + PG_USER=postgres + PG_PASS=postgres + PG_DB=tooljet_development + ORM_LOGGING=all + ``` + +4. Install and build dependencies + ```bash + npm install + npm install --prefix server + npm install --prefix frontend + npm run build:plugins + ``` + +5. Set up database + ```bash + npm run --prefix server db:reset + ``` + +6. Run plugins compilation in watch mode + ```bash + cd ./plugins && npm start + ``` + +7. Run the server + ```bash + cd ./server && npm run start:dev + ``` + +8. Run the client + ```bash + cd ./frontend && npm start + ``` + + The client will start on the port 8082, you can access the client by visiting: [https://localhost:8082](https://localhost:8082) + +9. Create login credentials + + Visiting [https://localhost:8082](https://localhost:8082) should redirect you to the login page, click on the signup link and enter your email. The emails sent by the server in development environment are captured and are opened in your default browser. Click the invitation link in the email preview to setup the account. + +## Running tests + +Test config requires the presence of `.env.test` file at the root of the project. + +To run the unit tests +```bash +npm run --prefix server test +``` + +To run e2e tests +```bash +npm run --prefix server test:e2e +``` + +To run a specific unit test +```bash +npm run --prefix server test +``` diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/setup/ubuntu.md b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/ubuntu.md new file mode 100644 index 0000000000..171b95a914 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/ubuntu.md @@ -0,0 +1,126 @@ +--- +id: ubuntu +title: Ubuntu +--- + +# Ubuntu +Follow these steps to setup and run ToolJet on Ubuntu. Open terminal and run the commands below. + +## Setting up + +1. Set up the environment + + 1.1 Install NVM + ```bash + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash + ``` + + Close and reopen your terminal to start using nvm + ```bash + nvm install 18.3.0 + ``` + + Ensure you have the correct version of npm, or it will cause an error about fsevents. + ```bash + npm i -g npm@8.11.0 + ``` + + 1.2 Install Postgres + ```bash + sudo apt install postgresql postgresql-contrib + sudo apt-get install libpq-dev + ``` + + 1.3 Install PostgREST (optional) + + :::info + Required only if Tooljet Database is being used. + + Please use PostgREST version 10.1.1.x + ::: + + Please follow the installation [PostgREST](https://postgrest.org/en/stable/install.html) guide + + **Note:** Clone the GitHub repo locally using: + + ```bash + git clone https://github.com/ToolJet/ToolJet.git + ``` + + +2. Set up environment variables + + Create a `.env` file by copying `.env.example`. More information on the variables that can be set is given in the [environment variables reference](/docs/setup/env-vars) + ```bash + cp .env.example .env + ``` + +3. Populate the keys in the env file + :::info + `SECRET_KEY_BASE` requires a 64 byte key. (If you have `openssl` installed, run `openssl rand -hex 64` to create a 64 byte secure random key) + + `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) + ::: + + Example: + ```bash + cat .env + TOOLJET_HOST=http://localhost:8082 + LOCKBOX_MASTER_KEY=1d291a926ddfd221205a23adb4cc1db66cb9fcaf28d97c8c1950e3538e3b9281 + SECRET_KEY_BASE=4229d5774cfe7f60e75d6b3bf3a1dbb054a696b6d21b6d5de7b73291899797a222265e12c0a8e8d844f83ebacdf9a67ec42584edf1c2b23e1e7813f8a3339041 + ``` + +4. Install and build dependencies + ```bash + npm install + npm install --prefix server + npm install --prefix frontend + npm run build:plugins + ``` + +5. Set up database + ```bash + npm run --prefix server db:reset + ``` + +6. Run plugins compilation in watch mode + ```bash + cd ./plugins && npm start + ``` + +7. Run the server + ```bash + cd ./server && npm run start:dev + ``` + +8. Run the client + ```bash + cd ./frontend && npm start + ``` + + + The client will start running on the port 8082, you can access the client by visiting: [https://localhost:8082](https://localhost:8082) + +9. Create login credentials + + Visiting https://localhost:8082 should redirect you to the login page, click on the signup link and enter your email. The emails sent by the server in development environment are captured and are opened in your default browser. Click the invitation link in the email preview to setup the account. + + +## Running tests + +Test config requires the presence of `.env.test` file at the root of the project. + +To run the unit tests +```bash +npm run --prefix server test +``` + +To run e2e tests +```bash +npm run --prefix server test:e2e +``` + +To run a specific unit test +```bash +npm run --prefix server test +``` diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/slackcoc.md b/docs/versioned_docs/version-2.3.0/contributing-guide/slackcoc.md new file mode 100644 index 0000000000..aa38cddbc7 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/slackcoc.md @@ -0,0 +1,90 @@ +--- +id: slackcoc +title: Slack Code of Conduct +--- + +# Slack Code of Conduct + +This code of conduct governs ToolJet's Slack Community events and discussions. + +--- + +## Introduction + +- Diversity and inclusion make our community strong. We encourage participation from the most varied and diverse backgrounds possible and want to be very clear about where we stand. + +- Our goal is to maintain a safe, helpful and friendly community for everyone, regardless of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other defining characteristic. + +- This code and related procedures apply to unacceptable behavior occurring in all community venues, including behavior outside the scope of community activities — online and in-person— as well as in all one-on-one communications, and anywhere such behavior has the potential to adversely affect the safety and well-being of community members. + +## Expected behavior + +- Be welcoming. +- Be kind. +- Look out for each other. + +## Unacceptable Behavior + +- Conduct or speech which might be considered sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory or offensive in nature. + - Do not use unwelcome, suggestive, derogatory or inappropriate nicknames or terms. + - Do not show disrespect towards others. (Jokes, innuendo, dismissive attitudes.) +- Intimidation or harassment (online or in-person). +- Disrespect towards differences of opinion. +- Inappropriate attention or contact. Be aware of how your actions affect others. If it makes someone uncomfortable, stop. +- Not understanding the differences between constructive criticism and disparagement. +- Sustained disruptions. +- Violence, threats of violence or violent language. + +## Where does the Code of Conduct apply? + +This Code of Conduct applies to all spaces managed by ToolJet. This includes: + +- Conferences (including social events and peripheral activities) +- Unconferences and sprints +- Meetups, including their discussion boards +- Workshops +- Presentation materials used in talks or sessions +- Slack +- GitHub +- Twitter hashtag and mentions +- Any forums created by the ToolJet which the community uses for communication. + +The Code of Conduct does not exclusively apply to slack or events on an official agenda. For example, if after a scheduled social event you go to a bar with a group of fellow participants, and someone harasses you there, we would still treat that as a CoC violation. Similarly, harassment in Twitter direct messages related to ToolJet can still be covered under this Code of Conduct. + +In addition, violations of this code outside our spaces may affect a person’s ability to participate in them. + +## Enforcement + +- Understand that speech and actions have consequences, and unacceptable behavior will not be tolerated. +- If you are the subject of, or witness to any violations of this Code of Conduct, please contact us via email at hello@tooljet.com or dm @navaneeth on slack. +- If violations occur, organizers will take any action they deem appropriate for the infraction, up to and including expulsion. + +:::info +Portions derived from the [Django Code of Conduct](https://www.djangoproject.com/conduct/), [The Rust Code of Conduct](https://www.rust-lang.org/conduct.html) and [The Ada Initiative](http://adainitiative.org/2014/02/18/howto-design-a-code-of-conduct-for-your-community/) under a Creative Commons Attribution-ShareAlike license. +::: + +--- + +## Etiquettes to follow + +#### 1. Be nice to everyone + +#### 2. Check off your resolved questions + +If you have received a useful reply to your question, please drop a ✅ reaction or a reply for affirmation. + +#### 3. Try not to repost question + +If you have asked a question and have not got a response in 24hrs, please review your question for clarity and revise it. If you still feel you haven't received adequate response, feel free to ping @navaneeth. + +#### 4. Post in public + +Please don't direct message any individual member of ToolJet community without their explicit permission, independent of reason. Your question might be helpful for other community members. + +#### 5. Don't spam tags + +ToolJet's community of volunteer is very active and helpful, generally avoid tagging members unless it is urgent. + +#### 6. Use threads for discussion + +To keep the main channel area clear, we request to use threads to keep an ongoing conversation organized. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/testing.md b/docs/versioned_docs/version-2.3.0/contributing-guide/testing.md new file mode 100644 index 0000000000..d50589d75e --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/testing.md @@ -0,0 +1,57 @@ +--- +id: testing +title: Testing +--- + +Follow the steps below to setup and run the test specifications using Cypress. We recommend [setting up ToolJet locally](/docs/contributing-guide/setup/macos) before proceeding. + +## Setting up + +- Navigate to the `cypress-tests` directory and enter the following command: + ```bash + npm install + ``` + +## Running Tests +#### Headed mode +- To run cypress in **headed** mode, run the following command: + ```bash + npm run cy:open + ``` +- In **headed** mode, the user will be able to choose the test specs from the test runner: +
+ + Cypress headed mode + +
+ +#### Headless mode + +- To run cypress in **headless** mode, run the following command: + ```bash + npm run cy:run + ``` + +- For running specific spec in headless mode, run for specific spec + ```bash + npm run cy:run -- --spec "cypress/e2e/dashboard/multi-workspace/manageSSO.cy.js + ``` + +
+ + Cypress headless mode + +
+ + :::caution + If some test specs need the environment variables, the user can pass them similar to the following command: + ```bash + npm run cy:open -- --env='{"pg_host":"localhost","pg_user":"postgres", "pg_password":"postgres"}' + ``` + or the user can add env-vars in the **cypress.config.js** file + ::: + + +:::info +Check all the Cypress commands [here](https://docs.cypress.io/guides/guides/command-line#Commands) +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/troubleshooting/eslint.md b/docs/versioned_docs/version-2.3.0/contributing-guide/troubleshooting/eslint.md new file mode 100644 index 0000000000..465ba553c3 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/troubleshooting/eslint.md @@ -0,0 +1,43 @@ +--- +id: eslint +title: EsLint +--- + +# ESLint + +ESLint as a code quality tool is a tool that checks your code for errors and helps you to fix them and enforces a coding style. + + +## Setup + + +1. Install the [ESLint extension](https://eslint.org/docs/latest/user-guide/integrations) for your code editor. +2. Set your editor's default formatter to `ESLint`. + +:::tip +For VSCode users, you can set the formatter to `ESLint` in the [**settings.json**](https://code.visualstudio.com/docs/getstarted/settings#_settingsjson). +::: + +3. Install the dependencies. + ```bash + npm install + npm install --prefix server + npm install --prefix frontend + ``` +4. Run the linter. + ```bash + npm run --prefix server lint + npm run --prefix frontend lint + ``` +5. Fix the ESlint errors and warnings. + ```bash + npm run --prefix server format + npm run --prefix frontend format + ``` + + +## Requirements + +1. **Node version 18.3.0** +2. **npm version 8.11.0** + diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/_category_.json b/docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/_category_.json new file mode 100644 index 0000000000..0d7c9bc587 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tutorials", + "position": 2, + "collapsed": true +} diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/create-widget.md b/docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/create-widget.md new file mode 100644 index 0000000000..999e1999db --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/create-widget.md @@ -0,0 +1,27 @@ +--- +id: creating-widget +title: Creating Widgets +--- + +# Creating Widgets + +These are some of the most useful properties and functions passed to the widget + +### properties + +The `properties` object will contain the configurable properties of a widget, initially obtained from its definition on `widgetConfig.js`. +The values inside `properties` change whenever the developer makes changes to the inspector panel of ToolJet editor. + +### exposedVariables + +The `exposedVariables` object will contain the values of all exposed variables as configured in `widgetConfig.js`. + +### setExposedVariable('exposedVariableName', newValue) + +This function allows you to update the value of an exposed variable to `newValue`. + +### validate(value) + +This function validates the `value` passed based on the validation settings configured on the inspector panel for the widget. +It returns an array `[isValid, validationError]`, which represents respectively, whether the `value` passed is valid, +and the error message if there is one. diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/creating-a-plugin.md b/docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/creating-a-plugin.md new file mode 100644 index 0000000000..3192928987 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/tutorials/creating-a-plugin.md @@ -0,0 +1,226 @@ +--- +id: creating-a-plugin +title: Creating Plugins +--- + +# Creating plugins for ToolJet + +## What are plugins + +ToolJet is built with extensibility in mind. Plugins allows developers to extend the functionalities of ToolJet using JavaScript. Plugins can only be connectors at this moment. For example, the data source connectors such as PostgreSQL, MySQL, Twilio, Stripe, etc are built as plugins. + +In this guide, we will walk you through building plugins for ToolJet with the help of `tooljet` cli. + +`tooljet` cli is a commandline tool built for building plugins easily. We will build a simple plugin for BigQuery in this guide. + +### What does a plugin look like? + +All the plugins live under the `/plugins` directory. The structure of a plugin looks like this: + +``` + my-awesome-plugin/ + package.json + lib/ + icon.svg + index.ts + operations.json + manifest.json +``` + +- manifest.json should include information such as the name of plugin, description, etc. +- operations.json should include the metadata of all the operations supported by the plugin. +- index.ts is the main file. It defines a `QueryService` for the plugin. The `QueryService` handles running of queries, testing connections, caching connections, etc. +- icon.svg is the icon for the plugin. +- package.json is auto generated by the cli. + +## Getting Started + +1. Install [tooljet-cli](https://www.npmjs.com/package/@tooljet/cli): + ```bash + $ npm i -g @tooljet/cli + ``` + +2. Bootstrap a new plugin using cli + ```bash + $ tooljet plugin create bigquery + ``` + + ```bash + creating plugin... done + Plugin: bigquery created successfully + └─ plugins + └─ packages + └─ bigquery + ``` + +3. Add the npm package of BigQuery to the plugin dependencies + ```bash + $ tooljet plugin install @google-cloud/bigquery --plugin bigquery + ``` + +4. Now the directory for our new plugin should looks something like below: + + ```bash + plugins/ + package.json + packages/ + bigquery/ + __tests__ + bigquery.test.js + package.json + lib/ + icon.svg + index.ts + operations.json + manifest.json + ``` + +5. Add data source config paramets to manifest.json + + Our BigQuery plugin needs private key of a GCP service account to connect to BigQuery. Let's add `private_key` as a property for the data source. + + ```json + { + "$schema": "https://json-schema.org/", + "$id": "https://tooljet.io/BigQuery.schema.json", + "title": "BigQuery datasource", + "description": "A schema defining BigQuery datasource", + "type": "api", + "source": { + "name": "BigQuery", + "kind": "bigquery", + "exposedVariables": { + "isLoading": false, + "data": {}, + "rawData": {} + }, + "options": { + "private_key": { "encrypted": true } + } + }, + "defaults": { + "private_key": { "value": "" } + }, + "properties": { + "private_key": { + "label": "Private key", + "key": "private_key", + "type": "textarea", + "description": "Enter JSON private key for service account" + } + }, + "required": ["private_key"] + } + + ``` + +6. Import npm package BigQuery to index.ts + ```javascript + const { BigQuery } = require('@google-cloud/bigquery'); + ``` + +6. Edit index.ts to include the logic for creating a connection. + ```javascript + async getConnection(sourceOptions: any, _options?: object): Promise { + const privateKey = JSON.parse(sourceOptions['private_key']); + const client = new BigQuery({ + projectId: privateKey['project_id'], + credentials: { + client_email: privateKey['client_email'], + private_key: privateKey['private_key'], + }, + }); + + return client; + } + ``` + +7. Edit index.ts to include the logic for testing connection. + When a new data source is being added to a ToolJet application, the connection can be tested. + + :::info + NOTE: Every data source might not have a way to test connection. If not applicable for your data source, you can disable the test connection feature by adding `"customTesting": true,` to the `manifest.json` of your plugin. + ::: + +8. Add manifest entry for operations + + In this example, let's add two operations for our BigQuery plugin. + - *List databases* - Lists all the databases. + - *Query database* - Query a specific database. + + We need to make the entries to `operations.json`. The `operations.json` should look like this now: + ```json + { + "$schema": "https://json-schema.org/", + "$id": "https://tooljet.io/dataqueries/Bigquery.schema.json", + "title": "Dynamodb datasource", + "description": "Operations for BigQuery plugin", + "type": "object", + "defaults": {}, + "properties": { + "operation": { + "label": "Operation", + "key": "operation", + "type": "dropdown-component-flip", + "description": "Single select dropdown for operation", + "list": [ + { + "value": "list_datasets", + "name": "List Datasets" + }, + { + "value": "query", + "name": "Query" + } + ] + }, + "query": { + "query": { + "label": "Query", + "key": "query", + "type": "codehinter", + "description": "", + "height": "150px" + } + } + } + } + + ``` + +8. Handle the logic for running queries in `index.ts` + + `QueryService` receives the metadata of the data source including the credentials and configs for connecting and parameters for the query that was run. In our example, `sourceOptions` will have the `private_key` of BigQuery datasource associated with the query. `queryOptions` will have the configs and parameters for the specific query. For example, `queryOption.operation` will give the id of current operation. + + ```javascript + export default class BigQueryQueryService implements QueryService { + async run(sourceOptions: any, queryOptions: any, _dataSourceId: string): Promise { + const operation = queryOptions.operation; + const client = await this.getConnection(sourceOptions); + let result = {}; + + try { + switch (operation) { + case 'list_datasets': + result = await client.getDatasets(); + break; + } + } catch (error) { + throw new QueryError('Query could not be completed', error.message, {}); + } + + return { + status: 'ok', + data: result, + }; + } + } + ``` + +9. Since it is a smiliar step for adding the logic for handling `query` operation, skipping it. + +10. Test files are generated by the cli when a plugin is created. You can use `jest` for writing the tests. + +Tests for a specific plugin can be run using the command `tooljet plugin test --bigquery` + +13. The plugin is now ready! diff --git a/docs/versioned_docs/version-2.3.0/data-sources/_category_.json b/docs/versioned_docs/version-2.3.0/data-sources/_category_.json new file mode 100644 index 0000000000..c6ad9ffd74 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Datasource Reference", + "position": 5, + "collapsed": true +} diff --git a/docs/versioned_docs/version-2.3.0/data-sources/airtable.md b/docs/versioned_docs/version-2.3.0/data-sources/airtable.md new file mode 100644 index 0000000000..5c1beb12aa --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/airtable.md @@ -0,0 +1,229 @@ +--- +id: airtable +title: Airtable +--- + +# Airtable + + +ToolJet can connect to your Airtable account to read and write data. **Airtable API key** is required to create an Airtable data source on ToolJet. You can generate API key by visiting [Airtable account page](https://airtable.com/account). + + +irtable record + + +:::info +Airtable API has a rate limit, and at the time of writing this documentation, the limit is five(5) requests per second per base. You can read more about rate limits here **[Airtable API]( https://airtable.com/api )**. +::: + +:::tip +This guide assumes that you have already gone through [Adding a data source](/docs/tutorial/adding-a-datasource) tutorial. +::: + +## Supported queries + +- **[Listing records](#listing-records)** +- **[Retrieving a record](#retrieving-a-record)** +- **[Creating a record](#creating-a-record)** +- **[Updating a record](#updating-a-record)** +- **[Deleting a record](#deleting-a-record)** + +### Listing records + +This query lists all the records in a table. The results are paginated and each page can have up to 100 records. + +#### Required parameters: + +- **Base ID:** To find the Base ID, first visit **airtable.com/api**. Select from the list of bases the base whose ID you'd like to find out. Example Base ID: `appDT3UCPffPiSmFd` +- **Table name:** Enter the table name whose data you want to fetch. + +#### Optional parameters: + +- **Page size:** The number of records returned in each request. Must be less than or equal to 100. Default is 100. +- **offset:** If there are more records, the response will contain an offset. To fetch the next page of records, include offset in the next request's parameters. + + +List airtable record + + +Example response from Airtable: + +```json +{ + "records": [ + { + "id": "recu9xMnUdr2n2cw8", + "fields": { + "Notes": "sdfdsf", + "Name": "dsfdsf" + }, + "createdTime": "2021-05-12T14:30:33.000Z" + }, + { + "id": "recyIdR7bVdQvmKXa", + "fields": { + "Notes": "sdfdsf", + "Name": "dfds" + }, + "createdTime": "2021-05-12T14:30:33.000Z" + }, + { + "id": "recAOzdIHaRpvRaGE", + "fields": { + "Notes": "sdfsdfsd", + "Name": "sdfdsf" + }, + "createdTime": "2021-05-12T14:30:33.000Z" + } + ], + "offset": "recAOzdIHaRpvRaGE" +} +``` + +### Retrieving a record + +#### Required parameters: + +- **Base ID** +- **Table name** +- **Record ID** + + +Retrieve airtable record + + +Example response from Airtable: + +```json +{ + "id": "recu9xMnUdr2n2cw8", + "fields": { + "Notes": "sdfdsf", + "Name": "dsfdsf" + }, + "createdTime": "2021-05-12T14:30:33.000Z" +} +``` + +### Creating a record + +#### Required parameters: +- **Base ID** +- **Table name** +- **Records** + + +Create airtable record + +#### Example Records: + +```json +[ + { + "fields": { + "Notes": "sdfdsf", + "Name": "dsfdsf" + } + }, + { + "fields": { + "Notes": "note1", + "Name": "dsfdsf" + } + } +] + + +``` + + +Click on the `run` button to run the query. + +:::info +NOTE: Query must be saved before running. +::: + +Example response from Airtable: +```json +{ + "records": [ + { + "id": "rec5RuZ1COoZGtGDY", + "fields": { + "Notes": "sdfdsf", + "Name": "dsfdsf" + }, + "createdTime": "2022-02-07T20:25:27.000Z" + }, + { + "id": "recaYbFPonNNu6Cwj", + "fields": { + "Notes": "note1", + "Name": "dsfdsf" + }, + "createdTime": "2022-02-07T20:25:27.000Z" + } + ] +} +``` + +### Updating a record + +#### Required parameters: +- **Base ID** +- **Table name** +- **Record ID** + + +Update airtable record + +#### Example body: + +
+ +Airtable update body + +
+ +Click on the `run` button to run the query. + +:::info +NOTE: Query must be saved before running. +::: + +Example response from Airtable: +```json +{ + "id": "recu9xMnUdr2n2cw8", + "fields": { + "Notes": "Example Notes", + "Name": "change" + }, + "createdTime": "2021-08-08T17:27:17.000Z" +} +``` + +### Deleting a record + +#### Required parameters: +- **Base ID** +- **Table name** +- **Record ID** + +Delete airtable record + + +Click on the `run` button to run the query. + +:::info +NOTE: Query must be saved before running. +::: + +Example response from Airtable: + +```json +{ + deleted: true + id: "recIKsyZgqI4zoqS7" +} +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/data-sources/amazonses.md b/docs/versioned_docs/version-2.3.0/data-sources/amazonses.md new file mode 100644 index 0000000000..3d3d886574 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/amazonses.md @@ -0,0 +1,61 @@ +--- +id: amazonses +title: Amazon SES +--- + +# Amazon SES + +ToolJet can connect to your Amazon SES account to send emails. + +## Connection +To add a new Amazon SES API datasource, click the **Datasource manager** icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select Amazon SES from the modal that pops up. + +ToolJet requires the following to connect to Amazon SES: + +- **Region** +- **Access key** +- **Secret key** + +It is recommended to create a new IAM user for the database so that you can control the access levels of ToolJet. + +Click on the 'Save' button to save the data source. + +
+ +Amazon SES + +
+ +## Supported operations +1. Email service + +### Email service +Required parameters: +- Send email to +- Send email from +- Subject +- Body as text + + +Optional parameters: +- Body as HTML +- CC Addresses +- BCC Addresses + + +:::info +**Send mail to** - accepts an array/list of emails separated by comma. +For example: +`{{["dev@tooljet.io", "admin@tooljet.io"]}}`. + +**Send mail from** - accepts a string. +For example: `admin@tooljet.io` +::: + +:::tip +**Send a single email to multiple recipients** - The `Send mail to` field can contain an array of recipients, which will send a single email with all of the recipients in the field. +::: + +:::info Note +Query should be saved before running. +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/appwrite.md b/docs/versioned_docs/version-2.3.0/data-sources/appwrite.md new file mode 100644 index 0000000000..dc11572625 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/appwrite.md @@ -0,0 +1,160 @@ +--- +id: appwrite +title: Appwrite Database +--- + +# Appwrite Database + +Now build applications on top of your Appwrite database. + +## Connection + +ToolJet connects to your Appwrite app using : +- **Host (API endpoint)** +- **Project ID** +- **Secret key** + +You'll find the Secret key and other credentials on your Appwrite's project settings page. You may need to create a new key if you don't have one already. + +:::info +You should also set the scope for access to a particular resource. Learn more about the **API keys and scopes** [here](https://appwrite.io/docs/keys). +::: + +To connect Appwrite datasource to your ToolJet application, go to the data source manager on the left-sidebar and click on the `+` button. Select Appwrite from the list of available datasources, provide the credentials and click **Save**. It is recommended to check the connection by clicking on 'Test connection' button to verify if the service account can access Appwrite from the ToolJet server. + +
+ +Appwrite intro + +
+ +## Querying Appwrite + +After setting up the Appwrite datasource, you can click on the `+` button of the query manager at the bottom panel of the editor and select the Appwrite data source that you added in the previous step. + +
+ +Appwrite intro + +
+ +After selecting Appwrite datasource, select the operation that you want to perform on the Appwrite database and click **Save** to save the query. + +:::tip +Query results can be transformed using Transformations. Read our **Transformation documentation** [here](/docs/tutorial/transformations) +::: + +## Supported operations + +1. **[List documents](#list-documents)** +2. **[Get document](#get-document)** +3. **[Create document](#create-document)** +4. **[Update document](#update-document)** +5. **[Delete document](#delete-document)** +6. **[Bulk update using document id](#bulk-update-using-document-id)** + +### List documents + +This operation can be used to get a list of all the user documents. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The value for collection ID field should be of `String` type. + +#### Optional parameters: + +- **Limit:** Maximum number of documents to return in the response. By default, it will return a maximum of 25 results. A maximum of 100 results is allowed per request. The Limit value should be of `integer` type. +- **Order fields:** Array of attributes used to sort results. The order field value should be an `array`. +- **Order types:** Array of order directions for sorting attributes. Possible values are DESC for descending order or ASC for ascending order. The order field value should be an `array`. +- **Field, Operator, and Value:** For filtering the results, you can enter a field(attribute) name, use the appropriate operator from the dropdown, and set a value. + +
+ +Appwrite List + +
+ +### Get document + +Use this operation to get a document from a collection by its unique ID. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The value for collection ID should be of `String` type. + +- **Document ID:** Enter the document ID of the document that you want to get. The document ID should be of `String` type. + +
+ +Appwrite get + +
+ +### Add Document to Collection + +Use this operation to create a new document in a collection. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The collection ID should be of `String` type. + +- **Body:** Enter the document data as a JSON object. + +
+ +Appwrite add + +
+ +### Update document + +Use this operation to update a document. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The value for collection ID should be of `String` type. + +- **Document ID:** Enter the document ID of the document that you want to get. The document ID should be of `String` type. + +- **Body:** Enter the document data as a JSON object. + +
+ +Appwrite update + +
+ +### Delete document + +Use this operation for deleting a document in the collection. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The value for collection ID should be of `String` type. + +- **Document ID:** Enter the document ID of the document that you want to get. The document ID should be of `String` type. + +
+ +Appwrite delete + +
+ +### Bulk update using document id + +Use this operation for bulk updating a document in a collection. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The value for collection ID should be of `String` type. + +- **Key for document ID:** Enter the key or attribute name that can be used to identify each record. + +- **Records:** The array of objects that will contain the data for updating each record in the database +and these objects must contain a key-value pair to point unique record in the database (key for document) + +
+ +Appwrite bulk update + +
diff --git a/docs/versioned_docs/version-2.3.0/data-sources/athena.md b/docs/versioned_docs/version-2.3.0/data-sources/athena.md new file mode 100644 index 0000000000..4536b35596 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/athena.md @@ -0,0 +1,67 @@ + +# Athena + +ToolJet can connect to Amazon Athena which is an interactive query service that makes it easy to analyze data in Amazon S3 using standard SQL. + +- [Connection](#connection) +- [Querying-athena](#querying-amazon-athena) +- [Basic Operation](#basic-queries) + +## Connection + +ToolJet requires the following to connect to your Athena. + +- **Database** +- **S3 output location** +- **Access key** +- **Secret key** +- **Region** + +:::info +You can also configure for **[additional optional parameters](https://github.com/ghdna/athena-express)**. +::: + + +Athena connection + + +## Querying Amazon Athena + +- Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the datasource. Query manager then can be used to write SQL queries. + + +Athena query + + +- Click on the `run` button to run the query. + +**NOTE:** Query should be saved before running. + +:::tip +**Refer amazon athena docs here for more info:** [link](https://docs.aws.amazon.com/athena/latest/ug/what-is.html) +::: + +### Basic queries + +#### Creating table + + +```sql +CREATE EXTERNAL TABLE student ( + name STRING, + age INT +) LOCATION 's3://athena-express-akiatfa53s-2022/'; +``` + +#### Inserting to table + +```sql +INSERT INTO student +VALUES ('Lansing',1) +``` + +#### Select operation + +```sql +SELECT * from student WHERE AGE=1 +``` diff --git a/docs/versioned_docs/version-2.3.0/data-sources/baserow.md b/docs/versioned_docs/version-2.3.0/data-sources/baserow.md new file mode 100644 index 0000000000..749fa676d9 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/baserow.md @@ -0,0 +1,269 @@ +--- +id: baserow +title: Baserow +--- + +# Baserow + +## Connection + +ToolJet can connect to your Baserow account to read and write data. +Select the hosted version of Baserow or the self-host option. + +For [**self-hosted**](https://baserow.io/docs/index#installation) option, base URL is required to connect. + +Baserow API token is required to create an Baserow data source on ToolJet. You can follow the steps to create API token from [this link](https://baserow.io/api-docs). + + +Baserow intro + + +:::tip +This guide assumes that you have already gone through [Adding a data source](/docs/tutorial/adding-a-datasource) tutorial. +::: + +## Supported queries + +- [List fields](#list-fields) +- [List rows](#list-rows) +- [Get row](#get-row) +- [Create row](#create-row) +- [Update row](#update-row) +- [Move row](#move-row) +- [Delete row](#delete-row) + +### List fields + +This query lists all the fields in a table. + +#### Required parameters: + +- **Table ID** + + +Baserow list fields + + +Example response from Baserow: + +```json +[ + { + "id": 331156, + "table_id": 57209, + "name": "Name", + "order": 0, + "type": "text", + "primary": true, + "text_default": "" + }, + { + "id": 331157, + "table_id": 57209, + "name": "Last name", + "order": 1, + "type": "text", + "primary": false, + "text_default": "" + }, + { + "id": 331158, + "table_id": 57209, + "name": "Notes", + "order": 2, + "type": "long_text", + "primary": false + }, + { + "id": 331159, + "table_id": 57209, + "name": "Active", + "order": 3, + "type": "boolean", + "primary": false + } +] +``` + +### List rows + +This query lists all the rows in a table. + +#### Required parameters: + +- **Table ID** + + +Baserow list + + +Example response from Baserow: + +```json +{ + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 2, + "order": "0.99999999999999999991", + "Name": "Bill", + "Last name": "Gates", + "Notes": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce dignissim, urna eget rutrum sollicitudin, sapien diam interdum nisi, quis malesuada nibh eros a est.", + "Active": false + }, + { + "id": 3, + "order": "0.99999999999999999992", + "Name": "Mark", + "Last name": "Zuckerburg", + "Notes": null, + "Active": true + }, + { + "id": 1, + "order": "0.99999999999999999997", + "Name": "Elon", + "Last name": "Musk", + "Notes": null, + "Active": true + } + ] +} +``` + +### Get row + +#### Required parameters: + +- **Table ID** +- **Row ID** + + +Baserow get + + +Example response from Baserow: + +```json +{ + "id": 1, + "order": "0.99999999999999999997", + "Name": "Elon", + "Last name": "Musk", + "Notes": null, + "Active": true +} +``` + +### Create row + +#### Required parameters: + +- **Table ID** +- **Records** + + +Bserow create + + +#### Example Records: + +```json +{ + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true +} +``` + +Example response from Baserow: + +```json +{ + "id": 19, + "order": "0.99999999999999999996", + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true +} +``` + +### Update row + +#### Required parameters: + +- **Table ID** +- **Row ID** +- **Records** + + +Baserow update + +#### Example Records: + +```json +{ + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true +} +``` + +Example response from Baserow: + +```json +{ + "id": 19, + "order": "0.99999999999999999996", + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true +} +``` + +### Move row + +#### Required parameters: + +- **Table ID** +- **Row ID** + +#### Optional parameters: + +- **Before ID** (The row will be moved before the entered ID. If not provided, then the row will be moved to the end ) + + +Baserow move row + + +Example response from Baserow: + +```json +{ + "id": 3, + "order": "2.00000000000000000000", + "Name": "Mark", + "Last name": "Zuckerburg", + "Notes": null, + "Active": true +} +``` + +### Delete row + +#### Required parameters: + +- **Table ID** +- **Row ID** + + +Baserow delete + + +While deleting a row, the response will be either success or failure from Baserow diff --git a/docs/versioned_docs/version-2.3.0/data-sources/bigquery.md b/docs/versioned_docs/version-2.3.0/data-sources/bigquery.md new file mode 100644 index 0000000000..e3e29b8d4c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/bigquery.md @@ -0,0 +1,160 @@ +--- +id: bigquery +title: BigQuery +--- + +# BigQuery + +ToolJet can connect to BigQuery databases to run BigQuery queries. + +## Connection + +Please refer [this](https://cloud.google.com/bigquery/docs/bigquery-web-ui) link to enable BigQuery API in Google Cloud Console. + +Create **Service Account** and **key**, then get your configs downloaded as **JSON** + +To add a new BigQuery, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select BigQuery from the modal that pops up. + +ToolJet requires the config json downloaded from your account to connect to BigQuery. Paste the json into the `Private key` field. + +**The json looks like**: + + ```json + { + "type": "service_account", + "project_id": "tooljet-279812", + "private_key_id": "ea6e234sdfsdf3242b91525626edeef74a14e58761", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADAAhdh67sidfnIUWWWBAQC8V+z0vaM/rFiA\nrq8fzVjSpEu7Cietjn82SVtguAlAUP9YpRepzi4rDmRgVQiXe4KES7VGQhmg3hUj\nbBASbdI5WRCvAC2ujzrxv3rbfjYRWfm+OqzpUBWaEKbwSGc6rNkhmirvhjiFdl5k\nn7aK7w3bmQfBlnNM6+WiQdT09g2qx3lmRDoUUpuCngkhbWOs3gN/U6wlm0cHKtbF\nWUOwKdyeZrm3UORUDkFvq6rVSF8vob+FQxf24FuvpBmXi2o2dqqglle8rlm8Lz83\ns4kAVbqVjtGrVXm6QUcnLISqJCJUnFkSuFpo60GCcgAVrwyAq/6aQH3IM78QKzFL\n8q5b65rXAgMBAAECggEAClIF8tRk0VuG3NZH5lg3q8fDOyaLBFdVKcHKtzCec3Ez\no6C4RcxP6Hk5IbPrtgggjVIi/Z7exKRv2mAwFvuSuJJSQSSjXC7Fm87AQPdYFWYt\noFYIeLGPlFMO++H3Nh+Xt3I5NBLR58UmH48iBdgR3pygXi1C5eBvQ2rdNVTL/uxw\n3iULu8WcVBw8glzkdLNLDq94uqbW7/qyji7QWNkU+804sA0LEj4PWmO7B9k1LCLK\nFV0Ppv+SJYMS2MhWmXPHnYVfeNaKJKPQpHsS2ep/hyjEO/3Fvm3o3cp6SrEkNGIH\nGKeozlfV7MQj7tMHLqWddDBXtFwYVEmN0UJVafvGsQKBgQDsEVzb7DG/xlMpuDQv\nqpLGWXR5DdAhzxVJzeh11Ongb+XxBOVSyTDKJLvOX4rI7tDqqN7b2pabUA3ZjvXv\nhMPXr7AjL6yoJEzVCyo1+pi26OL99OcO+7gUDa0axHFt6LZuPw00r+2Nl0FqrXNR\n+qUiPuZpp2MuKjMwLCwhr5YuqwKBgQDMPv6TPMl+oocoQ4uc84uY58Ywb7XZjmhY\n8jXdA38I454EbQGeLja+2knDpDkF6g14cTzVJe/Ec4A6QmeIieTFSJKBV4VCZ3QN\npLR4PrET7o9GL3mtwnNqcHPw2dLNHtn1OgsOUfJMWPIrFK2abVNAmYIBtOGA4eyH\nrOl+NcAUhQKBgC4EKGy6OuxeFYHxZULRZjEB6QFb3vFoM4cieyjU6w4T4ee8g5NC\nop8U0AMnfp8yZkkHyAFlN6xoy3pYMrqQz7gwiA4j0e0ovk1dEspY4gHtnanRXmT+\nTmCiVdb86ft5vG37HnDhxlWuYVMRIoSdbikhx7papauvEDFYuvWKC6VnAoGBAJQr\nvxOhrauozNRw6//YzxUGT8kjwZEqtpiQXnMP7kDMn/4l9l6CuESMp6a+pH+d5FfU\nDoWzF9Y01HlvYxyyrLxSgbZDf/FEi/S54BK7qEsFbftExclAn+o/2lyIKV2VXBmD\nGjIxUM4CWOzX+3lkhlj/BEmop0+Qlr92uY1OASLhAoGAfTb/Le0Nf5bGLjK3hI9D\no/oDI5Ryj5rTMxmG/wRjE+1Jm6BjFzEyH2CvnFonccyHQ+wGn61AgbRFLn+Tg5fz\nZXpzD2Xq3Y/AXtrdaayK0wnpMvVE1bZt+ikeVAWX+gR79igTqSXRgCuyp+edsgcE\nZ+2Eser4Z5BpqfFjqFW8MhY=\n-----END PRIVATE KEY-----\n", + "client_email": "tooljettest@tooljet-279812.iam.gserviceaccount.com", + "client_id": "106795637455432158803", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/tooljettest%40tooljet-279812.iam.gserviceaccount.com" +} +``` + +
+ +BQ create + +
+ +Click on **Test connection** button to verify if the credentials are correct and that the API is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying BigQuery + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. Select the operation that you want to perform and click **Save** to create the query. + + +BQ query + + +Click on the **run** button to run the query. NOTE: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: + +## Supported operations + +- [List Datasets](#list-datatsets) + +- [List Tables](#list-tables) + +- [Query](#query) + +- [Insert Record ](#insert-record) + +- [Delete Record ](#delete-record) + +- [Update Record](#update-record) + + +- [Create View](#create-view) + + +- [Create Table](#create-table) + + +- [Delete Table](#create-table) + + + +### List Datasets + +Returns list of datasets. + +#### Optional parameters: + +- **Options:** This can be used to filter the list. + + +BQ list datasets + +### List Tables + +Return list of tables within a dataset + +#### Required parameters: + +- **Dataset:** Enter the dataset name. + + +BQ list tables + + +### Query + +Return data based on the `Query`. `Query options` ([Reference](https://cloud.google.com/bigquery/docs/reference/rest/v2/Job)), and `Query result options` ([Reference](https://cloud.google.com/nodejs/docs/reference/bigquery/latest/overview#_google_cloud_bigquery_QueryResultsOptions_type)). + + + +BQ query + +### Insert Record +- To insert a record. + + +BQ insert + + +### Delete Record +- To delete a record. + + +BQ delete + + +:::info +NOTE: Be careful when deleting records in a table. If you omit the WHERE clause, all records in the table will be deleted! +::: +### Update Record +- To update a record. + + +BQ update + + +:::info +NOTE: Be careful when deleting records in a table. If you omit the WHERE clause, all records in the table will be updated! +::: +### Create View + +- To create a view. + + +BQ create view + + + +### Create Table + +- To create a table. + +:::info +NOTE: visit -https://github.com/googleapis/nodejs-bigquery/blob/main/samples/createTable.js for more info on schema. +::: + +### Delete Table +- To delete a table. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/data-sources/clickhouse.md b/docs/versioned_docs/version-2.3.0/data-sources/clickhouse.md new file mode 100644 index 0000000000..bb55b4a069 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/clickhouse.md @@ -0,0 +1,211 @@ +--- +id: clickhouse +title: ClickHouse +--- + +# ClickHouse + +ToolJet can connect to the ClickHouse to read and write data. + +:::info +ToolJet uses this [NodeJS](https://github.com/TimonKK/clickhouse) client for ClickHouse. +::: + +## Connection + +To add a new ClickHouse datasource, Go to the **Datasource Manager** on the left sidebar of the app editor and click on `Add datasource` button. Select **ClickHouse** from the modal that pops up. + +ToolJet requires the following to connect to your ClickHouse Database: + +- **Username** +- **Password** +- **Host** +- **Port** +- **Database Name** +- **Protocol** +- **Use Post** +- **Trim Query** +- **Use Gzip** +- **Debug** +- **Raw** + +ClickHouse connection + +## Querying ClickHouse + +After setting up the ClickHouse datasource, you can click on the `+` button of the query manager and select the ClickHouse datasource that you added in the previous step to create a new query. + +:::info +For more details on clickhouse visit [Clickhouse docs](https://clickhouse.com/docs/en/quick-start). +::: + + +## Supported Operations: + +- [SQL Query](#sql-query) +- [Insert array of objects](#supported-operations) + +### SQL Query + +Use this to operation to enter **[ClickHouse SQL Statements](https://clickhouse.com/docs/en/sql-reference/statements/)**. These statements represent various kinds of action you can perform using SQL queries. + +#### Example SQL queries + +- **SELECT**: + + ```sql + SELECT * from test array; + ``` + +
+ + ClickHouse SQL Statement operation + +
+ +- **CREATE**: + + ```sql + CREATE TABLE test array3 ( + date Date, + str String, + arr Array(String), + arr2 Array (Date) + arr3 Array(UInt32) , + id1 UUID + )ENGINE=MergeTree () ORDER BY(str) + ``` + +
+ + ClickHouse SQL Statement operation + +
+ +- **ALTER TABLE**(add column) + + ```sql + ALTER TABLE test array1 ADD COLUMN Added2 UInt32; + ``` + +
+ + ClickHouse SQL Statement operation + +
+ +- **SELECT WITH WHERE CLAUSE** + ```sql + SELECT * FROM test array1 WHERE str='Somethingl...' + ``` + +
+ + ClickHouse SQL Statement operation + +
+ +- **UPDATE** + ```sql + ALTER TABLE test_array1 UPDATE arr = (12] WHERE str='Somethingl...' + ``` + +
+ + ClickHouse SQL Statement operation + +
+ +- **DELETE** + ```sql + ALTER TABLE test_array1 DELETE WHERE str= 'Somethingl...' + ``` + +
+ + ClickHouse SQL Statement operation + +
+ +- **NORMAL INSERT** + + 1) Step 1 - Creating Table + + ```sql + CREATE TABLE test array4 ( + name String, + date Date + )ENGINE=MergeTree () ORDER BY (name) + ``` + +
+ + ClickHouse SQL Statement operation + +
+ + 2) Step 2 - Insert + + ```sql + INSERT INTO test_array4 (*) VALUES ('juvane', '1996-01-13') + ``` + +
+ + ClickHouse SQL Statement operation + +
+ + :::info + **Giving Primary Key** + ``` + CREATE TABLE db.table_name + ( + name1 type1, name2 type2, ..., + PRIMARY KEY(expr1[, expr2,...])] + ) + ENGINE = engine; + + OR + + CREATE TABLE db.table_name + ( + name1 type1, name2 type2, ... + ) + ENGINE = engine + PRIMARY KEY(expr1[, expr2,...]); + ``` + ::: + +### Insert array of objects + +Use this operation for inserting array of objects. + +#### Required Parameters: +- **Body** +- **Fields** +- **Table name** + +**Example Body value:** +```javascript +[ + { + date: '2018-01-01', + str: 'Something1...', + arr: [], + arr2: ['1985-01-02', '1985-01-03'], + arr3: [1,2,3,4,5], + id1: '102a05cb-8aaf-4f11-a442-20c3558e4384' + }, + { + date: '2018-02-01', + str: 'Something2...', + arr: ['5670000000', 'Something3...'], + arr2: ['1985-02-02'], + arr3: [], + id1: 'c2103985-9a1e-4f4a-b288-b292b5209de1' + } + ]; +``` + +ClickHouse Insert array of objects operation diff --git a/docs/versioned_docs/version-2.3.0/data-sources/cosmosdb.md b/docs/versioned_docs/version-2.3.0/data-sources/cosmosdb.md new file mode 100644 index 0000000000..a924932750 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/cosmosdb.md @@ -0,0 +1,91 @@ +--- +id: cosmosdb +title: CosmosDB +--- +# Cosmosdb + +ToolJet can connect to CosmosDB databases to read and write data. + + +## Connection + +To add a new **[Azure Cosmos DB](https://docs.microsoft.com/en-us/javascript/api/overview/azure/cosmos-readme?view=azure-node-latest#key-concepts)**, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select CosmosDB from the modal that pops up. + +ToolJet requires the following to connect to your Cosmos DB. + +- **Cosmos DB Account End point** +- **Cosmos DB Account Key** + +:::info +**Azure Cosmos DB End point** is the URL of the Cosmos DB service. +**Azure Cosmos DB Key** is the key that is used to access the Cosmos DB service. +You can find the endpoint and key in the **[Azure Portal](https://portal.azure.com/)**. +::: + +
+ +![ToolJet - Data source - CosmosDB](/img/datasource-reference/cosmosdb/cosmosdb-connect.png) + +
+ + +## Supported queries: + +- [Listing databases](#listing-databases) +- [Listing containers](#listing-containers) +- [Inserting item(s)](#inserting-items) +- [Retrieving an item](#retrieving-an-item) +- [Deleting an item](#deleting-an-item) +- [Querying documents](#querying-documents) + + + + + +### Listing databases +This query lists all the databases in a Cosmos DB. + +### Listing containers +This query lists all the containers of a database in a Cosmos DB. + +| Fields | description | +| ----------- | ----------- | +| database | id of the database | + +### Inserting item(s) +This query inserts one or more items in a container of a database in a Cosmos DB. + +| Fields | description | +| ----------- | ----------- | +| database | id of the database | +| container | id of the container | +| items | items to be inserted. Example: `{{[{name: "one", val: 1}, {name:"two", val: 2}]}}` | + +### Retrieving an item +To read a single item from a container of a database in a Cosmos DB, use the following query. + +| Fields | description | +| ----------- | ----------- | +| database | id of the database | +| container | id of the container | +| item | id of the item | + + +### Deleting an item +To delete an item from a container of a database in a Cosmos DB, use the following query. + +| Fields | description | +| ----------- | ----------- | +| database | id of the database | +| container | id of the container | +| item | id of the item | + + +### Querying documents +To query documents from a container of a database in a Cosmos DB using SQL-like syntax, use the following query. + +| Fields | description | +| ----------- | ----------- | +| database | id of the database | +| container | id of the container | +| query | query to be executed. Example: `SELECT * FROM c WHERE c.age > 20 AND c.age <= 30` | diff --git a/docs/versioned_docs/version-2.3.0/data-sources/couchdb.md b/docs/versioned_docs/version-2.3.0/data-sources/couchdb.md new file mode 100644 index 0000000000..385ed788ad --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/couchdb.md @@ -0,0 +1,311 @@ +--- +id: couchdb +title: CouchDB +--- + +# CouchDB + +ToolJet can connect to CouchDB databases to read and write data. CocuhDB uses basic auth for authentication , username and password for the database is required to create an CouchDB data source on ToolJet. For more info visit [CouchDB docs](https://docs.couchdb.org/en/stable/). + + +Couch auth + + +## Supported queries: + +- [Listing records](#listing-records) +- [Retrieving a record](#retrieving-a-record) +- [Creating a record](#creating-a-record) +- [Updating a record](#updating-a-record) +- [Deleting a record](#deleting-a-record) +- [Find](#find) +- [Retrieving a view](#retrieving-a-view) + +:::info +NOTE: Record ID is same as document ID("_id") . +::: +### Listing records + +This query lists all the records in a database. + +#### Optional parameters: + +- **Include docs** +- **Descending order** +- **Limit** +- **Skip** + +:::info +descending (boolean) – Return the documents in descending order by key. Default is false. + +limit (number) – Limit the number of the returned documents to the specified number. + +skip (number) – Skip this number of records before starting to return the results. Default is 0. + +include_docs (boolean) – include_docs key is set to false by default , if true it returns the document data along with the default fields. + +::: + + +Couch listing + + + +Example response from CouchDb: + +```json +{ + "total_rows": 3, + "offset": 0, + "rows": [ + { + "id": "23212104e60a71edb42ebc509f000dc2", + "key": "23212104e60a71edb42ebc509f000dc2", + "value": { + "rev": "1-0cc7f48876f15883394e5c139c628123" + } + }, + { + "id": "23212104e60a71edb42ebc509f00216e", + "key": "23212104e60a71edb42ebc509f00216e", + "value": { + "rev": "1-b3c45696b10cb08221a335ff7cbd8b7a" + } + }, + { + "id": "23212104e60a71edb42ebc509f00282a", + "key": "23212104e60a71edb42ebc509f00282a", + "value": { + "rev": "1-da5732beb913ecbded309321cac892d2" + } + }, + ] +} +``` + +### Retrieving a record + +#### Required parameters: + +- **Record ID** + + +Couch retrieve view + + + +Example response from CouchDb: + +```json +{ + "_id": "e33dc4e209689cb0400d095fc401a1e0", + "_rev": "1-a62af8e14451af88c150e7e718b7a0e8", + "0": { + "name": "test data" + } +} +``` +The returned JSON is the JSON of the document, including the document ID and revision number: + + +### Creating a record + + +Couch create view + + +#### Example Records: + +```json + [{"name":"tooljet"}] +``` + +Click on the `run` button to run the query. + +:::info +NOTE: Query must be saved before running. +::: + +Example response from CouchDb: +```json + + { + "ok": true, + "id": "23212104e60a71edb42ebc509f0049a2", + "rev": "1-b0a625abc4e21ee554737920156e911f" +} + +``` + +### Updating a record + +You can get the revision id value, by sending a GET request to get the document details. +You get the document as JSON in the response. For each update to the document, the revision field "_rev" gets changed. + +#### Required parameters: +- **Revision ID** +- **Record ID** + + +Couch update view + + +#### Example body: + +```json + [{"name":"tooljet"}] +``` + + +Click on the `run` button to run the query. + +:::info +NOTE: Query must be saved before running. +::: + +Example response from CouchDb: +```json +{ + "ok": true, + "id": "23212104e60a71edb42ebc509f0049a2", + "rev": "2-b0a625abc4e21ee554737920156e911f" +} +``` + +### Deleting a record + +#### Required parameters: +- **Revision ID** +- **Record ID** + + +Couch delete view + + + +Click on the `run` button to run the query. + + +Example response from CouchDb: + +```json +{ + "ok": true, + "id": "rev_id=2-3d01e0e87139c57e9bd083e48ecde13d&record_id=e33dc4e209689cb0400d095fc401a1e0", + "rev": "1-2b99ef28c03e68ea70bb668ee55ffb7b" +} +``` + +### Find + +Find documents using a declarative JSON querying syntax. + +#### Required parameters: +- **Selector** + +:::info +NOTE: +selector syntax: https://pouchdb.com/guides/mango-queries.html +::: + + +Couch find + + +#### Example body: + +```json +{ + "selector": { + "year": {"$gte": 2015} + }, + "fields": ["year"] +} +``` + + +Click on the `run` button to run the query. + +:::info +NOTE: +selector (json) – JSON object describing criteria used to select documents. + +More information : https://docs.couchdb.org/en/stable/api/database/find.html +::: + +Example response from CouchDb: + + +Couch find response + + +### Retrieving a view + +Views are the primary tool used for querying and reporting on CouchDB documents. + +#### Required parameters: +- **View url** + +Reference for view :https://docs.couchdb.org/en/3.2.0/ddocs/views/intro.html#what-is-a-view + + +Couch get view + + +#### Optional parameters: + +- **Start key** +- **End key** +- **Limit** +- **Skip** + +Click on the `run` button to run the query. + +:::info +startkey (json) – Return records starting with the specified key. + +endkey (json) – Stop returning records when the specified key is reached. + +limit (number) – Limit the number of the returned documents to the specified number. + +skip (number) – Skip this number of records before starting to return the results. Default is 0. +::: + +Example response from CouchDb: +```json +{ + "total_rows": 4, + "offset": 0, + "rows": [ + { + "id": "23212104e60a71edb42ebc509f000dc2", + "key": "23212104e60a71edb42ebc509f000dc2", + "value": { + "rev": "1-0cc7f48876f15883394e5c139c628123" + } + }, + { + "id": "23212104e60a71edb42ebc509f00216e", + "key": "23212104e60a71edb42ebc509f00216e", + "value": { + "rev": "1-b3c45696b10cb08221a335ff7cbd8b7a" + } + }, + { + "id": "23212104e60a71edb42ebc509f00282a", + "key": "23212104e60a71edb42ebc509f00282a", + "value": { + "rev": "1-da5732beb913ecbded309321cac892d2" + } + }, + { + "id": "23212104e60a71edb42ebc509f002cbd", + "key": "23212104e60a71edb42ebc509f002cbd", + "value": { + "rev": "1-ca5bb3c0767eb42ea6c33eee3d395b59" + } + + } + ] +} +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/data-sources/custom-js.md b/docs/versioned_docs/version-2.3.0/data-sources/custom-js.md new file mode 100644 index 0000000000..6655a6efdf --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/custom-js.md @@ -0,0 +1,56 @@ +--- +id: run-js +title: Run JavaScript code +--- + +# Run JavaScript code + +You can write custom JavaScript code to interact with components and queries. To do that, you just need to create a new query and select **Run JavaScript Code** from the data sources dropdown. + +
+ +Run JavaScript code + +
+ +#### Example: Displaying random number + +- Let's drag a **button** and a **text** widget inside a container widget. +- Click on the `+` on the query panel to create a query and select **Run JavaScript code** from the available datasources +- Write the code in **JavaScript editor** and save the query: +```jsx +const a = Math.floor(Math.random() * (10 - 1)) + 1; +return a; +``` +:::tip +- The `return` statement is used to end the code and the value specified to the `return` statement will be stored in the `data` property of the query. +ex: `{{queries.runjs1.data}}` +- You cannot use `console.log` in Run JavaScript code +::: + +- Let's edit the properties of widgets: + - Add an event handler to the button - Select **On Click** event, **Run Query** action, and select the `runjs1` query that we created. This will run the JavaScript code every time the button is clicked. + - Edit the property of text widget - In the text field enter **Random number: `{{queries.runjs1.data}}`**. It will display the output as Random number: *result from JS code* + + +
+ +Run JavaScript code + +
+ +You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API. + +### Libraries + +ToolJet allows you to internally utilize these libraries: + +| Name | Documentation | +| ----------- | ----------- | +| Moment | [https://momentjs.com/docs/](https://momentjs.com/docs/) | +| Lodash | [https://lodash.com/docs/](https://lodash.com/docs/) | +| Axios | [https://axios-http.com/docs/intro](https://axios-http.com/docs/intro) | + +:::info +Issues with writing custom JavaScript code? Ask in our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg). +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/data-sources/dynamodb.md b/docs/versioned_docs/version-2.3.0/data-sources/dynamodb.md new file mode 100644 index 0000000000..76c0713505 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/dynamodb.md @@ -0,0 +1,38 @@ +--- +id: dynamodb +title: DynamoDB +--- + +# DynamoDB + +ToolJet can connect to DynamoDB to read and write data. + +## Connection + +To add a new DynamoDB, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select DynamoDB from the modal that pops up. + +ToolJet requires the following to connect to your DynamoDB. + +- **Region** +- **Access key** +- **Secret key** + +It is recommended to create a new IAM user for the database so that you can control the access levels of ToolJet. + +ToolJet - Dynamo connection + + +Click on 'Test connection' button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on 'Save' button to save the data source. + +## Querying DynamoDB + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. Select the operation that you want to perform and click 'Save' to save the query. + +ToolJet - Dynamo query + + +Click on the 'run' button to run the query. NOTE: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/elasticsearch.md b/docs/versioned_docs/version-2.3.0/data-sources/elasticsearch.md new file mode 100644 index 0000000000..3f06fc7b3d --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/elasticsearch.md @@ -0,0 +1,80 @@ +--- +id: elasticsearch +title: Elasticsearch +--- + +# Elasticsearch +ToolJet can connect to your Elasticsearch cluster to read and write data. + +## Connection +Please make sure the host/IP of the Elasticsearch cluster is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist our IP**. + +To add a new Elasticsearch database, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select Elasticsearch from the modal that pops up. + +ToolJet requires the following to connect to your Elasticsearch cluster: +- **Host** +- **Port** +- **Username** +- **Password** + +
+ +Elastic connect + + +
+ +Elastic search datasource is also providing an option for connecting services with ssl certificates. +- You can either use CA / Client certificates option. + +Elastic ssl + + + +## Querying Elasticsearch + +Click on `+` button of the query manager at the bottom panel of the editor and select the Elasticsearch added in the previous step as the data source. +Select the operation that you want to perform on your Elasticsearch cluster and click `Create` to save the query. + +
+ +Elastic query + + +
+ +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +## Supported operations + +#### Search + +This operation allows you to execute a search query and get back search hits that match the query. Read the Elasticsearch's `Search` guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html)**. + + +Elastic search + +#### Index a document + +This operation allows you to add a JSON document to the specified data stream or index. Read the Elasticsearch's `Index` guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html)**. + + +Elastic index + + +#### Get a document + +This operation allows you to retrieve the specified JSON document from the index. Read the Elasticsearch's `Get` guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html)**. + + +Elastic get + + +#### Update a document + +This operation allows to update a document using the specified script. Read the Elasticsearch's `Update` guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html)**. + + +Elastic update diff --git a/docs/versioned_docs/version-2.3.0/data-sources/firestore.md b/docs/versioned_docs/version-2.3.0/data-sources/firestore.md new file mode 100644 index 0000000000..c0375c29c6 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/firestore.md @@ -0,0 +1,163 @@ +--- +id: firestore +title: Cloud Firestore +--- + +# Cloud Firestore + +## Connection +ToolJet connects to your Cloud Firestore using JSON key of your GCP service account. +To generate a new key, check out [Firestore's official documentation](https://cloud.google.com/iam/docs/creating-managing-service-account-keys#iam-service-account-keys-create-console). + +Once the key is downloaded, click on `+` button of data sources panel at the left-bottom corner of the app editor. Select Firestore from the modal that pops up. Paste the key in the field for GCP key. Click on **Test connection** button to verify if the service account can access Firestore from ToolJet server. Click on **Save** button to save the datasource. + + +firestore add ds + + +## Querying Firestore + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. + + +firestore QUERY + + +Select the operation that you want to perform on Firestore and click **Save** to save the query. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +## Supported operations +1. [Get document](#get-document) +2. [Query collection](#query-collection) +3. [Add Document to Collection](#add-document-to-collection) +4. [Update document](#update-document) +5. [Set document](#set-document) +6. [Bulk update using document id](#bulk-update-using-document-id) +7. [Delete document](#delete-document) + +### Get document + +Use this operation to get the data in a document. + +#### Required parameters: + +- **Path**: Enter the path of the document. Path format: `collection name/document id`. ex: `books/23e2wsds32` + + +firestore get + + +### Query collection + +Use this operation to query all the documents in a collection. Check firestore doc [here](https://firebase.google.com/docs/reference/js/v8/firebase.database.Query). + +#### Required parameters: + +- **Path**: Enter the name of the collection to be queried. Example: `books` + +#### Optional parameters: + +- **Order type**: Select ascending or descending from the dropdown. + +- **Limit**: Maximum number of documents to return in response. By default will return maximum 25 results. Maximum of 100 results allowed per request. The Limit value should be of integer type. + +- **Field, Operator, and Value**: For filtering the results, you can enter a document field name, use appropriate operator from the dropdown and set a value. + + +firestore collection + + +### Add Document to Collection + +Use this operation for creating a new document in a collection. + +#### Required parameters: + +- **Collection**: Enter the path of the document in a collection. Path format: `collection name/document id`. ex: `books/33243dwe2332` +- **Body**: Enter the Field names and their values in json form. example body: +```json +{ +"Author": "Shubh", +"id": 5 +} +``` + + +firestore document + + +### Update document + +Use this operation for updating the existing document in a collection. Also, it only updates fields if they exist, but doesn't replace an entire object like [set operation](#set-document). + +#### Required parameters: + +- **Path**: Enter the path of the document in a collection. Path format: `collection name/document id`. ex: `books/33243dwe2332` +- **Body**: Enter the Field names and their values in json form. example body: +```json +{ +"Author": "Shubhendra", +"id": 3 +} +``` + + +firestore update + + +### Set document + +This operation replaces your chosen object with the value that you provide. So if your object has 5 fields, and you use Set operation and pass object with 3 fields, it will now have 3 fields. + +#### Required parameters: + +- **Path**: Enter the path of the document in a collection. Path format: `collection name/document id`. ex: `books/33243dwe2332` +- **Body**: Enter the Field names and their values in json form. example body: +```json +{ +"Author": "Shefewfbh", +"id": 9 +} +``` + + +firestore set + + +### Bulk update using document id + +Use this operation for bulk updating documents. + +#### Required parameters: + +- **Collection**: +- **Key for document ID**: +- **Records**: + + + +firestore bulk + + +### Delete document + +Use this operation for deleting a document in a collection. + +#### Required parameters: + +- **Path**: Enter the path of the document to be deleted in a collection. Path format: `collection name/document id`. ex: `books/33243dwe2332` + + +firestore delete + + +## Transforming firestore query result for Table widget + +The Firestore query result is in the form of object so we’ll need to transform it into array. + +```js +return data = Array(data) +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/data-sources/gcs.md b/docs/versioned_docs/version-2.3.0/data-sources/gcs.md new file mode 100644 index 0000000000..6483a43408 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/gcs.md @@ -0,0 +1,41 @@ +--- +id: gcs +title: Google Cloud Storage +--- + +# Google Cloud Storage + +ToolJet can connect to GCS buckets and perform various operation on them. + +## Supported operations + +-**Read file** +-**Upload file** +-**List buckets** +-**List files in a bucket** +-**Signed url for download** +-**Signed url for upload** + +## Connection + +To add a new GCS source, click on the **Add or edit datasource** icon on the left sidebar of the app editor and click on `Add datasource` button. Select GCS from the modal that pops up. + +ToolJet requires the **json private key** of a service account to be able to connect to GCS. +You can follow the [google documentation](https://cloud.google.com/docs/authentication/getting-started) to get started. + +gcs connection + +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying GCS + +Click on `+` button of the **query manager** at the bottom panel of the editor and select the data source added in the previous step as the data source. Select the operation that you want to perform and click **Save** to save the query. + +gcs query + +Click on the **run** button to run the query. +**NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/google.sheets.md b/docs/versioned_docs/version-2.3.0/data-sources/google.sheets.md new file mode 100644 index 0000000000..2f8edae304 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/google.sheets.md @@ -0,0 +1,112 @@ +--- +id: google.sheets +title: Google Sheets +--- + +# Google Sheets + +ToolJet can connect to Google Sheet using OAuth 2.0, which helps us to limit an application's access to a user's account. + +## How to integrate Google Sheets + + + +## Self-Hosted Configuration + +If you are self-hosting the application, you will need to perform some additional steps. + + 1. Follow the [Google OAuth 2.0 setup steps outlined here](/docs/setup/env-vars#google-oauth--optional-) + 2. Set the following environment variables with the values from the previous step: + * `GOOGLE_CLIENT_ID` + * `GOOGLE_CLIENT_SECRET` + * `TOOLJET_HOST` + 3. Enable the Google Sheets API in the GCP console + +## Authorization Scopes + +You can create a Google Sheets data source with one of either of the two permission scopes : + 1. **Read Only** + 2. **Read and Write** + + +google sheets + + +## Operations + +Using Google sheets data source you can perform several operations from your applications like: + + 1. **[Read data from a sheet](/docs/data-sources/google.sheets#read-data-from-a-sheet)** + 2. **[Append data to a sheet](/docs/data-sources/google.sheets#append-data-to-a-sheet)** + 3. **[Update single row of a sheet](/docs/data-sources/google.sheets#update-single-row-of-a-sheet)** + 4. **[Delete row from a sheet](/docs/data-sources/google.sheets#delete-row-from-a-sheet)** + 5. **[Get spreadsheet info](/docs/data-sources/google.sheets#get-spreadsheet-info)** + +### Read data from a sheet + +This operation returns the table data from the spreadsheet in the form of json object. + +| Fields | description | +| ----------- | ----------- | +| Spreadsheet ID | It is mandatory to enter the spreadsheet-id. The spreadsheet-id can be found in the URL of the spreadsheet. Example URL: https://docs.google.com/spreadsheets/d/1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM/edit#gid=0 - in this URL, the `1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM` is the spreadsheet-id. | +| Range | This is optional. You can specify the range of cells in this field. If left empty, it will select the range `A1:Z500`. | +| Sheet | This is optional. You can specify `sheet name` if it has more than 1 sheets, else it will automatically choose the first sheet. | + + + +google sheets read + + +### Append data to a sheet + +You can add more rows to the table using the append operation. + +| Fields | description | +| ----------- | ----------- | +| Spreadsheet ID | It is mandatory to enter the spreadsheet-id. The spreadsheet-id can be found in the URL of the spreadsheet. Example URL: https://docs.google.com/spreadsheets/d/1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM/edit#gid=0 - in this URL, the `1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM` is the spreadsheet-id. | +| Sheet | This is optional. You can specify `sheet name` if it has more than 1 sheets, else it will automatically choose the first sheet. | +| Rows | Enter the row data in the json array form. Each object in an array will represent a single row. Example: `[ {"name":"John", "email":"John@tooljet.com"},{...},{...} ]` In each object, the `key` represents the **column name** and the `value` represents the **cell data**. | + + +google sheets append + + +### Update single row of a sheet + +You can update the existing data in sheet using this operation. + +| Fields | description | +| ----------- | ----------- | +| Spreadsheet ID | It is mandatory to enter the spreadsheet-id. The spreadsheet-id can be found in the URL of the spreadsheet. Example URL: https://docs.google.com/spreadsheets/d/1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM/edit#gid=0 - in this URL, the `1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM` is the spreadsheet-id. | +| Where | Enter the column name such as `id` for choosing a row. | +| Operator | Choose the `===` operator to check the equality. | +| Value | Enter the any `id` number/name that you want to update. | +| Rows | Enter the row data. Example: `{{({id: components.textinput4.value, company: components.textinput1.value, position: components.textinput2.value, url: components.textinput3.value, 'date-applied': components.datepicker1.value, status: components.dropdown1.value})}}` | + + +google sheets update + + +### Delete row from a sheet + +Use this operation delete a specific row from the sheet. + +| Fields | description | +| ----------- | ----------- | +| Spreadsheet ID | It is mandatory to enter the spreadsheet-id. The spreadsheet-id can be found in the URL of the spreadsheet. Example URL: https://docs.google.com/spreadsheets/d/1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM/edit#gid=0 - in this URL, the `1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM` is the spreadsheet-id. | +| GID | You'll find the GID in the end of the URL of spreadsheet. In the example mentioned above, the GID is 0 | +| Delete row number | Just enter the row number that you want to delete. | + + + +google sheets delete + + +### Get spreadsheet info + +This operation can be used to get some basic information of the spreadsheet such as the number of sheets, theme, time-zone, format, and url etc. + +Here is the `Preview` of the query that used the get spreadsheet info operation. + + +google sheets get info diff --git a/docs/versioned_docs/version-2.3.0/data-sources/graphql.md b/docs/versioned_docs/version-2.3.0/data-sources/graphql.md new file mode 100644 index 0000000000..3a27f73970 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/graphql.md @@ -0,0 +1,55 @@ +--- +id: graphql +title: GraphQL +--- + +# GraphQL + +ToolJet can connect to GraphQL endpoints to execute queries and mutations. + +## Connection + +To add a new GraphQL datasource, click the `+` button on data sources panel at the bottom-left corner of the app builder and then select GraphQL from the modal that pops up. + +ToolJet requires the following to connect to a GraphQL datasource: + +- **URL of the GraphQL endpoint** + +The following optional parameters are also supported: + + | Type | Description | + | ----------- | ----------- | + | URL params | Additional query string parameters| + | headers | Any headers the GraphQL source requires| + +
+ +ToolJet - Data source - GraphQl + +
+ +Click on the **Save** button to save the data source. + +## Querying GraphQL + +Click on `+` button of the query manager at the bottom panel of the editor and select the GraphQL endpoint added in the previous step as the data source. + +### Required Parameters: +- **Query** + +### Optional Parameters +- **Variable** +- **Headers** + +
+ +ToolJet - Data source - GraphQl + +
+ + +Click on the 'Create' button to create the query or Click on the `Run` button to create and trigger the query. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/influxdb.md b/docs/versioned_docs/version-2.3.0/data-sources/influxdb.md new file mode 100644 index 0000000000..27f881e957 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/influxdb.md @@ -0,0 +1,129 @@ +--- +id: influxdb +title: InfluxDB +--- + +# InfluxDB + +ToolJet can connect to InfluxDB databases to read and write data. Use the Token authentication scheme to authenticate to the InfluxDB API. For more info visit [InfluxDB docs](https://docs.influxdata.com/). + +## Connection + +ToolJet connects to InfluxDB using : + +- **API Token** +- **Host** +- **Port** +- **Protocol** (HTTP/HTTPS) + +:::info +For generating API Token visit [InfluxDB docs](https://docs.influxdata.com/influxdb/cloud/security/tokens/create-token/). +::: + +
+ +![ToolJet - Data source - influxDB](/img/datasource-reference/influxdb/influxauth.png) + +
+ +## Supported queries: + +- [Write data](#write-data) + +- [Query data](#query-data) + +- [Generate an Abstract Syntax Tree (AST) from a query](#generate-an-abstract-syntax-tree-ast-from-a-query) + +- [Retrieve query suggestions](#retrieve-query-suggestions) + +- [Retrieve query suggestions for a branching suggestion](#retrieve-query-suggestions-for-a-branching-suggestion) + +- [Analyze a Flux query](#analyze-a-flux-query) + +- [List buckets](#list-buckets) + +- [Create a bucket](#create-a-bucket) + +- [Retrieve a bucket](#retrieve-a-bucket) + +- [Update a bucket](#update-a-bucket) + +- [Delete a bucket](#delete-a-bucket) + + +influx operations + + +### Write data + +This operation writes data to a bucket. + +#### Required parameters: + +- **Bucket** +- **Organization name or ID** + +#### Optional parameters: + +- **Precision** + +### Query data + +Retrieves data from InfluxDB buckets. + +#### Required parameters: +- **Organization name or ID** + +### Generate an Abstract Syntax Tree (AST) from a query + +This operation analyzes flux query and generates a query specification. + +#### Required parameters: + +- **Query** + +### Retrieve query suggestions + +This query retrieve query suggestions. + +### Retrieve query suggestions for a branching suggestion + +This operation retrieve query suggestions for a branching suggestion. + +#### Required parameters: +- **Name** + +### Analyze a Flux query + +This Analyzes a Flux query. + +#### Required parameters: + +- **Query** + +### List buckets + +This operation lists all the buckets in a database. +### Create a bucket + +#### Required parameters: + +- **Query** + +### Retrieve a bucket + +This operation retrieve a bucket in a database. + +#### Required parameters: +- **Bucket ID** + +### Update a bucket + +#### Required parameters: +- **Bucket ID** +- **Query** + +### Delete a bucket + +#### Required parameters: +- **Bucket ID** diff --git a/docs/versioned_docs/version-2.3.0/data-sources/mailgun.md b/docs/versioned_docs/version-2.3.0/data-sources/mailgun.md new file mode 100644 index 0000000000..6b4c71ca78 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/mailgun.md @@ -0,0 +1,64 @@ +--- +id: mailgun +title: Mailgun +--- + +# Mailgun + +ToolJet can connect to your Mailgun account to send emails. + +ToolJet - Data source - Mailgun + +:::info +The Mailgun API Datasource supports for interaction with the mail endpoint of the [Mailgun API](https://documentation.mailgun.com/en/latest/api-intro.html#authentication-1). +::: + +## Connection + +To add a new Mailgun API datasource, click the **Datasource manager** icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select Mailgun API from the modal that pops up. + +Enter your **Mailgun API key** in the "API key" field. + +:::tip +Mailgun API key is required to create an Mailgun datasource on ToolJet. You can generate API key by visiting [Mailgun account page](https://app.mailgun.com/app/account/security/api_keys). +::: + +Click on the 'Save' button to save the data source. + +## Supported operations + +1. Email service + +### Email service + +Required parameters: + +- Send email to +- Send email from +- Subject +- Body as text + +Optional parameters: + +- Body as HTML + +ToolJet - Query Mailgun + +:::info +**Send mail to** - accepts a single email id. +For example: +`{{"dev@tooljet.io"}}`. + +**Send mail from** - accepts a string. +For example: `admin@tooljet.io` +::: + +:::tip +**Send a single email to multiple recipients** - The `Send mail to` field can contain an array of recipients, which will send a single email with all of the recipients in the field. + +**Send multiple individual emails to multiple recipients** - set Multiple recipients field to `{{true}}` and the `Send mail to` field will be split into multiple emails and send to each recipient. +::: + +:::note +NOTE: Query should be saved before running. +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/mariadb.md b/docs/versioned_docs/version-2.3.0/data-sources/mariadb.md new file mode 100644 index 0000000000..ccdb027651 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/mariadb.md @@ -0,0 +1,49 @@ +--- +id: mariadb +title: MariaDB +--- + +# MariaDB + +ToolJet can connect to MariaDB to read and write data. + +## Connection + +To add a new MariaDB data source, click on the `+` button on datasources panel at the left sidebar of the app builder. Select MariaDB from the modal that pops up. + +ToolJet requires the following to connect to your DynamoDB. + +- **Host** +- **Username** +- **Password** +- **Connection Limit** +- **Port** +- **Database** +- **SSL** +- **SSL Certificate** + +
+ +MariaDB + +
+ +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying MariaDB + +Click on `+` button of the query manager at the bottom panel of the builder and select the MariaDB datasource added in the previous step. + +
+ +MariaDB query + +
+ +Click on the **run** button to run the query. + +**NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/minio.md b/docs/versioned_docs/version-2.3.0/data-sources/minio.md new file mode 100644 index 0000000000..3f19ffc32d --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/minio.md @@ -0,0 +1,51 @@ +--- +id: minio +title: MinIO +--- + +# MinIO + +ToolJet can connect to minio and perform various operation on them. + +## Supported operations + +- **Read object** +- **Put object** +- **Remove object** +- **List buckets** +- **List objects in a bucket** +- **Presigned url for download** +- **Presigned url for upload** + + +## Connection + +To add a new minio source, click on the **Add or edit datasource** icon on the left sidebar of the app editor and click on `Add datasource` button. Select Minio from the modal that pops up. + +ToolJet requires the following to connect to your DynamoDB: + +- **Host** +- **Port** +- **Access key** +- **Secret key** + +
+ +miniIo connect + +
+ +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying Minio + +Click on `+` button of the **query manager** at the bottom panel of the editor and select the data source added in the previous step as the data source. Select the operation that you want to perform and click **Save** to save the query. + +miniIo query + +Click on the **run** button to run the query. +**NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/mongodb.md b/docs/versioned_docs/version-2.3.0/data-sources/mongodb.md new file mode 100644 index 0000000000..0ae21b519a --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/mongodb.md @@ -0,0 +1,109 @@ +--- +id: mongodb +title: MongoDB +--- + +# MongoDB + +ToolJet can connect to MongoDB to read and write data. + +## Connection + +Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. + +To add a new MongoDB, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select MongoDB from the modal that pops up. + +ToolJet requires the following to connect to your MongoDB. + +- **Host** +- **Port** +- **Username** +- **Password** + +It is recommended to create a new MongoDB user so that you can control the access levels of ToolJet. + +ToolJet - Mongo connection + +Click on 'Test connection' button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on 'Save' button to save the data source. + +## Querying MongoDB + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. Select the operation that you want to perform and click 'Save' to save the query. + +ToolJet - Mongo query + + + +Click on the 'run' button to run the query. NOTE: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: + +### Supported operations +- [List Collections](#list-collections) +- [Find One](#find-one) +- [Find Many](#find-many) +- [Total Count](#total-count) +- [Count](#count) +- [Distinct](#distinct) +- [Insert One](#insert-one) +- [Insert Many](#insert-many) +- [Update One](#update-one) +- [Update Many](#update-many) +- [Replace One](#replace-one) +- [Find One and Update](#find-one-and-update) +- [Find One and Replace](#find-one-and-replace) +- [Find One and Delete](#find-one-and-delete) +- [Aggregate](#aggregate) +- [Delete One](#delete-one) +- [Delete Many](#delete-many) +- [Bulk Operations](#bulk-operations) +#### List Collections +Returns list of collections +#### Fine One +Return a document which satisfy the given filter and options. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/findOne) +#### Fine Many +Return list of documents which satisfy the given filter and options. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/find/) +#### Total Count +Returns an estimation of the number of documents in the collection based on collection metadata. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#estimateddocumentcount) +#### Count +Returns the number of documents based on the filter. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#countdocuments) +#### Distinct +Retrieve a list of distinct values for a field based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/distinct/) +#### Insert One +Insert a document. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/insertOne/) +#### Insert Many +Insert list of documents. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/insertMany/) +#### Update One +Update a document based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/updateOne/) +#### Update Many +Update many documents based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/updateMany/) +#### Replace One +Replace a document based on filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/replaceOne/) +#### Find One and Update +If your application requires the document after updating, use this instead of `Update One`. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#findoneandupdate) +#### Find One and Replace +If your application requires the document after updating, use this instead of `Replace One`. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#findoneandreplace) +#### Find One and Delete +If your application requires the document after deleting, use this instead of `Delete One`. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#findoneanddelete) +#### Aggregate +Aggregation operations are expressions you can use to produce reduced and summarized results. [Reference](https://docs.mongodb.com/drivers/node/v4.0/fundamentals/aggregation/) +#### Delete One +Delete a record based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/deleteOne/) +#### Delete Many +Delete many records based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/deleteMany/) +#### Bulk Operations +Perform bulk operations. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/bulkWrite/) + +### Dynamic Quries +```javascript +{ amount: { $lt: '{{ components.textinput1.value }}' }} + +// Dates +// supported: Extended JSON syntax +{ createdAt: { $date: '{{ new Date('01/10/2020') }}'} } +// not supported: MongoDB classic syntax +{ createdAt: new Date('01/10/2020') } +``` +Reference on [mongodb extended JSON](https://docs.mongodb.com/manual/reference/mongodb-extended-json/) supported data types diff --git a/docs/versioned_docs/version-2.3.0/data-sources/mssql.md b/docs/versioned_docs/version-2.3.0/data-sources/mssql.md new file mode 100644 index 0000000000..a8aa169ce5 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/mssql.md @@ -0,0 +1,42 @@ +--- +id: mssql +title: MS SQL Server / Azure SQL databases +--- + +# MS SQL Server / Azure SQL databases + + +ToolJet can connect to MS SQL Server & Azure SQL databases to read and write data. + +## Connection + +Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. + +To add new MS SQL Server / Azure SQL database, click on the '+' button on data sources panel at the left-bottom corner of the app editor. Select `SQL Server` from the modal that pops up. + +ToolJet requires the following to connect to your PostgreSQL database. + +- **Host** +- **Port** +- **Username** +- **Password** +- **Azure** - Select this option if you are using Azure SQL databases. + +It is recommended to create a new database user so that you can control the access levels of ToolJet. + +Click on 'Test connection' button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on 'Save' button to save the data source. + +ToolJet - Redis connection + + +## Querying SQL Server / Azure SQL databases +Click on '+' button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. + +Click on the 'run' button to run the query. NOTE: Query should be saved before running. + +ToolJet - Redis connection + + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/mysql.md b/docs/versioned_docs/version-2.3.0/data-sources/mysql.md new file mode 100644 index 0000000000..eb5d441cc1 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/mysql.md @@ -0,0 +1,65 @@ +--- +id: mysql +title: MySQL +--- + +# MySQL + +ToolJet can connect to MySQL databases to read and write data. + +## Connection + +ToolJet requires the following to connect to your MySQL database. Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. + +To add a new MySQL database, click on the `+` button on data sources panel at left sidebar in the app editor. Select MySQL from the modal that pops up. + +ToolJet requires the following to connect to your MySQL database. + +- **Host** +- **Port** +- **Username** +- **Password** + +It is recommended to create a new MySQL database user so that you can control the access levels of ToolJet. + +
+ +mysql + +
+ +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying MySQL + +Once you have added a MySQL data source, click on `+` button of the query manager to create a new query. There are two modes by which you can query SQL: + + 1. **[SQL mode](/docs/data-sources/mysql#sql-mode)** + 2. **[GUI mode](/docs/data-sources/mysql#gui-mode)** + +#### SQL mode + +SQL mode can be used to write raw SQL queries. Select SQL mode from the dropdown and enter the SQL query in the editor. Click on the `run` button to run the query. + +**NOTE**: Query should be saved before running. + + +mysql mode + + + +#### GUI mode + +GUI mode can be used to query MySQL database without writing queries. Select GUI mode from the dropdown and then choose the operation **Bulk update using primary key**. Enter the **Table** name and **Primary key column** name. Now, in the editor enter the records in the form of an array of objects. + +**Example**: `{{ [ {id: 1, channel: 33}, {id:2, channel:24} ] }}` + + +mysql gui mode + + +Click on the **run** button to run the query. **NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/n8n.md b/docs/versioned_docs/version-2.3.0/data-sources/n8n.md new file mode 100644 index 0000000000..3228af72c2 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/n8n.md @@ -0,0 +1,51 @@ +--- +id: n8n +title: n8n +--- + +# n8n + +ToolJet can trigger n8n workflows using webhook URLs. Please refer [this](https://docs.n8n.io/) to know more about n8n. + +## Connection + +Go to the data source manager on the left sidebar and click on `+` button to add new data source. Select n8n from the list of available data sources in the modal that pops-up. + +n8n webhooks can be called with or without an **Authentication**. You can keep the `Authentication type` as `none` if your webhook didn't have one or if it has one then you can choose the one from the dropdown and provide credentials: + +#### Authentication Types +- **Basic Auth**: To connect your n8n webhooks using basic auth you'll need to provide the following credentials: + - **Username** + - **Password** + +
+ +n8n basicauth + +
+ +- **Header Auth**: To connect your n8n webhooks using header auth the following fields are required: + - **Name / Key** + - **Value** + +
+ +n8n headerauth + +
+ +:::tip +Webhook credentials and instance credentials are different. Please use the credentials that you use with the webhook trigger. Know more: **[Webhook Authentication](https://docs.n8n.io/nodes/n8n-nodes-base.webhook/#:~:text=then%20gets%20deactivated.-,Authentication,-%3A%20The%20Webhook%20node)**. +::: + +## Trigger Workflow + +Click on `+` button of the query manager at the bottom panel of the editor and the select n8n as the datasource. + +You can trigger a workflow with `GET/POST` URL. Choose the request type from the `Methods` dropdown and then provide the required fields: + - **URL parameters** (Support for GET & POST) `Optional` + - **Body** (Only for POST URL) `Required` + + +n8n query + diff --git a/docs/versioned_docs/version-2.3.0/data-sources/notion.md b/docs/versioned_docs/version-2.3.0/data-sources/notion.md new file mode 100644 index 0000000000..88000f3aa6 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/notion.md @@ -0,0 +1,234 @@ +--- +id: notion +title: Notion +--- +# Notion + +ToolJet can connect to a Notion workspace to do operations on notion pages, databases and blocks. +## Connection + +For integrating Notion with ToolJet we will need the API token. The API token can be generated from your Notion workspace settings. Read the official Notion docs for [Creating an internal integration with notion API](https://www.notion.so/help/create-integrations-with-the-notion-api). + +
+ +notion api + +
+ +## Querying Notion + +Notion API provides support for: +- **[Database](#database)** +- **[Page](#page)** +- **[Block](#blocks)** +- **[User](#user)** + + +notion querying + + +:::tip + +Before querying Notion, you must share the database with your integration. Click the share button in your database view, find your integration name select it. + + +notion share + + +::: + +### Database + +On database resource you can perform the following operations: +- **[Retrieve a database](#1-retrieve-a-database)** +- **[Query a database](#2-query-a-database)** +- **[Create a database](#3-create-a-database)** +- **[Update a database](#4-update-a-database)** + + +notion db + + +#### 1. Retrieve a database + +This operations retrieves a Database object using the ID specified. + +##### Required parameters: + +- **Database ID**: You'll find the Database ID in the url. Suppose this is the example url: `https://www.notion.so/workspace/XXX?v=YYY&p=ZZZ` then `XXX` is the database ID, `YYY` is the view ID and `ZZZ` is the page ID. + + +notion db retreieve + + +#### 2. Query a database + +This operation gets a list of **Pages** contained in the database, filtered and ordered according to the filter conditions and sort criteria provided in the query. +##### Required parameters: + +- **Database ID** : You'll find the Database ID in the url. Suppose this is the example url: `https://www.notion.so/workspace/XXX?v=YYY&p=ZZZ` then `XXX` is the database ID, `YYY` is the view ID and `ZZZ` is the page ID. + +##### Optional parameters: + +- **Filter** : This must be an object of filters +- **Sort** : Array of sort objects +- **Limit** : limit for pagination +- **Start Cursor** : Next object id to continue pagination + +#### 3. Create a database + +This operation creates a database as a subpage in the specified parent page, with the specified properties. + +##### Required parameters: + +- **Database ID** : You'll find the Database ID in the url. Suppose this is the example url: `https://www.notion.so/workspace/XXX?v=YYY&p=ZZZ` then `XXX` is the database ID, `YYY` is the view ID and `ZZZ` is the page ID. +- **Page ID** : Page ID of the parent +- **Properties** : Properties defines the columns in a database + +##### Optional parameters: + +- **Title** : Title should be an array of rich_text properties +- **Icon type** : Currently notion api accepts two icon options, emoji, external URL +- **Icon value** : Value of selected icon type +- **Icon type** : Currently notion api accepts only external URL +- **Cover value** : Value of selected cover type + +#### 4. Update a database + +This operation updates an existing database as specified by the parameters. + +##### Required parameters: +- **Database ID** + +##### Optional parameters: + +- **Title** : Title should be an array of rich_text properties +- **Properties** : Properties defines the columns in a database +- **Icon type** : Currently notion api accepts two icon options, emoji, external URL +- **Icon value** : Value of selected icon type +- **Icon type** : Currently notion api accepts only external URL +- **Cover value** : Value of selected cover type + +### Page + +On page resource you can perform the following operations: +- **[Retrieve a page](#1-retrieve-a-page)** +- **[Create a page](#2-create-a-page)** +- **[Update a page](#3-update-a-page)** +- **[Retrieve a page property](#4-retrieve-a-page-property-item)** +- **[Archive a page](#5-archive-delete-a-page)** + + +notion page + + +#### 1. Retrieve a page +This operation retrieves a **Page** object using the ID specified. +##### Required parameters: +- **Page ID** + +#### 2. Create a page +This operation creates a new page in the specified database or as a child of an existing page. If the parent is a database, the property values of the new page in the properties parameter must conform to the parent database's property schema. If the parent is a page, the only valid property is title. +##### Parameters: +- **Page ID** +- **Properties** : Property values of this page +- **Icon type** : Currently notion api accepts two icon options, emoji, external URL +- **Icon value**: Value of selected icon type +- **Icon type** : Currently notion api accepts only external URL +- **Cover value** : Value of selected cover type + +#### 3. Update a page +This operation updates page property values for the specified page. Properties that are not set via the properties parameter will remain unchanged. +##### Parameters: +- **Page ID** +- **Parent type**: A database parent or page parent +- **Properties** : Property values of this page +- **Children** : Page content for the new page as an array of block objects +- **Icon type** : Currently notion api accepts two icon options, emoji, external URL +- **Icon value**: Value of selected icon type +- **Icon type** : Currently notion api accepts only external URL +- **Cover value** : Value of selected cover type + +#### 4. Retrieve a page property item +This operation retrieves a property_item object for a given page ID and property ID. Depending on the property type, the object returned will either be a value or a paginated list of property item values. See Property item objects for specifics. +##### Parameters: +- **Page ID** +- **Property ID** +- **Limit** +- **Start cursor** + +#### 5. Archive (delete) a page +##### Required parameters: +- **Page ID** +- **Archive**: Dropdown for archive and un archive the page + +### Blocks +The following operations can be performed on the block resource: +- **[Retrieve a block](#1-retrieve-a-block)** +- **[Append block children](#2-append-new-block-children)** +- **[Retrieve block children](#3-retrieve-block-children)** +- **[Update a block](#4-update-a-block)** +- **[Delete a block](#5-delete-a-block)** + + +notion block + + +:::info +To get the id for blocks, simply click on the menu icon for the block and click "Copy link". Afterwards, paste the link in the browser and it should look like this: `https://www.notion.so/Creating-Page-Sample-ee18b8779ae54f358b09221d6665ee15#7fcb3940a1264aadb2ad4ee9ffe11b0e` the string after **#** is the block id i.e. `7fcb3940a1264aadb2ad4ee9ffe11b0e`. +::: + +#### 1. Retrieve a block +This operation retrieves a **Block** object using the ID specified. + +##### Required parameters: +- **Block ID** + +#### 2. Append new block children +This operation creates and appends new children blocks to the parent block_id specified. + +##### Required parameters: +- **Block ID** +- **Children**: Array of block objects + +#### 3. Retrieve block children +This operation retrieves a paginated array of child block objects contained in the block using the ID specified. + +##### Required parameters: +- **Block ID** +- **Limit** +- **Start cursor** + +#### 4. Update a block +This operation updates the content for the specified block_id based on the block type. + +##### Required parameters: +- **Block ID** +- **Properties**: The block object type value with the properties to be updated +- **Archive** + +#### 5. Delete a block +##### Required parameters: +- **Block ID** + +### User +The following operations can be performed on the user notion resource: + +#### 1. Retrieve a user from current workspace +This operation retrieves a User using the ID specified. + + +notion user + +##### Required parameters: +- **User ID** + +#### 2. Retrieve list of users of a workspace + +This operation returns a paginated list of Users for the workspace. + +##### Required parameters: +- **Limit** +- **Start cursor** + +[Read more about notion API](https://developers.notion.com/reference/intro) diff --git a/docs/versioned_docs/version-2.3.0/data-sources/openapi.md b/docs/versioned_docs/version-2.3.0/data-sources/openapi.md new file mode 100644 index 0000000000..7e8fe98370 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/openapi.md @@ -0,0 +1,25 @@ +--- +id: openapi +title: OpenAPI +--- + +# OpenAPI + +ToolJet has a data source for generating REST API operations from OpenAPI Specs. + +## Connection +- Connections are generated from OpenAPI specifications. Currently supports Basic Auth, API Key, Bearer Token, OAuth 2.0 + +- Also supports specifications with multiple authentications + + [Read more](https://swagger.io/docs/specification/authentication/) + +## Querying OpenAPI +- Operations will be generated from specifications and each one will be different from other + +### Common fields +- Host (Base URL) + + Some specs can have one or more base URLs/servers and specific operations may have separate Base URLs. So you can select the URL from the host select + +- Operation diff --git a/docs/versioned_docs/version-2.3.0/data-sources/oracledb.md b/docs/versioned_docs/version-2.3.0/data-sources/oracledb.md new file mode 100644 index 0000000000..163a0ca513 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/oracledb.md @@ -0,0 +1,53 @@ +--- +id: oracledb +title: Oracle DB +--- + +# Oracle DB + +ToolJet can connect to Oracle databases to read and write data. + +## Connection + +A Oracle DB can be connected with the following credentails: +- **Host** +- **Port** +- **SID / Service Name** ( Database name must be a SID / Service Name ) +- **Database Name** +- **SSL** +- **Username** +- **Password** +- **Client Library Path** ( Only required for local setup ) + +
+ +![ToolJet - Data source - OracleDB](/img/datasource-reference/oracledb/oracleauth.png) + +
+ +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying Oracle DB + +Once you have added a Oracle DB data source, click on `+` button of the query manager to create a new query. There are two modes by which you can query SQL: + + 1. **[SQL mode](/docs/data-sources/oracledb#sql-mode)** + 2. **[GUI mode](/docs/data-sources/oracledb#gui-mode)** + +#### SQL mode + +SQL mode can be used to write raw SQL queries. Select SQL mode from the dropdown and enter the SQL query in the editor. Click on the `run` button to run the query. + +**NOTE**: Query should be saved before running. + +#### GUI mode + +GUI mode can be used to query Oracle database without writing queries. Select GUI mode from the dropdown and then choose the operation **Bulk update using primary key**. Enter the **Table** name and **Primary key column** name. Now, in the editor enter the records in the form of an array of objects. + +**Example**: `{{ [ {id: 1, channel: 33}, {id:2, channel:24} ] }}` + +Click on the **run** button to run the query. **NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/data-sources/overview.md b/docs/versioned_docs/version-2.3.0/data-sources/overview.md new file mode 100644 index 0000000000..ec7527f8af --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/overview.md @@ -0,0 +1,42 @@ +--- +id: overview +title: Overview +--- + +# Datasources : Overview + +Datasources pull in and push data to any source including databases, external APIs, or services. + +
+ +Datasources: Overview + +
+ +## Connecting datasources + +1. After logging in to ToolJet, create a new app from the dashboard + +2. There are two ways for connecting a datasource. You can connect from: + 1. **Left-sidebar**: On the left sidebar, click on the `datasource` icon and then click on the `+ add datasource` button + +
+ + Datasources: Overview + +
+ + 2. **Query Panel**: Go to the query panel at the bottom, click on the `+Add` button and then click `Add datasource` button + +
+ + Datasources: Overview + +
+ +3. Follow the steps in the **[Datasource Library](/docs/data-sources/airtable)** specific to the desired datasource + +:::info +ToolJet allows you to transform the data returned by datasources using **[Transformations](/docs/tutorial/transformations)** +::: + diff --git a/docs/versioned_docs/version-2.3.0/data-sources/postgresql.md b/docs/versioned_docs/version-2.3.0/data-sources/postgresql.md new file mode 100644 index 0000000000..c95cb7f587 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/postgresql.md @@ -0,0 +1,57 @@ +--- +id: postgresql +title: PostgreSQL +--- + +# PostgreSQL + +ToolJet can connect to PostgreSQL databases to read and write data. + +## Connection + +Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. + +To add a new PostgreSQL database, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select PostgreSQL from the modal that pops up. + +ToolJet requires the following to connect to your PostgreSQL database. + +- **Host** +- **Port** +- **Username** +- **Password** + +It is recommended to create a new PostgreSQL database user so that you can control the access levels of ToolJet. + + +ppg connect + + +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying PostgreSQL + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. PostgreSQL query editor has two modes, SQL & GUI. **[SQL mode](/docs/data-sources/postgresql#sql-mode)** can be used to write raw SQL queries and **[GUI mode](/docs/data-sources/postgresql#gui-mode)** can be used to query your PostgreSQL database without writing queries. + +#### SQL mode + +Select SQL mode from the dropdown and enter the query in the editor. Click on the `run` button to run the query. + +**NOTE**: Query should be saved before running. + + +ppg sql + + +#### GUI mode + +Select GUI mode from the dropdown and then choose the operation **Bulk update using primary key**. Enter the **Table** name and **Primary key column** name. Now, in the editor enter the **records** in the form of an array of objects. + +Click on the `run` button to run the query. **NOTE**: Query should be saved before running. + + +ppg gui + + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/redis.md b/docs/versioned_docs/version-2.3.0/data-sources/redis.md new file mode 100644 index 0000000000..12ff5718ca --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/redis.md @@ -0,0 +1,44 @@ +--- +id: redis +title: Redis +--- + +# Redis +ToolJet can run Redis commands on your Redis instances. + +## Connection + +ToolJet requires the following to connect to your Redis instances. + +ToolJet - Redis connection + +- **Host** +- **Port** - The default port for Redis server is 6379 +- **Username** +- **Password** + +Click on "Test" button to test the connection and click "Save" to save the data source. + +## Redis Queries + +List of supported commands: [Redis Official Documentation](https://redis.io/commands) + +### Examples + +`PING` command to test the Redis connection. If the connection is ready, the Redis server will respond with `PONG`. + +```shell +PING +``` + +`SET` command can be used to set the value for a key + +```shell +SET key value +``` + +`GET` command can be used to retrieve the value of a key + +```shell +GET key +``` diff --git a/docs/versioned_docs/version-2.3.0/data-sources/restapi.md b/docs/versioned_docs/version-2.3.0/data-sources/restapi.md new file mode 100644 index 0000000000..281d97388b --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/restapi.md @@ -0,0 +1,46 @@ +--- +id: restapi +title: REST API +--- + +# REST API + +ToolJet can connect to any REST endpoint available. + +## Connection + +To add a new REST API datasource, click the Datasources manager icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select REST API from the modal that pops up. +Click on the 'Save' button to save the data source. + +ToolJet - Data source - REST API + +ToolJet requires the following to connect to a REST API datasource. + +- URL of the REST endpoint + +The following optional parameters are also supported: + + | Type | Description | + | ----------- | ----------- | + | URL params | Additional query string parameters| + | headers | Any headers the REST API source requires| + | body | Any values or fields the REST API source requires| + +:::info +REST HTTP methods that are supported are **GET, POST, PUT, PATCH & DELETE**. +::: + +ToolJet - Data source - REST API + +## Querying REST API +Click on `+` button of the query manager at the bottom panel of the editor and select the REST API endpoint added in the previous step as the data source. + +Click on the 'run' button to run the query. + +:::note +NOTE: Query should be saved before running. +::: + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/rethinkdb.md b/docs/versioned_docs/version-2.3.0/data-sources/rethinkdb.md new file mode 100644 index 0000000000..6ffd11e7dc --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/rethinkdb.md @@ -0,0 +1,52 @@ +--- +id: rethinkdb +title: RethinkDB +--- +# RethinkDB + +ToolJet can connect to RethinkDB databases to read and write data. For more info visit this [doc](https://rethinkdb.com/api/javascript). + +ToolJet - Data source - RethinkDB + +## Connection + +ToolJet connects to InfluxDB using : + +- **Database** +- **Host** +- **Port** +- **Username** +- **Password** + + +## Supported queries: + +- Delete database + +- Delete Table + +- Create database + +- Create Table + +- List table + +- List database + +- Get all documents + +- Insert table data + +- Update all table data + +- Update by id + +- Delete table data by id + +- Delete all table data + +- Get document from primary key + +:::info +NOTE: Name field in all operation is database name if not given will take the default database used for connection. +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/run-py.md b/docs/versioned_docs/version-2.3.0/data-sources/run-py.md new file mode 100644 index 0000000000..4a1b749cb9 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/run-py.md @@ -0,0 +1,55 @@ +--- +id: run-py +title: Run Python code +--- + +You can write custom Python code to interact with components and queries. To do that, you just need to create a new query and select **Run Python Code** from the available datasources. + +
+ +Run JavaScript code + +
+ +#### Example: Using Python code to trigger component specific actions + +- Let's drag a **button** and a **text** widget onto the canvas. We will set a text on the text component and trigger button click event from the Python query. +- Click on the `+` on the query panel to create a query and select **Run Python code** from the available datasources +- Let's write the code in **Python Editor** and save the query: + + ```python + class Person: + def __init__(self, name, age): + self.name = name + self.age = age + + def myfunc(self): + return "Hello my name is " + self.name + + p1 = Person(tj_globals.currentUser.firstName, 36) + + components.text1.setText(p1.myfunc()) + components.button1.click() + ``` +- The code above has a function `myfunc` which returns a string and we using the component specific action to set the **text component**'s value from the Python query. We are also triggering the button click using `components.button1.click()` + +:::tip +- ToolJet's global variables can be accessed using **tj_globals**. ex: `tj_globals.currentUser.firstName` +- As of now, Run Python code only supports the [Python standard library](https://docs.python.org/3/library/) only. +::: + +- Let's edit the properties of widgets: + - Add an event handler to the button - Select **On Click** event, **Show alert** action, and set a success message `Triggered using RunPy`. This will show a success alert popup whenever the button click event is triggered from the Python code. + - For the text component, we don't have to edit any property since we are changing the value directly from the Python code. + +
+ +Run Python code + +
+ +You can also write custom Python code to get the data from **External APIs** and manipulate the response for graphical representation. + +:::info +Issues with writing custom Python code? Ask in our [Slack community](https://www.tooljet.com/slack). +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/s3.md b/docs/versioned_docs/version-2.3.0/data-sources/s3.md new file mode 100644 index 0000000000..ba1a029fb2 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/s3.md @@ -0,0 +1,137 @@ +--- +id: s3 +title: Amazon S3 +--- + +# Amazon S3 + +ToolJet can connect to Amazon S3 buckets and perform various operation on them. + +## Connection + +To add a new S3 source, go to the **Datasources manager** on the left sidebar of the app editor and click on `Add datasource` button. Select **AWS S3** from the modal that pops up. + +ToolJet requires the following to connect to your AWS S3: + +- **Region** +- **Access key** +- **Secret key** + +It is recommended to create a new IAM user for the database so that you can control the access levels of ToolJet. + +
+ +aws s3 modal + +
+ +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +:::tip +You can now connect to **[different S3 Hosts using custom endpoints](/docs/how-to/s3-custom-endpoints)**. +::: + +## Querying AWS S3 + +Click on `+` button of the **query manager** at the bottom panel of the editor and select the data source added in the previous step as the data source. Select the operation that you want to perform and click **Save** to save the query. + +
+ +aws s3 query + +
+ +Click on the **run** button to run the query. + +**NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +## Query operations + +You can create query for AWS S3 data source to perform several actions such as: + 1. **[Read object](/docs/data-sources/s3#read-object)** + 2. **[Upload object](/docs/data-sources/s3#upload-object)** + 3. **[List buckets](/docs/data-sources/s3#list-buckets)** + 4. **[List objects in a bucket](/docs/data-sources/s3#list-objects-in-a-bucket)** + 5. **[Signed url for download](/docs/data-sources/s3#signed-url-for-download)** + 6. **[Signed url for upload](/docs/data-sources/s3#signed-url-for-upload)** + +### Read object + +You can read an object in a bucket by using this operation. It requires two parameters - **Bucket** name and **Key**. + + +aws s3 read object + +### Upload object + +You can use this operation to upload objects(files) to your S3 bucket. It requires four parameters: + 1. **Bucket**: Specify the bucket name + 2. **Key**: Key of the object/file + 3. **Content type**: Specify file type such as text, image etc. + 4. **Upload data**: File/object that is to be uploaded. + + +aws s3 upload + + +### List buckets + +This operation will list all the buckets in your S3. This does not require any parameter. + + +aws s3 bucket + + +### List objects in a bucket + +This operation will fetch the list of all the files in your bucket. It requires two parameters: + 1. **Bucket**: Bucket name (mandatory) + 2. **Prefix**: To limit the response to keys that begin with the specified prefix (optional) + 3. **Max keys**: The maximum number of keys returned in the response body (optional). Default value is 1000. + 4. **Offset**: The key to start with when listing objects in a bucket (optional). + 5. **"Next Continuation Token"**: `Next Continuation Token` indicates Amazon S3 that the list is being continued on this bucket with a token. ContinuationToken is obfuscated and is not a real key (optional). + + +:::info +**Next Continuation Token** +For listing a bucket for objects that begin with a specific character or a prefix, then use the `Offset` parameter. For example, if you want to list all the objects that begin with `a`, then set the `Offset` parameter to `a`. Similarly, if you want to list all the objects that begin with `ab`, then set the `Offset` parameter to `ab`. + +The `Next Continuation Token` is used to list the next set of objects in a bucket. It is returned by the API when the response is truncated. The results will contain `Next Continuation Token` if there are more keys in the bucket that satisfy the list query. To get the next set of objects, set the `Next Continuation Token` parameter and run the query again. +The results will continue from where the last listing finished. +::: + + +aws s3 list object + + +### Signed url for download + +The object owner can optionally share objects with others by creating a presigned URL, using their own security credentials, to grant time-limited permission to download the objects. For creating a presigned URL, the required parameters are: + 1. **Bucket**: name of the bucket for uploading the file + 2. **Key**: an object key + 3. **Expires in**: an expiration time of URL + + +aws s3 signed download + + +### Signed url for upload + +The presigned URLs are useful if you want your user/customer to be able to upload a specific object to your bucket, but you don't require them to have AWS security credentials or permissions. For creating a presigned URL, the required parameters are: + 1. **Bucket**: name of the bucket for uploading the file + 2. **Key**: an object key + 3. **Expires in**: an expiration time of URL + 4. **Content type**: the content type such as text, image etc. + + +aws s3 signed upload + + + +:::info +We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.com/building-an-app-to-view-and-upload-files-in-aws-s3-bucket/)**. +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/saphana.md b/docs/versioned_docs/version-2.3.0/data-sources/saphana.md new file mode 100644 index 0000000000..1a18eea40b --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/saphana.md @@ -0,0 +1,48 @@ +--- +id: saphana +title: SAP HANA +--- + +# SAP HANA + +ToolJet can connect to SAP HANA databases to read and write data. + +- [Connection](#connection) +- [Querying SAP HANA](#querying-sap-hana) + +## Connection + +To add a new SAP HANA database, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select SAP HANA from the modal that pops up. + +ToolJet requires the following to connect to your SAP HANA database: + +- **Host** +- **Port** +- **Username** +- **Password** + +:::info +Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. +::: + +
+ +![ToolJet - Data source - SAP HANA](/img/datasource-reference/saphana/connect.png) + +
+ +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying SAP HANA + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. Enter the query in the editor. Click on the `run` button to run the query. + +**NOTE**: Query should be saved before running. + + +saphana query + + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/data-sources/sendgrid.md b/docs/versioned_docs/version-2.3.0/data-sources/sendgrid.md new file mode 100644 index 0000000000..fa45ffd56d --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/sendgrid.md @@ -0,0 +1,62 @@ +--- +id: sendgrid +title: SendGrid +--- + +# SendGrid + +ToolJet can connect to your SendGrid account to send emails. + +ToolJet - Data source - SendGrid + +:::info +The SendGrid API Datasource supports for interaction with the mail endpoint of the [SendGrid v3 API](https://docs.sendgrid.com/api-reference/how-to-use-the-sendgrid-v3-api/authentication). +::: + +## Connection +To add a new SendGrid API datasource, click the **Datasource manager** icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select SendGrid API from the modal that pops up. + +Enter your **SendGrid API key** in the "API key" field. + +:::tip +SendGrid API key is required to create an SendGrid datasource on ToolJet. You can generate API key by visiting [SendGrid account page](https://app.sendgrid.com/settings/api_keys). +::: + +Click on the 'Save' button to save the data source. + +## Supported operations +1. Email service + + +### Email service +Required parameters: +- Send email to +- Send email from +- Subject +- Body as text + + +Optional parameters: +- Body as HTML + +ToolJet - Query SendGrid + +:::info +**Send mail to** - accepts an array/list of emails separated by comma. +For example: +`{{["dev@tooljet.io", "admin@tooljet.io"]}}`. + +**Send mail from** - accepts a string. +For example: `admin@tooljet.io` +::: + +:::tip +**Send a single email to multiple recipients** - The `Send mail to` field can contain an array of recipients, which will send a single email with all of the recipients in the field. + +**Send multiple individual emails to multiple recipients** - set Multiple recipients field to `{{true}}` and the `Send mail to` field will be split into multiple emails and send to each recipient. +::: + + +:::note +NOTE: Query should be saved before running. +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/slack.md b/docs/versioned_docs/version-2.3.0/data-sources/slack.md new file mode 100644 index 0000000000..04005fde9a --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/slack.md @@ -0,0 +1,81 @@ +--- +id: slack +title: Slack +--- + +# Slack + +ToolJet can connect to your Slack workspace to send messages. + +
+ +Slack datasource: ToolJet + +
+ +## Connection +- To add the Slack datasource, click the **Datasource manager** icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select Slack from the modal that pops up. + +- In the next dialog, you'll be asked to choose the **permission scope**. Choose the permission scope and then click on **Connect to Slack** button. + +- A new tab will open up asking for authorization confirmation. Once done, you can close the tab. + +
+ +Slack datasource: ToolJet + +
+ +- Click on the '**Save data source** button to save the data source. + + +:::note +The App (which credentials are provided) needs to be installed in the workspace to use the Slack data source, and it needs to be added to the channel where you want to post the message. +::: + +## Supported operations + +1. **List members** +2. **Send message** +3. **List messages from a channel** + +### List members + +This operation will return the data of all the members in your slack workspace. + +
+ +Slack datasource: ToolJet + +
+ +### Send message + +This operation will send/post the message to a specified channel or posting to direct messages (also known as DMs or IMs) in your slack workspace. + +| Property | Description | +| :--- | :--- | +| Channel | The channel ID or user ID to post the message to. | +| Message | The message to post. | + +
+ +Slack datasource: ToolJet + +
+ +### List messages + +This operation will get the messages from a specified channel. + +| Property | Description | +| :--- |:----------------------------------------| +| Channel | The channel ID to get the messages from | +| Limit | The maximum number of messages to return. | +| Next Cursor | A cursor value returned by a previous call to list messages. | + +
+ +Slack datasource: ToolJet + +
diff --git a/docs/versioned_docs/version-2.3.0/data-sources/smtp.md b/docs/versioned_docs/version-2.3.0/data-sources/smtp.md new file mode 100644 index 0000000000..120f2b1d08 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/smtp.md @@ -0,0 +1,48 @@ +--- +id: smtp +title: SMTP +--- + +# SMTP + +SMTP plugin can connect ToolJet applications to **SMTP servers** for sending emails. + +## Connection + +A SMTP server can be connected with the following credentails: +- **Host** +- **Port** +- **User** +- **Password** + +:::info +You can also test your connection before saving the configuration by clicking on `Test Connection` button. +::: + +
+ +smtp connect + +
+ +## Querying SMTP + +Go to the query manager at the bottom panel of the editor and click on the `+` button on the left to create a new query. Select `SMTP` from the datasource dropdown. + +To create a query for sending email, you will need to provide the following properties: + - **From** `required` : Email address of the sender + - **From Name** : Name of the sender + - **To** `required` : Recipient's email address + - **Subject** : Subject of the email + + +smtp query1 + + + - **Body** : You can enter the body text either in the form of `raw text` or `html` in their respective fields. + - **Attachments** : Attachments can be added to a SMTP query by referencing the file from the `File Picker` component in the attachments field. + + For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` object to accomplish this. + + +smtp query2 diff --git a/docs/versioned_docs/version-2.3.0/data-sources/snowflake.md b/docs/versioned_docs/version-2.3.0/data-sources/snowflake.md new file mode 100644 index 0000000000..6b3b30d283 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/snowflake.md @@ -0,0 +1,52 @@ +--- +id: snowflake +title: Snowflake +--- + +# Snowflake + +ToolJet can connect to Snowflake databases to read and write data. + +- [Connection](#connection) +- [Getting Started](#querying-snowflake) + +## Connection + +Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. You can find snowflake docs on network policies **[here](https://docs.snowflake.com/en/user-guide/network-policies.html)**. + + +To add a new Snowflake database, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select Snowflake from the modal that pops up. + +ToolJet requires the following to connect to your Snowflake database. + +- **Account** +- **Username** +- **Password** + +:::info +You can also configure for **[additional optional parameters](https://docs.snowflake.com/en/user-guide/nodejs-driver-use.html#additional-connection-options)**. +::: + +
+ +![ToolJet - Snowflake connection](/img/datasource-reference/snowflake/snowflake-connect.png) + +
+ +## Querying Snowflake + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the datasource. Query manager then can be used to write raw SQL queries. + +
+ +![ToolJet - Snowflake query](/img/datasource-reference/snowflake/snowflake-query.png) + +
+ +Click on the `run` button to run the query. + +**NOTE:** Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/stripe.md b/docs/versioned_docs/version-2.3.0/data-sources/stripe.md new file mode 100644 index 0000000000..e6fa073e9c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/stripe.md @@ -0,0 +1,192 @@ +--- +id: stripe +title: Stripe +--- + +# Stripe + +ToolJet can connect to your Stripe account to read or write customers' and payments' data. + +:::info +Check out the **[Stripe Refund App tutorial](https://blog.tooljet.com/build-a-stripe-refund-tool-using-low-code/)** +::: + +## Connection + +To add a new Stripe data source, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select Stripe from the modal that pops up. + +ToolJet requires the **Stripe API key** to connect to your database. + +
+ +![ToolJet - Data source - Stripe](/img/datasource-reference/stripe/connect.png) + +
+ +You can get the Stripe API key from the dashboard of your Stripe account. Go to the Stripe account dashboard, click on the **Developers** on the top right, then on the left-sidebar go to the **API Keys**, you can simple reveal the **Secret Key** and copy-paste on ToolJet. + +
+ +![ToolJet - Data source - Stripe](/img/datasource-reference/stripe/apikey.png) + +
+ +## Querying Stripe + +Click on **+** button of the query manager at the bottom panel of the editor and select the Stripe datasource added in the previous step. Enter the query in the editor. Click on the `Save and Run` button to save and then run the query. + +**NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +## Supported operations + + +You can check out the some of the operations mentioned below. All the operations for Stripe are available and can be performed from ToolJet. Check out the **[Stripe API documentation](https://stripe.com/docs/api/)** for the detailed information about each operation. + +- **delete,/v1/account** +- **get,/v1/account** +- **post,/v1/account** +- **post,/v1/account/bank_accounts** +- **delete,/v1/account/bank_accounts/{id}** +- **get,/v1/account/bank_accounts/{id}** +- **post,/v1/account/bank_accounts/{id}** +- **get,/v1/account/capabilities** +- **get,/v1/account/capabilities/{capability}** +- **post,/v1/account/capabilities/{capability}** +- **get,/v1/account/external_accounts** +- **post,/v1/account/external_accounts** +- **delete,/v1/account/external_accounts/{id}** +- **get,/v1/account/external_accounts/{id}** +- **post,/v1/account/external_accounts/{id}** +- **post,/v1/account/login_links** +- **get,/v1/account/people** +- **post,/v1/account/people** +- **delete,/v1/account/people/{person}** +- **get,/v1/account/people/{person}** +- **post,/v1/account/persons** +- **delete,/v1/account/persons/{person}** +- **get,/v1/account/persons/{person}** +- **post,/v1/account/persons/{person}** +- **post,/v1/account_links** +- **get,/v1/accounts** +- **post,/v1/accounts** +- **delete,/v1/accounts/{account}** +- **get,/v1/accounts/{account}** +- **post,/v1/accounts/{account}** +- **post,/v1/accounts/{account}/bank_accounts** +- **delete,/v1/accounts/{account}/bank_accounts/{id}** +- **get,/v1/accounts/{account}/bank_accounts/{id}** +- **get,/v1/accounts/{account}/bank_accounts/{id}** +- **get,/v1/accounts/{account}/capabilities** +- **get,/v1/accounts/{account}/capabilities/{capability}** +- **post,/v1/accounts/{account}/capabilities/{capability}** +- **get,/v1/accounts/{account}/external_accounts** +- **post,/v1/accounts/{account}/external_accounts** +- **delete,/v1/accounts/{account}/external_accounts/{id}** +- **get,/v1/accounts/{account}/external_accounts/{id}** +- **get,/v1/accounts/{account}/external_accounts/{id}** +- **post,/v1/accounts/{account}/login_links** +- **get,/v1/accounts/{account}/people** +- **post,/v1/accounts/{account}/people** +- **delete,/v1/accounts/{account}/people/{person}** +- **get,/v1/accounts/{account}/people/{person}** +- **post,/v1/accounts/{account}/people/{person}** +- **get,/v1/accounts/{account}/persons** +- **post,/v1/accounts/{account}/persons** +- **delete,/v1/accounts/{account}/persons/{person}** +- **get,/v1/accounts/{account}/persons/{person}** +- **post,/v1/accounts/{account}/persons/{person}** +- **post,/v1/accounts/{account}/reject** +- **get,/v1/apple_pay/domains** +- **post,/v1/apple_pay/domains** +- **delete,/v1/apple_pay/domains/{domain}** +- **get,/v1/apple_pay/domains/{domain}** +- **get,/v1/application_fees** +- **get,/v1/application_fees/{fee}/refunds/{id}** +- **post,/v1/application_fees/{fee}/refunds/{id}** +- **get,/v1/application_fees/{id}** +- **post,/v1/application_fees/{id}/refund** +- **get,/v1/application_fees/{id}/refunds** +- **post,/v1/application_fees/{id}/refunds** +- **get,/v1/apps/secrets** + + + + + + + + + diff --git a/docs/versioned_docs/version-2.3.0/data-sources/twilio.md b/docs/versioned_docs/version-2.3.0/data-sources/twilio.md new file mode 100644 index 0000000000..daac9e7e32 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/twilio.md @@ -0,0 +1,54 @@ +--- +id: twilio +title: Twilio +--- + +# Twilio + +ToolJet can connect to your Twilio account to send sms. + +
+ +![ToolJet - Data source - Twilio](/img/datasource-reference/twilio/connect.png) + +
+ +## Connection +- To add the Twilio datasource, click the **Datasource manager** icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select **Twilio** from the modal that pops up. + +- In the next dialog, you'll be asked to enter the Auth Token, Account SID, and Messaging Service SID. + +- You can get the **Auth Token and Account SID** on the dashboard of your Twilio account. + +
+ +![ToolJet - Data source - Twilio](/img/datasource-reference/twilio/auth.png) + +
+ +- For **Messaging Service SID**, you'll need to create a messaging service first from the Services under Messaging in the left-sidebar. + +
+ +![ToolJet - Data source - Twilio](/img/datasource-reference/twilio/sid.png) + +
+ +- After entering the three credentials, you can **Save** the datasource. + +## Supported operations + +1. **Send message** + +### Send message + +This operation will send the specified message to specified mobile number. + +
+ +![ToolJet - Data source - Twilio](/img/datasource-reference/twilio/sms.png) + +
+ + + diff --git a/docs/versioned_docs/version-2.3.0/data-sources/typesense.md b/docs/versioned_docs/version-2.3.0/data-sources/typesense.md new file mode 100644 index 0000000000..48d885bd7f --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/typesense.md @@ -0,0 +1,92 @@ +--- +id: typesense +title: TypeSense +--- + +# TypeSense +ToolJet can connect to your TypeSense deployment to read and write data. + +## Connection +Please make sure the host/IP of the TypeSense deployment is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist our IP**. + +ToolJet requires the following to connect to your TypeSense deployment: +- **Host** +- **Port** +- **API Key** +- **Protocol** + +
+ +typesense connect + +
+ +## Querying TypeSense + +Click on `+` button of the query manager at the bottom panel of the editor and select the TypeSense added in the previous step as the data source. +Select the operation that you want to perform on your TypeSense cluster and click `Create` to save the query. + +
+ +typesense query + +
+ +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +## Supported operations + +#### 1. Create a Collection + +With this operation you can easily create `Collections` in your TypeSense cluster. In the schema field, you'll need to define the schema for creating a new collection. Check out TypeSense docs to know more about collections **[here](https://typesense.org/docs/0.22.2/api/collections.html#create-a-collection)** + + +typesense collection + + +#### 2. Index a document + +Use this operation to index a document to your collection. You'll need to specify the **Collection Name** where you want your document to be indexed and also provide the document data according the schema defined in the collection. Read more about Indexing a document in TypeSense **[here]( +https://typesense.org/docs/0.22.2/api/documents.html#index-a-single-document)**. + + +typesense index + + +#### 3. Search + +Use this operation to perform a search within the specified collection. Know more about the search parameters in the TypeSense doc **[here](https://typesense.org/docs/0.22.2/api/documents.html#search)**. + + +typesense search + + +#### 4. Get a document + +Use this operation to fetch an individual document in a collection by providing the `id` of the document. Read more about it **[here](https://typesense.org/docs/0.22.2/api/documents.html#retrieve-a-document)**. + + +typesense get + + +#### 5. Update a document + +Use this operation to update an individual document by providing the **Collection Name** and **Id** of the document. You'll need to provide the updated document data in the form of specified schema. Check out the TypeSense's doc on updating a document **[here](https://typesense.org/docs/0.22.2/api/documents.html#update-a-document)**. + + +typesense update + + +#### 6. Delete a document + +Delete a document from collection by providing the `Id` of the document. Check out the TypeSense's doc on deleting documents **[here](https://typesense.org/docs/0.22.2/api/documents.html#delete-documents)**. + + +typesense delete + + +:::tip +Make sure that you supply JSON strings instead of JavaScript objects for any document or schema that is being passed to the server, in any of the above operations. +::: diff --git a/docs/versioned_docs/version-2.3.0/data-sources/woocommerce.md b/docs/versioned_docs/version-2.3.0/data-sources/woocommerce.md new file mode 100644 index 0000000000..45567819c6 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/woocommerce.md @@ -0,0 +1,64 @@ +--- +id: woocommerce +title: WooCommerce +--- +# WooCommerce + +ToolJet can connect to WooCommerce databases to read and write data. + +- [Connection](#connection) +- [Getting Started](#querying-woocommerce) + +## Connection + +Auth +You may use [HTTP Basic Auth] by providing the REST API Consumer Key as the username and the REST API Consumer Secret as the password. +- **Host** +- **Consumer key** +- **Consumer secret** + +![ToolJet - Data Source - Woocommerce](/img/datasource-reference/woocommerce/woocomerce-auth.png) + +:::info +NOTE: For generating keys visit admin dashboard of woocommerce , more info: https://woocommerce.github.io/woocommerce-rest-api-docs/?javascript#authentication +::: + +## Querying Woocommerce + +**Operations** + +**Customer** + +- list customer +- update customer +- delete customer +- batch update customer +- create customer +- retrieve customer + +**PRODUCT** + +- list product +- update product +- delete product +- batch update product +- create product +- retrieve product + +**ORDER** + +- list order +- update order +- delete order +- batch update order +- create order +- retrieve order + +**Coupon** + +- list coupon +- create coupon + +:::info +NOTE: For more info visit https://woocommerce.github.io/woocommerce-rest-api-docs/?javascript. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/data-sources/zendesk.md b/docs/versioned_docs/version-2.3.0/data-sources/zendesk.md new file mode 100644 index 0000000000..7c9e2eaac0 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/data-sources/zendesk.md @@ -0,0 +1,96 @@ +--- +id: zendesk +title: Zendesk +--- + +# Zendesk + +ToolJet can connect to Zendesk APIs to read and write data using OAuth 2.0, which helps us to limit an application's access to a user's account. + + - [Connection](#connection) + - [Querying Zendesk](#querying-zendesk) + +## Connection + +ToolJet connects to your Zendesk app using : +- **Zendesk Sub-domain** +- **Client ID** +- **Client Secret** + +## Authorization Scopes + +You can create a Zendesk data source with one of either of the two permission scopes : + 1. **Read Only** + 2. **Read and Write** + + + + +:::info +You must first be a verified user to make Zendesk API requests. This is configured in the Admin Center interface in **Apps and integrations > APIs > Zendesk APIs.** For more information, see Security and Authentication in the [Zendesk Support API reference](https://developer.zendesk.com/api-reference/ticketing/introduction/#security-and-authentication) or [check out Zendesk's docs](https://support.zendesk.com/hc/en-us/articles/4408845965210). +::: + +To connect Zendesk datasource to your ToolJet application, go to the data source manager on the left-sidebar and click on the `+` button. Select Zendesk from the list of available datasources, provide the credentials and click **Connect to Zendesk** and authenticate via OAuth. And click **Save** to save the datasource. + +
+ +![ToolJet - Data source - Zendesk](/img/datasource-reference/zendesk/zendesk.gif) + +
+ +## Operations +1. **[List Tickets](/docs/data-sources/zendesk#list-tickets)** +2. **[List requested Tickets](/docs/data-sources/zendesk#list-requested-tickets)** +3. **[Show a Ticket](/docs/data-sources/zendesk#show-tickets)** +4. **[Update a Ticket](/docs/data-sources/zendesk#update-tickets)** +5. **[List Users](/docs/data-sources/zendesk#list-users)** +6. **[Get Profile](/docs/data-sources/zendesk#get-profile)** +7. **[Search query](/docs/data-sources/zendesk#search-query)** + + +### List Tickets +Lists all the tickets in your Zendesk account. + +### List requested Tickets +Lists all the tickets requested by the user. + +| Fields | description | +| ----------- | ----------- | +| User ID | The id of the user | + +### Show Tickets +Gets a ticket's properties with the given ID, though not the ticket comments. + +| Fields | description | +| ----------- | ----------- | +| Ticket ID | The id of the ticket | + +### Update Tickets +Updates a ticket's properties with the given ID. + +| Fields | description | +| ----------- | ----------- | +| Ticket ID | The id of the ticket | +| Body | The properties and values to update. Example: `{{({ "ticket": {"status": "solved"} })}}` | + +### List Users +Lists all the users in your Zendesk account. + +### Get Profile +Gets a user's profile with the given ID. + +| Fields | description | +| ----------- | ----------- | +| User ID | The id of the user | + +### Search Query +The Search Query uses Zendesk's Search API to return tickets, users, and organizations with defined filters. +Common filters include: +- `type:ticket` +- `type:user` +- `type:organization` +- `type:ticket organization:12345 status:open` + +| Fields | description | +| ----------- | ----------- | +| Query | The search query | diff --git a/docs/versioned_docs/version-2.3.0/getting-started.md b/docs/versioned_docs/version-2.3.0/getting-started.md new file mode 100644 index 0000000000..3d944f62c9 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/getting-started.md @@ -0,0 +1,249 @@ +--- +id: getting-started +title: Getting Started +description: ToolJet is an open-source low-code framework to build and deploy custom internal tools. ToolJet can connect to your data sources such as databases ( PostgreSQL, MongoDB, MS SQL Server, Snowflake, , BigQuery, etc ), API/GraphQL endpoints, SaaS tools ( Airtable, Stripe, Google Sheets, etc ) and cloud object storage services ( AWS S3, Google Cloud Storage and Minio ). Once the data sources are connected, ToolJet can run queries on these data sources to fetch and update data. The data fetched from data sources can be visualised and modified using the UI widgets such as tables, charts, forms, etc. +slug: / +--- + +# Welcome to ToolJet Docs + +--- + +## What is ToolJet + +ToolJet is an **open-source low-code framework** to build and deploy custom internal tools. + +ToolJet ships with its built-in database called **[ToolJet DB](/docs/tooljet-database)** (built on top of PostgreSQL). You can also connect to the **external data sources** such as **databases** ( PostgreSQL, MongoDB, MS SQL Server, Snowflake, , BigQuery, etc ), **API/GraphQL endpoints**, **SaaS tools** ( Airtable, Stripe, Google Sheets, etc ) and **cloud object storage services** ( AWS S3, Google Cloud Storage and Minio ). + +Once the data sources are connected, ToolJet can run **queries** on these data sources to fetch and update data. The data fetched from data sources can be **visualised and modified** using the UI widgets such as tables, charts, forms, etc. You can also use **[Javascript](/docs/data-sources/run-js)** or **[Python](/docs/data-sources/run-py)** queries for writing business logic or interacting with the user interface of the application. + +Getting started Demo app + + + +## How ToolJet works + +
+ +How ToolJet works flow + +
+ +**With ToolJet, you can build apps in 3 simple steps:** + +1. **Connect to datasources:** Connect to the ToolJet's built-in database **[ToolJet DB](/docs/tooljet-database)** (built on top of PostgreSQL) or your existing data sources such as PostgreSQL, MySQL, Firestore, Stripe, Google Sheets, API endpoints, etc. + +2. **Build queries:** ToolJet comes with query builders for all supported data sources. You can also write **[Javascript](/docs/data-sources/run-js)** or **[Python](/docs/data-sources/run-py)** queries or use **[Transformations](/docs/tutorial/transformations)** to transform the query response. + +3. **Build User Interface:** ToolJet's visual **[App Builder](/docs/app-builder/overview)** allows you to drag and drop components ( Eg: tables, charts, forms, etc ) to quickly build the user-interface of the apps. Components have events such as `on click`, `on row selected`, `on page changed`, etc. ToolJet apps can be used in light and dark mode. + + :::tip + ToolJet binds together the datasources, queries and components to convert business logic into custom applications. You can also secure your ToolJet apps with **[Group & Permissions](/docs/org-management/permissions)** and **[Audit Logging](/docs/Enterprise/audit_logs)**. + ::: +## Choose your ToolJet + +There are a few different ways to set up ToolJet depending on how you intend to use it: + +- **[ToolJet Cloud](https://www.tooljet.com)**: hosted solution, just sign-up for free and start building apps in seconds. +- **[Deploy on premise](/docs/setup/)**: recommended method for production or customized use cases. You'll find Server setup guides for popular platforms (AWS, GCP, Kubernetes etc) and one-click deployment guides (Heroku, DigitalOcean etc). +- **[Try ToolJet on local machine](/docs/setup/try-tooljet/)**: the fastest way to try out ToolJet on your computer using docker. + +:::info +- Data security is top priority at ToolJet, read about our **[data security here](/docs/security)**. +::: + +## The very quick quickstart + +Let's say you're an eCommerce company and your **Customer Support/Operations** team need a **Support Tool/Admin** panel for managing the orders, updating inventory, and track revenue and metrics. This quickstart will guide you through building your first custom internal tool in less than 5 minutes. + +You will: +- **[Create a database](#create-a-tooljet-database)** +- **[Create a new application](#create-a-new-application)** +- **[Build the UI](#build-the-ui)** +- **[Build queries and bind data to UI](#build-queries-and-bind-data-to-ui)** +- **[Preview, Release and Share app](#preview-release-and-share-app)** + +:::tip +Before getting into the quickstart, Sign up and create your account on **[ToolJet](https:///www.tooljet.com)**. +::: + +### Create a database + +1. Navigate to **ToolJet DB Editor** from the left sidebar on the dashboard +
+ + Getting started: Quickstart + +
+ +2. Click on **Add Table** button, enter **Table name** and **Add columns** from the drawer that slides from the right. +
+ + Getting started: Quickstart + +
+ +3. Once the table is created, click on the **Add new row** button to add the data to the table and click **Create**. +
+ + Getting started: Quickstart + +
+ +:::info +Learn more about the **[ToolJet Database here](/docs/tooljet-database)** +::: + +### Create a new application + +1. To create a new ToolJet application, go to the **Dashboard** -> **New App from scratch**. + +
+ + Getting started: Quickstart + +
+ + :::info + You can also use the existing UI **templates** for your application or **import** an application to your workspace. + ::: + +2. When you click on create new app the **App-builder** will open up. You can rename your application from `untitled` to **Support Tool** from the top left of app-builder. +
+ + Getting started: Quickstart + +
+ +### Build the UI + +1. Let's build the UI of the application by dragging and dropping the components on the canvas. +2. To build the UI, we will use: + 1. **Table** for displaying the customers data + 2. **Text** components for the Title and description of the app as the header + 3. **Text Input** component for getting product name input from the user + 4. **Number Input** component for getting product quantity and price input from the user + 5. **Button** component that will be used to trigger the query for inserting a row in the database using the button's **OnClick** event handler + +
+ + Getting started: Quickstart + +
+ +:::info +ToolJet application's User interface is constructed using Components like Tables, Forms, Charts, or Buttons etc. Check **Components Catalog** to learn more. +::: + +### Build queries and bind data to UI + +1. We can add a new datasource from the **Datasource manager** on the left-sidebar of the app builder but since we are using **ToolJet Database** we don't need to add any external datasource. Go to the **Query Panel -> Run ToolJetDb Query** +
+ + Getting started: Quickstart + +
+ + :::info + ToolJet can connect to several databases, APIs and external services to fetch and modify data. Check **Datasource Catalog** to learn more. + ::: + +2. Choose a **Table** from the dropdown, Select the **List rows** option from the **Operation** dropdown, You can leave other query parameters. Scroll down and enable **Run this query on application load** - this will trigger the query when the app is loaded. + +3. Click on **Create** to create the query and then click **Run** to trigger the query and get response. You can also check the query response by clicking **Preview** button without firing the query. +
+ + Getting started: Quickstart + +
+ +4. Go to the **Table properties** by clicking on the component handle and bind the data returned by the query in the **Table data** property. When building apps in ToolJet anything inside `{{}}` is JavaScript and we javascript dot notation to get the data from query and populate the table using **{{queries.tooljetdb1.data}}**. The table will be auto-populated once the table data is entered. +
+ + Getting started: Quickstart + +
+ +5. Let's create another query that will get the data from the **input fields** and will add a new row in the tooljet database. **Create New Query** -> **Select Table (Customers)** -> **Select Operation (Create row)** -> add the following columns with the respective value: + 1. **id** - `{{components.textinput1.value}}` + 2. **quantity** - `{{components.numberinput1.value}}` + 3. **price** - `{{components.numberinput2.value}}` + 4. **created_at** - `{{moment().format("DD/MM/YYYY hh:mm A")}}` (We are using **momentjs library** to get the current date from the system rather than getting input by the user ) + +
+ + Getting started: Quickstart + +
+ + :::tip + You can also add event handler to this query for **On Success** event to run the `tooljetdb1` query that populates the table, so that whenever this is successful the table is refreshed. + ::: + +6. Now, let's bind this query to the **Add Product** button. Click on the button handle to open its properties, **Add an handler** -> **Select Event (On Click)** -> **Select Action (Run Query)** -> **Select Query (tooljetdb2)**. +
+ + Getting started: Quickstart + +
+ +:::info +- You can manipulate the data returned by the queries using **Transformations** +- You can also **Run JS query** or **Python query** to perform custom behavior inside ToolJet +::: + +### Preview, Release and Share app + +1. Click on the **Preview** on the top-right of app builder to immediately check the currently opened version of the app in production. +2. Click on the **Release** button to publish the currently opneded version of the app and push the changes to production. +3. **Share** option allows you to share the **released version** of the application with other users or you can also make the app **public** and anyone with the URL will be able to use the app. + +:::tip +You can control how much access to users have to your ToolJet apps and resources using **Org Management**. +::: + +## What Can I Do With ToolJet + +If you are building internal tool for your organization, here are few tutorials of sample use-cases for you to get started: + +- **[Build a Feature Request Management App](https://youtu.be/c2sbFTDUMzs)** +- **[Build a Ticket Triaging App with Baserow and ToolJet](https://blog.tooljet.com/build-a-ticket-triaging-app-with-baserow-and-tooljet/)** +- **[Building a MinIO file explorer app](https://blog.tooljet.com/building-a-minio-file-explorer-app-in-30-minutes/)** +- **[Building a Google Cloud Storage (GCS) file explorer app](https://blog.tooljet.com/build-internal-file-explorer-application-using-google-cloud-storage-gcs-and-tooljet/)** +- **[Build an AWS S3 file explorer app](https://blog.tooljet.com/building-an-app-to-view-and-upload-files-in-aws-s3-bucket/)** +- **[Build Stripe Refund App](https://blog.tooljet.com/build-a-stripe-refund-tool-using-low-code/)** +- **[Build a WhatsApp CRM](https://blog.tooljet.com/build-a-whatsapp-crm-using-tooljet-within-10-mins/)** +- **[Build a cryptocurrency dashboard](https://blog.tooljet.com/how-to-build-a-cryptocurrency-dashboard-in-10-minutes/)** +- **[Build a Redis GUI](https://blog.tooljet.com/building-a-redis-gui-using-tooljet-in-5-minutes/)** + +Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**. + +## For ToolJet Contributors + +To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**. + +[![GitHub contributors](https://img.shields.io/github/contributors/tooljet/tooljet)](https://github.com/ToolJet/ToolJet/contributors) +[![GitHub issues](https://img.shields.io/github/issues/ToolJet/ToolJet)](https://github.com/ToolJet/ToolJet/issues) +[![GitHub stars](https://img.shields.io/github/stars/ToolJet/ToolJet)](https://github.com/ToolJet/ToolJet/stargazers) +[![GitHub license](https://img.shields.io/github/license/ToolJet/ToolJet)](https://github.com/ToolJet/ToolJet) + + + + + +## Help and Support +- We have extensively documented the features of ToolJet, but in case you are stuck, please feel free to e-mail us at **hello@tooljet.com** +- If you are using ToolJet cloud, click on the chat icon at the bottom-left corner for instant help. +- If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. +- Feel free to join our highly active **[Slack Community](https://www.tooljet.com/slack)**. diff --git a/docs/versioned_docs/version-2.3.0/how-to/_category_.json b/docs/versioned_docs/version-2.3.0/how-to/_category_.json new file mode 100644 index 0000000000..cd5b99d44a --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "How To", + "position": 8, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/how-to/access-cellvalue-rowdata.md b/docs/versioned_docs/version-2.3.0/how-to/access-cellvalue-rowdata.md new file mode 100644 index 0000000000..f04cef2571 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/access-cellvalue-rowdata.md @@ -0,0 +1,115 @@ +--- +id: access-cellvalue-rowdata +title: Change text color in columns of the table +--- + +# Change text color in columns by accessing `cellValue` and `rowData` in the table + +In this how-to guide, we will build an app that will use a sample RestAPI to display the data in the table, and then we will change the text color of the columns according to the condition. + +- Let's start by creating a new application and then adding a table widget into the canvas. + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/newapp.gif) + +
+ +- Now go to the **Query Panel** at the bottom of the app editor and click on the `+` button. +- Choose **RestAPI** data source + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/restapi.png) + +
+ +- Now we will use a sample RestAPI endpoint - I have used the API provided by **coinstats.app**, API-URL: +https://api.coinstats.app/public/v1/coins?skip=0&limit=100¤cy=USD +- Choose `GET` method, enter the request URL (API URL in previous step), name the query - I have named it `crypto`, and then **Create** the query + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/apiendpoint.png) + +
+ +- Now hit the **Run** button next to the query name to run the query. + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/runquery.png) + +
+ +- Once you run the query, you can check the data returned by the query in the **Inspector** on the left sidebar. + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/inspectord.png) + +
+ +- Now that we have got the data, we will display it on the table. To do this, click on the widget handle of the table to open its properties in the right sidebar. +- In the Table Data field, enter `{{queries.crypto.data.coins}}` - as you can see in the screenshot of the inspector the data is inside the `coins` array. You'll see the data in the Preview(green box) below the field. + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/data.png) + +
+ +- Let's add the columns that we want to display on the table. Go to the **Columns** section, Add columns, set their Names, and set **key** for each column. I have added 5 columns: **Rank**, **Name**, **Symbol**, **Price**, and **Market Cap**. + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/columns.png) + +
+ +- Once you've added the columns, you'll get the table like this: + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/table.png) + +
+ +### Using cellValue to change column text color + +Now that we have our data on the table, we will change the color of the text in the **Price** and **Market Cap** columns. + +- Edit table properties, go to **Columns**, and click on the Price Column to open its properties. +- For **Price** column, we want to change color of those cells who have value which is greater than 1000 to red else to green if it is less than 1000. So to do this, we will set a condition in **Text Color** property of this column: `{{cellValue >= 1000 ? 'red' : 'green'}}` + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/price.png) + +
+ +- Similarly, we will do for **Market Cap** column. We want to change the text color of those cells who have value which is greater than 60000000000 to red else to green if it is less than 60000000000. so the condition will be `{{cellValue >= 60000000000 ? 'red' : 'green'}}` +- Now the text color of cells in the columns will be updated. + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/cellvalue.png) + +
+ +:::info +You can also use Hex Color Code instead of mentioning color in plane text. +::: + +### Using rowData to change column text color + +- To change the color of the text using `rowData` variable it is required to mention the column name whose cell value we will be comparing in the condition. Let's take a look by changing the text color of **Symbol** column. +- We will add a condition to look in the row data and if the row has column called `name` which has value `Solana` then it should change the color to red else the color should be green. +- Edit the properties of the Symbol column, set the **Text Color** field value to `{{rowData.name === 'Solana' ? 'red' : 'green'}}`. +- You'll see that in the Symbols column all the values has become green except the one that has Solana in Name column. + +
+ +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/rowData.png) + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/how-to/access-users-groups.md b/docs/versioned_docs/version-2.3.0/how-to/access-users-groups.md new file mode 100644 index 0000000000..4fdf9cabe0 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/access-users-groups.md @@ -0,0 +1,54 @@ +--- +id: access-currentuser +title: Enable/Disable a component using current user's property +--- + +# Enable/Disable a component using current user's property + +Let's take look at the exposed variables of the current user property: + +- **email** : The value can accessed using `{{globals.currentUser.email}}` +- **firstName** : The value can accessed using `{{globals.currentUser.firstName}}` +- **lastName** : The value can accessed using `{{globals.currentUser.lastName}}` +- **lastName** : The value can accessed using `{{globals.currentUser.lastName}}` +- **groups** : By default, the admin will be in the two groups `all_users` and `admin`, and any user who is not admin will always be in the `all_users` group by default. Since the **groups** is an array you’ll have to provide the index ([0], [1], and so on) to return the group name. The value can be accessed using `{{globals.currentUser.groups[1]}}`. + +
+ +Properties of current user + +
+ +### Example: Disable a button if a user is not admin + +- Click on the **Button** handle to open its properties, on the **Styles** tab go to the **Disable** property. + +
+ + Properties of button + +
+ +- Set a condition on the Disable field so that if the the user who is using the app does not have **admin** value in the first index of **groups** array return **true**. The condition can be: + + ```javascript + {{globals.currentUser.groups[1] !== "admin" ? true : false}} + ``` + +
+ + Disable Property of button + +
+ +- Now, when you'll **release** the app, if the user is not is not admin the button will be disabled. + +
+ + Released button disabled when user is not admin + +
+ +:::info +In this how-to we have used the **Groups** property of the **Current User**. You can use any of the exposed variables mentioned above according to your use. +::: diff --git a/docs/versioned_docs/version-2.3.0/how-to/access-users-location.md b/docs/versioned_docs/version-2.3.0/how-to/access-users-location.md new file mode 100644 index 0000000000..a366287a5e --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/access-users-location.md @@ -0,0 +1,85 @@ +--- +id: access-users-location +title: Access a user's location +--- + +# Access a user's location using RunJS query (Geolocation API) + +In this how-to guide, we will build a ToolJet application that will utilize the **JavaScript Geolocation API** to get the user's location. The Geolocation API provides access to geographical location data associated with a user's device. This can be determined using GPS, WIFI, IP Geolocation and so on. + +:::info +To protect the user's privacy, Geolocation API requests permission to locate the device. If the user grants permission, you will gain access to location data such as latitude, longitude, altitude, and speed. +::: + +- Let's start by creating a new application + +
+ + New App + +
+ +- In the app editor, go to the query panel at the bottom and create a **[RunJS query](/docs/data-sources/custom-js)** by selecting **Run JavaScript Code** as the datasource + +
+ + New App + +
+ +- You can use the following javascript code that makes use of geolocation api to get the location + + ```js + function getCoordinates() { + return new Promise(function(resolve, reject) { + navigator.geolocation.getCurrentPosition(resolve, reject); + }); + } + + async function getAddress() { + // notice, no then(), cause await would block and + // wait for the resolved result + const position = await getCoordinates(); + let latitude = position.coords.latitude; + let longitude = position.coords.longitude; + + return [latitude, longitude]; + } + + return await getAddress() + ``` + +- Now, go to the **Advanced** tab and enable the `Run query on page load?` option. Enabling this option will run this javascript query every time the app is opened by the user and the query will return the location + +- **Save** the query and hit the fire button + +- As soon as you hit the fire button, the browser will prompt you to allow the permission to share the location access to ToolJet app. You'll need to **allow** it to return the location data + +
+ + New App + +
+ +- Now, to check the data returned by the query go to the **Inspector** on the left sidebar. Expand the queries -> `runjs1`(query name) -> and then expand the **data**. You'll find the coordinates + +
+ + New App + +
+ +- Next, we can use these coordinates returned by the query on the **map component** to show the location. Drop a map component on the canvas and edit its properties. In the **Initial location** property, enter + + ```js + {{ {"lat": queries.runjs1.data[0], "lng": queries.runjs1.data[1]} }} + ``` + +
+ + New App + +
+ +- Finally, you'll see the location updated on the **map component** + diff --git a/docs/versioned_docs/version-2.3.0/how-to/build-plugin-for-marketplace.md b/docs/versioned_docs/version-2.3.0/how-to/build-plugin-for-marketplace.md new file mode 100644 index 0000000000..301121b4e6 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/build-plugin-for-marketplace.md @@ -0,0 +1,381 @@ +--- +id: build-plugin-for-marketplace +title: Build a new plugin for marketplace +--- + +## Introduction + +ToolJet marketplace is a place where you can find custom plugins and install them in your ToolJet instance. This document will help you to build a new plugin for ToolJet marketplace. + +## Prerequisites +- [Node.js](https://nodejs.org/en/download/) (v18.3.0) +- [npm](https://www.npmjs.com/get-npm) (v8.11.0) + +## Getting started +### 1. Enabling the marketplace for your instance +To enable the marketplace for your instance, you need to set the `ENABLE_MARKETPLACE` environment variable to `true` in your `.env` file. +Marketplacwe is disabled by default. +Once you set the environment variable, restart your ToolJet instance. You can find the instructions to run ToolJet locally [here](/docs/setup/). +Marketplace can be accessed from '/integrations' route. + +### 2. Installing tooljet-cli +ToolJet marketplace uses [tooljet-cli](https://www.npmjs.com/package/@tooljet/cli) to build and publish plugins. You can install it using npm. +```bash +npm install -g tooljet-cli + +# verify the installation +tooljet --version +``` + +### 3. Creating a new plugin - Github plugin +Let's create a new Github plugin for ToolJet marketplace, which will authenticate a user using Github Personal Access Token and will include basic operations like fetching user details, fetching repositories, fetching issues and fetching pull requests. + +```bash +# create a new plugin +tooljet plugin create github +``` +Provide the plugin name and select the plugin type, which is a `api` in this case. +Select `yes` when asked to create a new plugin for marketplace. + +Provide the repository URL if hosted on GitHub, otherwise leave it blank. + +When you create a plugin using the ToolJet CLI, an object is automatically added to the plugins.json file, which is located in the `ToolJet/server/src/assets/marketplace/` directory. This object contains metadata about the plugin, such as its name, description, version, author, and other details. +This plugins.json file serves as a registry of all the plugins that are available for use in ToolJet. When ToolJet server starts up, it reads this file and loads all the plugins that are listed in it. + +:::note +It's important to note that the plugins.json file should not be manually edited as it is automatically generated by the ToolJet CLI. Any changes made to this file may cause issues with the proper functioning of the plugins in the system. +::: + +All marketplace plugins are stored in the `/marketplace` directory of the ToolJet repository. You can find the Github plugin [here](https://github.com/ToolJet/ToolJet/tree/develop/marketplace/plugins/github). + +The directory structure of a typical ToolJet plugin looks like this: + +```bash +github/ + package.json + lib/ + icon.svg + index.ts + operations.json + manifest.json +``` + +- manifest.json should include information such as the name of plugin, description, etc. +- operations.json should include the metadata of all the operations supported by the plugin. +- index.ts is the main file. It defines a QueryService for the plugin. The QueryService handles running of queries, testing connections, caching connections, etc. +- icon.svg is the icon for the plugin. +- package.json is auto generated by the cli. + + +:::info +**Why do we need a manifest.json file or a operations.json file?** + +The manifest.json files are consumed by a React component to create dynamic UI for connection forms by defining the schema of an API or data source. The schema includes information about the source, such as its name, type, and any exposed variables. It also includes options for authentication and other properties that can be customized by the user. The properties section defines the specific fields and their types that are required for connecting to the API or data source. The React component reads the manifest.json file and generates the necessary UI components based on the schema, allowing users to enter the required information for connecting to the source. This can include text inputs, dropdowns, checkboxes, and other UI elements, depending on the schema defined in the manifest.json file. + +The operations.json file contains a schema definition for a particular data source, for example, Github. It describes the available operations and their parameters that can be used to query the data source. + +A React component uses this schema to create queries in ToolJet applications to generate a UI that allows users to select the desired operation and provide the required parameters. + +The component would use the properties defined in the operations.json file to create various UI elements, such as dropdowns, and input fields, and handle user interactions to create the final query. Once the user has filled in the required parameters, the component would use them to generate a query that can be executed against the data source, and return the results to the user. + +In conclusion, *manifest.json* and *operations.json* files play an important role in creating dynamic UI components in ToolJet applications. These files define the schema for data sources and available operations, which is then consumed by React components to generate the necessary UI elements for users to interact with. By using these files, ToolJet enables users to easily connect to various APIs and data sources, perform queries and retrieve data in a user-friendly way. +::: + + +### 4. Defining the manifest.json file +We need to include the necessary options to construct the connection form. +```json + "properties": { + "credentials": { + "label": "Authentication", + "key": "auth_type", + "type": "dropdown-component-flip", + "description": "Single select dropdown for choosing credentials", + "list": [ + { + "value": "personal_access_token", + "name": "Use Personal Access Token" + } + ] + + }, + "personal_access_token": { + "token": { + "label": "Token", + "key": "personal_token", + "type": "password", + "description": "Enter personal access token", + "hint": "You can generate a personal access token from your Github account settings." + } + } + } +``` +It includes information about authentication options, specifically a dropdown to choose a type of credentials and a field to enter a personal access token. The label, key, type, description, and hint properties are used to define the specific fields and their types required for connecting to the API or data source. + +### 5. Defining the operations.json file +```json + "properties": { + "operation": { + "label": "Operation", + "key": "operation", + "type": "dropdown-component-flip", + "description": "Single select dropdown for operation", + "list": [ + { + "value": "get_user_info", + "name": "Get user info" + }, + { + "value": "get_repo", + "name": "Get repository" + }, + { + "value": "get_repo_issues", + "name": "Get repository issues" + }, + { + "value": "get_repo_pull_requests", + "name": "Get repository pull requests" + } + ] + }, + "get_user_info": { + "username": { + "label": "Username", + "key": "username", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter username", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "Enter username" + } + }, + "get_repo": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + } + }, + "get_repo_issues": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + }, + "state": { + "label": "State", + "key": "state", + "className": "codehinter-plugins col-4", + "type": "dropdown", + "description": "Single select dropdown for choosing state", + "list": [ + { + "value": "open", + "name": "Open" + }, + { + "value": "closed", + "name": "Closed" + }, + { + "value": "all", + "name": "All" + } + ] + } + }, + "get_repo_pull_requests": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + }, + "state": { + "label": "State", + "key": "state", + "type": "dropdown", + "className": "codehinter-plugins col-4", + "description": "Single select dropdown for choosing state", + "list": [ + { + "value": "open", + "name": "Open" + }, + { + "value": "closed", + "name": "Closed" + }, + { + "value": "all", + "name": "All" + } + ] + } + } + } +``` +The operations.json file defines the operations that can be performed on the data source. It includes information about the operation type, the fields required to perform the operation, and the type of each field. The label, key, type, description, and hint properties are used to define the specific fields and their types required for connecting to the API or data source. + +### 6. Add the npm package of Gitub to the plugin dependencies + +```bash +# change directory to the plugin directory and install the npm package +cd plugins/github +npm i octokit --workspace=@tooljet-marketplace/github +``` + +:::info +Steps to install npm package to a plugin + +```bash +npm i --workspace= +``` + +The command `npm i --workspace=` is used to install a specific npm package into a particular workspace of a multi-package repository. + +The *--workspace* flag is used to specify the workspace where the package should be installed. In this case, we are installing the package in the *@tooljet-marketplace/github* workspace. +::: + +### 7. Implement the query execution logic in index.ts +The QueryService for the Github plugin handles the logic for running queries in index.ts. The QueryService receives the metadata of the data source, including the credentials and configurations for connecting and parameters for the query that was run. + +For the Github datasource, the sourceOptions will include the credentials required for authentication, such as the personal access token. The queryOptions will have the configurations and parameters for the specific query, including the operation to be performed, such as getting the list of repositories for a specific user. + +The QueryService will use this information to create and execute the necessary API requests against the Github API. The resulting data will be returned to the caller, which can then be further processed as required. + + +Create a new file query_operations.ts in the plugins/github/src directory and add the following code to it. +```typescript +import { Octokit } from 'octokit' +import { QueryOptions } from './types' + + +export async function getUserInfo(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /users/{username}', + { + username: options.username + } + ); + return data; +} + +export async function getRepo(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}', + { + owner: options.owner, + repo: options.repo + } + ); + return data; +} + +export async function getRepoIssues(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}/issues', + { + owner: options.owner, + repo: options.repo, + state: options.state || 'all' + + } + ); + return data; +} + +export async function getRepoPullRequests(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}/pulls', + { + owner: options.owner, + repo: options.repo, + state: options.state || 'all' + } + ); + return data; +} + +``` + +The query_operations.ts file contains the functions that will be used to execute the queries. The functions will be called by the QueryService in index.ts. + +The Github class has three methods: +- run: This method is called when a query needs to be executed. It takes in *sourceOptions* and *queryOptions* as input, which represent the source metadata and the query configuration, respectively. The run method uses the octokit library to make API requests to the GitHub API and returns the result of the query in a QueryResult object. + +- testConnection: When a new data source is being added to a ToolJet application, the connection can be tested. +This method is called when a connection needs to be tested. It takes in sourceOptions as input, which represents the source metadata. The testConnection method tests the connection by attempting to get the authenticated user and returns a ConnectionTestResult object that indicates whether the connection was successful or not. + +:::note +Every data source might not have a way to test connection. If not applicable for your data source, you can disable the test connection feature by adding "customTesting": true, to the manifest.json of your plugin. +:: + +- getConnection: This method is a helper method that returns an authenticated octokit client that is used to make requests to the GitHub API. It takes in sourceOptions as input, which represents the source metadata, and returns an authenticated octokit client. + + + + + + + + + + + + + + diff --git a/docs/versioned_docs/version-2.3.0/how-to/bulk-update-multiple-rows-in-table.md b/docs/versioned_docs/version-2.3.0/how-to/bulk-update-multiple-rows-in-table.md new file mode 100644 index 0000000000..af9ccf6693 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/bulk-update-multiple-rows-in-table.md @@ -0,0 +1,115 @@ +--- +id: bulk-update-multiple-rows +title: Bulk update multiple rows in table +--- + +# Bulk update multiple rows in table + +Currently, the datasources in ToolJet have operation for **bulk update(GUI mode)** but that only works for changes made in the single row. We will soon be adding a new operation for bulk updating the multiple rows but for now we can bulk update multiple rows by creating a Custom JS query. + +In this guide, We have assumed that you have successfully connected the data source. For this guide, we will be using the PostgreSQL data source as an example database, currently, this workaround can be used only for PostgreSQL and MySQL. + +## 1. Create a query to get the data from the database + +Let's create the query that will be getting the data from the database: + +
+ +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/postgres1.png) + +
+ +## 2. Display the data on the table + +- Drag a **Table** widget on the canvas and click on its handle to open the properties on the left sidebar +- Edit the **Table data** field value and enter **`{{queries.postgresql1.data}}`** + +
+ +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/showData.png) + +
+ +## 3. Make the columns editable + +- Go to the **Columns**, Add or edit columns section and enter the **Column Name** that you want to display on the table and the **Key** name. Key is the name of the column in your database. +- Enable the toggle for **Make editable** for the columns that you want to be editable. + +
+ +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/columns.png) + +
+ +## 4. Enable bulk update options for table widget + +- Go to the **Options** section and enable the **Show update buttons**. Enabling this will add two buttons - **Save Changes** and **Discard Changes** at the bottom of the table, only when any cell in the table is edited. +- You can also enable highlight selected row.(**Optional**) + +
+ +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/options.png) + +
+ +## 5. Create a Custom JS query + +We will create a new Custom JS query(**runjs1**) that will generate SQL query for updating multiple rows. + +```js +const uniqueIdentifier = "id" +const cols = Object.values(components.table1.changeSet).map((col, index) => { + return { + col: Object.keys(col), + [uniqueIdentifier]: Object.values(components.table1.dataUpdates)[index][uniqueIdentifier], + values: Object.values(col), + }; +}); + +const sql = cols.map((column) => { + const { col, id, values } = column; + const cols = col.map((col, index) => `${col} = '${values[index]}'`); + return `UPDATE users SET ${cols.join(", ")} WHERE id = '${id}';`; +}); + +return sql +``` +:::info +Here the **Unique identifier** is **id**, this is the column name that is used to identify the row in the database. +Update the **Unique identifier** if you are using a different column name. +::: +
+ +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/runjs1.png) + +
+ +## 6. Create an Update query + +Let's create a new PostgreSQL query and name it `update`. In **SQL mode**, enter `{{queries.runjs1.data.join(' ')}}` and **Save** it. + +
+ +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/update.png) + +
+ +## 7. Creating a flow for queries + +- Click on the handle of the **Table** widget to open its properties +- Go to the **Events**, and add a handler +- Select **Bulk Update** in Events, **Run Query** in Actions, and then select the **runjs1** query in Query. Now whenever a user will edit the table and hit the **Save Changes** button runjs1 will run. + +
+ +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/event.png) + +
+ +- Now, go to the **Advanced** tab of **runjs1** and add a handler to run update query for **Query Success** Event. Now whenever the runjs1 query will be run - the update operation will be performed on the database. + +
+ +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/success.png) + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/how-to/import-external-lib-py.md b/docs/versioned_docs/version-2.3.0/how-to/import-external-lib-py.md new file mode 100644 index 0000000000..7c805bcef6 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/import-external-lib-py.md @@ -0,0 +1,98 @@ +--- +id: import-external-libraries-using-runpy +title: Import external libraries using RunPy +--- + +ToolJet allows you to utilize python packages in your app by importing them using the [RunPy query](/docs/data-sources/run-py). +In this how-to guide, we will import a few packages and use it in the application. + +:::caution Unsupported modules +The modules that are not currently supported in Pyodide are those that have C or C++ extensions that rely on system libraries. These modules cannot be used in Pyodide because it runs in a web browser, which does not have access to the underlying system libraries that the C or C++ extensions rely on. Additionally, Pyodide uses a version of Python that has been compiled to WebAssembly, which does not support the same system calls as a regular version of Python. Therefore, any module that requires access to system libraries or system calls will not work in Pyodide. +::: + +- Create a new application and then create a new RunPy query from the query panel. +
+ + Import external libraries using RunPy + +
+ +- Let's write some code for importing packages. We will first import the micropip which is a package installer for Python and then we will install the `Pandas` and `NumPy` using micropip. **Run** the query to install the packages. + ```python + import micropip + await micropip.install('pandas') + await micropip.install('numpy') + ``` + +
+ + Import external libraries using RunPy + +
+ +:::tip +Enable the **Run this query on application load?** option to make the packages available throughout the application. +::: + +## Examples + +### Array of random numbers of using NumPy + +- Let's create a **RunPy** query that will use **random** module from the **NumPy** package and the query will generate array of random numbers. + ```python + from numpy import random + + x = random.binomial(n=10, p=0.5, size=10) + + print(x) + ``` + +
+ + Import external libraries using RunPy + +
+ +:::info +You can check the output on the browser's console. +::: + +### Parse CSV data + +- Let's create a RunPy query that will parse the data from the csv file. In this query we will use `StringIO`, `csv`, and `Pandas` module. + ```python + from io import StringIO + import csv + import pandas as pd + + scsv = components.filepicker1.file[0].content + + f = StringIO(scsv) + reader = csv.reader(f, delimiter=',') + + df = pd.DataFrame(reader) + + print(df.info()) + print(df) + ``` + +
+ + Import external libraries using RunPy + +
+ +- Add a file picker component on the canvas and set a event handler for **On file loaded** event to **Run Query** that we created for parsing the data. +
+ + Import external libraries using RunPy + +
+ +- Finally, let's load a csv file on the file picker and check the output by the RunPy query on the browser console. +
+ + Import external libraries using RunPy + +
+ \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/how-to/loading-image-pdf-from-db.md b/docs/versioned_docs/version-2.3.0/how-to/loading-image-pdf-from-db.md new file mode 100644 index 0000000000..2028f8e5b2 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/loading-image-pdf-from-db.md @@ -0,0 +1,45 @@ +--- +id: loading-image-pdf-from-db +title: Loading image/PDF from base64 string +--- + +In this how-to guide we will see how we can load an image or PDF file using the base64 string available on the database. In this how-to, we have used the postgres database which already has the base64 strings for the image or the PDF files available. + +- Let's drag a **filepicker** component onto the canvas, and pick one image and one pdf file +
+ + Loading image from base64 string + +
+ +- Now, create a query for inserting an image from the filepicker. As you can see in the screenshot below, we are using the **exposed variable** of the filepicker component to retrieve the **base64** data of the uploaded files. +
+ + Loading image from base64 string + +
+ +- Create another query for returning the data from the database and we will use this base64 data returned in this query to display on the image and pdf components. +
+ + Loading image from base64 string + +
+ +- Drag the image and a PDF component on the canvas. Edit the property of the PDF component and in the **file URL** enter: + ```js + {{'data:image/png;base64,' + queries.get.data[7].pdf}} + ``` + Similarly for the image component: + ```js + {{'data:image/jpeg;base64,' + queries.get.data[7].image}} + ``` +
+ + Loading image from base64 string + +
+ +:::info +You can also use transformations in the query response and concat `data:image/jpeg;base64,` to the base64 data. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/how-to/oauth2-authorization.md b/docs/versioned_docs/version-2.3.0/how-to/oauth2-authorization.md new file mode 100644 index 0000000000..e2fd0c5236 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/oauth2-authorization.md @@ -0,0 +1,66 @@ +--- +id: oauth2-authorization +title: REST API authentication using OAuth 2.0 +--- + +# REST API authentication using OAuth 2.0 + +ToolJet’s REST API data source supports OAuth 2.0 as the authentication type. In this guide, we’ll learn how to use **Google OAuth2 API** to delegate authorization and authentication for your ToolJet Application. + +Before setting up the REST API data source in ToolJet, we need to configure the **Google Cloud Platform** to gather the API keys required for the authorization access. + +## Setting up Google Cloud Platform + +Google Cloud Platform provides access to more than 350 APIs and Services that can allow us to access data from our Google account and its services. Let's create an OAuth application that can be given permission to use our Google profile data such as Name and Profile picture. + +1. Sign in to your [Google Cloud](https://cloud.google.com/) account, and from the console create a New Project. +2. Navigate to the **APIs and Services**, and then open the **OAuth consent screen** section from the left sidebar. +3. Enter the Application details and select the appropriate scopes for your application. We will select the profile and the email scopes. +4. Once you have created the OAuth consent screen, Create new credentials for the **OAuth client ID** from the **Credentials** section in the left sidebar. +5. Select the application type, enter the application name, and then add the following URIs under Authorised Redirect URIs: + 1. `https://app.tooljet.com/oauth2/authorize` (if you’re using ToolJet cloud) + 2. `http://localhost:8082/oauth2/authorize` (if you’re using ToolJet locally) +6. Now save and then you’ll get the **Client ID and Client secret** for your application. + +ToolJet - How To - REST API authentication using OAuth 2.0 + +## Configuring ToolJet Application with Google's OAuth 2.0 API + +Let's follow the steps to authorize ToolJet to access your Google profile data: + +- Select **add data source** from the left sidebar, and choose **REST API** from the dialog window. + +:::info +You can rename the data source by clicking on its default name `REST API` +::: + +- In the **URL** field, enter the base URL `https://www.googleapis.com/oauth2/v1/userinfo`; the base URL specifies the network address of the API service. +- Select authentication type as `OAuth 2.0` +- Keep the default values for **Grant Type**, **Add Access Token To**, and **Header Prefix** i.e. `Authorization Code`, `Request Header`, and `Bearer` respectively. +- Enter **Access Token URL**: `https://oauth2.googleapis.com/token`; this token allows users to verify their identity, and in return, receive a unique access token. +- Enter the **Client ID** and **Client Secret** that we generated from the [Google Console](http://console.developers.google.com/). +- In the **Scope** field, enter `https://www.googleapis.com/auth/userinfo.profile`; Scope is a mechanism in OAuth 2.0 to limit an application's access to a user's account. Check the scopes available for [Google OAuth2 API here](https://developers.google.com/identity/protocols/oauth2/scopes#oauth2). +- Enter **Authorization URL:** `https://accounts.google.com/o/oauth2/v2/auth`; the Authorization URL requests authorization from the user and redirects to retrieve an authorization code from identity server. +- Create three **Custom Authentication Parameters:** + + | params | description | + | ----------- | ----------- | + | response_type | code ( `code` refers to the Authorization Code) | + | client_id | **Client ID** | + | redirect_uri | `http://localhost:8082/oauth2/authorize` if using ToolJet locally or enter this `https://app.tooljet.com/oauth2/authorize` if using ToolJet Cloud. | + +- Keep the default selection for **Client Authentication** and **Save** the data source. + +ToolJet - How To - REST API authentication using OAuth 2.0 + +## Create the query + +Let’s create a query to make a `GET` request to the URL, it will pop a new window and ask the user to authenticate against the API. + +- Add a new query and select the REST API datasource from the dropdown +- In the **Method** dropdown select `GET` and in advance tab toggle `run query on page load?` +- **Save** and **Run** the query. + +ToolJet - How To - REST API authentication using OAuth 2.0 + +A new window will pop for authentication and once auth is successful, you can run the query again to get the user data like Name and Profile Picture. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/how-to/run-action-from-runjs.md b/docs/versioned_docs/version-2.3.0/how-to/run-action-from-runjs.md new file mode 100644 index 0000000000..c9b776fd28 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/run-action-from-runjs.md @@ -0,0 +1,195 @@ +--- +id: run-actions-from-runjs +title: Run Actions from RunJS query +--- + +# Run `Actions` from RunJS query + +Now you can trigger all the `actions` available in ToolJet from within the `RunJS` query. This guide includes the syntax for each action along with the example. + +### Run Query + +**Syntax:** + +```js +queries.queryName.run() +``` +or +```js +await actions.runQuery('queryName') +``` + +**Example:** In the screenshot below, we are triggering the two different queries `customers` and `getData` using the two different syntax available for `Run Query` action. + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/runquery.png) + +
+ +### Set Variable + +**Syntax:** + +```javascript +actions.setVariable(variableName, variableValue) +``` + +**Example:** In the screenshot below, we are setting the two variables `test` and `test2`. `test` variable includes a numerical value so we haven't wrapped it inside the quotes but the variable `test2` is a string so we have wrapped it in quotes. + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/setvariable.png) + +
+ +### Unset Variable + +**Syntax:** + +```javascript +actions.unSetVariable(variableName) +``` + +**Example:** In the screenshot below, we are unsetting the variable `test2` that we created in the previous step. + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/unsetvariable.png) + +
+ +### Logout + +**Syntax:** + +```javascript +actions.logout() +``` + +**Example:** Triggering `actions.logout()` will log out the current logged in user from the ToolJet and will redirect to sign in page. + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/logout.png) + +
+ +### Show Modal + +**Syntax:** + +```javascript +actions.showModal('modalName') +``` + +**Example:** In the screenshot below, there is a modal on the canvas (renamed it to `formModal` from `modal1`) and we are using RunJS query to show the modal. + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/showmodal.png) + +
+ +### Close Modal + +**Syntax:** + +```javascript +actions.closeModal('modalName') +``` + +**Example:** In the screenshot below, we have used RunJS query to close the modal that we showed up in previous step. + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/closemodal.png) + +
+ +### Set Local Storage + +**Syntax:** + +```javascript +actions.setLocalStorage('key','value') +``` + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/setlocalstorage.png) + +
+ +### Copy to Clipboard + +**Syntax:** + +```javascript +actions.copyToClipboard('contentToCopy') +``` + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/copytoclipboard.png) + +
+ +### Generate File + +**Syntax:** + +```javascript +actions.generateFile('fileName', 'fileType', 'data') +``` + +**Example:** `fileName` is the name that you want to give the file(string), `fileType` can be `csv` or `text`, and `data` is the data that you want to store in the file. + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/generatefile.png) + +
+ +### Go to App + +**Syntax:** + +```javascript +actions.goToApp('slug',queryparams) +``` + +- `slug` can be found in URL of the released app after the `application/`, or in the `Share` modal +- `queryparams` can be provided like this `[{"key":"value"}, {"key2":"value2"}]` + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/gotoapp1.png) + +
+ +### Show Alert + +**Syntax:** + +```javascript +actions.showAlert(alert type , message ) // alert types are info, success, warning, and danger + +ex: +actions.showAlert('error' , 'This is an error' ) +``` + +
+ +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/showalert.png) + +
+ + + + + + + + + diff --git a/docs/versioned_docs/version-2.3.0/how-to/run-query-at-specified-intervals.md b/docs/versioned_docs/version-2.3.0/how-to/run-query-at-specified-intervals.md new file mode 100644 index 0000000000..89b2a87428 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/run-query-at-specified-intervals.md @@ -0,0 +1,42 @@ +--- +id: run-query-at-specified-intervals +title: Run query at specified intervals +--- + +In this how-to guide, we will learn how to make a query trigger at the specific intervals. + +- Let's go to the ToolJet dashboard and **create a new application** +- Once the app builder opens up, drag a **table** component to canvas +- Now, create a new REST API query from the query panel at the bottom of the app builder. We will be using the data from the mock **REST API** and then load the data on the table. Let's create a REST API, choose `GET` method from the dropdown, enter the endpoint `(https://jsonplaceholder.typicode.com/posts)`, name the query `post` and then **save and run** it +
+ + REST API query + +
+- Go to the **Table properties** and add connect the query data to table by adding value to **table data** property which is `{{queries.post.data}}` +
+ + REST API query + +
+ +- Now, we will create a RunJS query that will first set a variable called `interval` which will include the value returned by the `setInterval()` method that calls a function `countdown` at specified intervals. The countdown function has the code to trigger the `post` query that we created in the previous step. + + ```js + actions.setVariable('interval',setInterval(countdown, 5000)); + function countdown(){ + queries.post.run() + } + ``` +- Go to the **Advanced** tab of the query, enable `Run query on page load?` this will trigger this RunJS query when the app is loaded. Name the query as `set` and **Save** it. Note that you will have to save the query and not `Save and Run` because doing it will trigger the query and you won't be able to stop the query unless you reload the page or go back to dashboard. +
+ + REST API query + +
+- To prevent the query from triggering indefinitely, we will create another RunJS query that will make use of `clearInterval()` method. In this method we will get the value from the variable that we created in `set` query. Save this query as `clear`. + ```js + clearInterval(variables.interval) + ``` +- Finally, let's add a **button** on to the canvas and add the **event handler** to the button to run the `clear` query. +- Now, whenever the app will be loaded the **set** query will be triggered and will keep triggering the `post` query at the specified intervals. Whenever the user wants to **stop** the query they can click on the **button** to trigger the **clear** query which will clear the interval. diff --git a/docs/versioned_docs/version-2.3.0/how-to/s3-custom-endpoint.md b/docs/versioned_docs/version-2.3.0/how-to/s3-custom-endpoint.md new file mode 100644 index 0000000000..da3d77558c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/s3-custom-endpoint.md @@ -0,0 +1,18 @@ +--- +id: s3-custom-endpoints +title: Use custom endpoint for s3 hosts +--- + +In this how-to guide, we will see how we can connect to different **S3 compatible object storages** using the custom endpoint. In this guide, we are using Minio since it is an S3-compatible object storage. + +- Go to the ToolJet dashboard, and create a new application +- On the left-sidebar, go to the **Sources** and add a new AWS S3 datasource +- Now the connection modal will pop-up +
+ + Custom Endpoint - S3 hosts + +
+- To get the **Credentials** which is **Access Key** and **Secret Key**, you'll need to go to the Minio console to generate the keys +- Enable the **Custom Endpoint** toggle switch, and enter the custom host URL i.e where your Minio server API is exposed +- Once entered the details, you can click on the **Test Connection** button to check the connection \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/how-to/upload-files-aws.md b/docs/versioned_docs/version-2.3.0/how-to/upload-files-aws.md new file mode 100644 index 0000000000..1543d8a928 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/upload-files-aws.md @@ -0,0 +1,137 @@ +--- +id: upload-files-aws +title: Upload files on AWS S3 bucket +--- + +# Upload and download files on AWS S3 bucket + +This guide will help you in quickly building a basic UI for uploading or downloading files from AWS S3 buckets. + +Before building the UI, check out the **[docs for AWS S3 data source](/docs/data-sources/s3)** to learn about setting up AWS S3 and adding the data source. + +Once you have successfully added the AWS data source, build a basic UI using the following widgets: +- **Dropdown**: For selecting a bucket in S3 storage. +- **Table**: For listing all the objects inside the selected bucket in dropdown. +- **Text Input**: For getting a path for the file that is to be uploaded. +- **File picker**: For uploading the file. +- **Button**: This will be used to fire the upload query. + +
+ +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/ui.png) + +
+ +## Queries + +We'll create the following queries: + +1. **getBuckets** +2. **listObjects** +3. **uploadToS3** +4. **download** + +### getBuckets + +This query will fetch the list of all the buckets in your S3. Just create a new query, select AWS S3 data source, and choose **List buckets** operation. Name the query **getBuckets** and click **Save**. + +
+ +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/getBuckets.png) + +
+ +Now, let's edit the properties of **dropdown** widget. + +- **Label**: Set the label as Bucket. +- **Option values**: Set option values as `{{queries.getBuckets.data.Buckets.map(bucket => bucket['Name'])}}`. We're mapping the data returned by the query as the returned data is array of abjects. +- **Option label**: Set option values as `{{queries.getBuckets.data.Buckets.map(bucket => bucket['Name'])}}`. This will display the same option label as option values. + +You can later add an event handler for running the **listObject** query whenever an option is selected from the dropdown. + +
+ +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/dropdown.png) + +
+ +### listObjects + +This query will list all the objects inside the selected Bucket in dropdown. Select **List objects in a bucket** operation, enter `{{components.dropdown1.value}}` in the Bucket field - this will dynamically get the field value from the selected option in dropdown. + +
+ +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/listObjects.png) + +
+ +Edit the properties of **table** widget: +- **Table data**: `{{queries.listObjects.data['Contents']}}` +- **Add Columns**: + - **Key**: Set the **Column Name** to `Key` and **Key** to `Key` + - **Last Modified**: Set the **Column Name** to `Last Modified` and **Key** to `LastModified` + - **Size**: Set the **Column Name** to `Size` and **Key** to `Size` +- Add a **Action button**: Set button text to **Copy signed URL**, Add a handler to this button for On Click event and Action to Copy to clipboard, in the text field enter `{{queries.download.data.url}}` - this will get the download url from the **download** query that we will create next. + +
+ +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/table.png) + +
+ +### download + +Create a new query and select **Signed URL for download** operation. In the Bucket field, enter `{{components.dropdown1.value}}` and in Key enter `{{components.table1.selectedRow.Key}}`. + +
+ +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/download.png) + +
+ +Edit the **properties** of the table, add a Event handler for running the `download` query for `Row clicked` event. This will generate a signed url for download every time a row is clicked on the table. + +### uploadToS3 + +Create a new query, select the **Upload object** operation. Enter the following values in their respective fields: +- **Bucket**: `{{components.dropdown1.value}}` +- **Key**: {{ components.textinput1.value + '/' +components.filepicker1.file[0].name}}` +- **Content type**: `{{components.filepicker1.file[0].type}}` +- **Upload data**: `{{components.filepicker1.file[0].base64Data}}` +- **Encoding**: `base64` + +
+ +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/uploadToS3.png) + +
+ +#### Configure the file picker: + +Click on the widget handle to edit the file picker properties: + +- Change the **Accept file types** to `{{"application/pdf"}}` for the picker to accept only pdf files or `{{"image/*"}}` for the picker to accept only image files . In the screenshot below, we have set the accepted file type property to `{{"application/pdf"}}` so it will allow to select only pdf files: + +
+ +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/result-filepicker.png) + +
+ +- Change the **Max file count** to `{{1}}` as we are only going to upload 1 file at a time. + +- Select a pdf file and hold it in the file picker. + +:::info + File types must be valid **[MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)** type according to input element specification or a valid file extension. + + To accept any/all file type(s), set `Accept file types` to an empty value. +::: + +
+ +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/config-filepicker.png) + +
+ +Final steps, go to the **Advanced** tab of the **uploadToS3** query and add a query to run **listObjects** query so that whenever a file is uploaded the tabled is refreshed. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/how-to/upload-files-gcs.md b/docs/versioned_docs/version-2.3.0/how-to/upload-files-gcs.md new file mode 100644 index 0000000000..1a298174ec --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/upload-files-gcs.md @@ -0,0 +1,73 @@ +--- +id: upload-files-gcs +title: Upload files using GCS +--- + +# Upload files using GCS + +In this guide, we are going to create an interface to upload PDFs to Google Cloud Storage. + +Before adding the new data source we will need to have a private key for our GCS bucket and make sure the key has the appropriate rights. + +## Setting up Google Cloud Storage data source + +1. Go to the data source manager on the left-sidebar and click on the `+` button. +2. Add a new GCS data source from the **APIs** section in modal that pops up. +3. Enter the **JSON private key for service account** and test the connection. +4. Click on **Save** to add the data source. + +
+ +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/adding-account.png) + +
+ +## Adding a file picker + +1. Drag and drop the **file picker** widget on the canvas +2. Configure the file picker: + - Change the **Accept file types** to `{{"application/pdf"}}` for the picker to accept only pdf files. In the screenshot below, we have set the accepted file type property to `{{"application/pdf"}}` so it will allow to select only pdf files: + +
+ +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/result-filepicker.png) + +
+ + - Change the **Max file count** to `{{1}}` as we are only going to upload 1 file at a time. + +3. Select a pdf file and hold it in the file picker. + +:::info + File types must be valid **[MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)** type according to input element specification or a valid file extension. + + To accept any/all file type(s), set `Accept file types` to an empty value. +::: + +
+ +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/config-filepicker.png) + +
+ +## Creating a query + +1. Click on the `+` button of the query manager at the bottom panel of the editor and select the GCS data source +2. Select **Upload file** operation and enter the required parameters: +- Bucket: `gs://test-1` +- File Name: `{{components.file1.file[0]['name']}}` +- Content Type: `{{components.file1.file[0]['type']}}` +- Upload data: `{{components.file1.file[0]['base64Data']}}` +- Encoding: `base64` +3. Click on **Save** to create the query + +## Running the query +1. Add a **button** that will fire the query to upload the file +2. Edit the properties of the button and add a **event handler** to **Run the query** on **On-Click** event. +3. Click on **Button** to fire the query, this will upload the pdf file that you selected earlier through the file picker and will upload it on the GCS. + +
+ +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/final-result.png) + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/how-to/use-axios.md b/docs/versioned_docs/version-2.3.0/how-to/use-axios.md new file mode 100644 index 0000000000..a2f5567d83 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/use-axios.md @@ -0,0 +1,62 @@ +--- +id: use-axios-in-runjs +title: Use Axios in RunJS +--- + +ToolJet allows you to utilize the three [libraries](/docs/data-sources/run-js#libraries) - **Moment.js**, **Lodash**, and **Axios**. In this guide, we will see a few examples on how to use **Axios** library using RunJS query. + +**[Axios](https://axios-http.com/docs/intro)** is a promise-based HTTP library that lets developers make requests to either their own or a third-party server to fetch data. It offers different ways of making requests such as `GET`, `POST`, `PUT/PATCH`, and `DELETE`. + +## Making Axios HTTP requests + +In this section, you will make `GET` and `PUT` requests. You will be using a free “fake” API: **[JSONPlaceholder](https://jsonplaceholder.typicode.com/)**. + +### Making a GET request + +Create a RunJS query and copy the code below: + +```javascript +var url = "https://jsonplaceholder.typicode.com/users/1"; + +var data = (await axios.get(url)).data; + +return data +``` + +In the code snippet, a variable url is declared which is assigned the URL of the JSON API. Then another variable is decalared which sends a GET request to the JSON API. Save the query and hit Preview to view the data returned by the API. + +
+ +Use Axios in RunJS + +
+ +### Making a POST request + +A post request is a little different because you will be passing some data in the request to the server. In the request, you will be creating a user and passing in details for that user. The code snippet for the request will look something like this: + +```javascript +var url = "https://jsonplaceholder.typicode.com/users"; + +var data = axios.post(url,{ + id: 11, + name: "Shubhendra", + username: "camelcaseguy", + email: "shubhendra@tooljet.com",}) + +return data +``` + +The Axios POST request uses an object after the request URL to define the properties you want to create for your user. Once the operation has been completed, there will be a response from the server. In the screenshot below, you can see the that it return **Status: 201** which means the request has been fulfilled and resulted in a new resource being created. + +
+ +Use Axios in RunJS + +
+ +:::tip +Check out the tutorial on **[Build GitHub star history tracker](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/)** that utlizes the axios library. +::: + + diff --git a/docs/versioned_docs/version-2.3.0/how-to/use-form-component.md b/docs/versioned_docs/version-2.3.0/how-to/use-form-component.md new file mode 100644 index 0000000000..51eb84ef10 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/use-form-component.md @@ -0,0 +1,90 @@ +--- +id: use-form-component +title: Use form component +--- + +In this how-to guide, we will be building a simple application that will leverage the form component for adding a record into the database. For this guide, we will be using Google Sheet datasource to read and write data. + +
+ +how-to use form + +
+ +- Let's connect to the datasource i.e. Google Sheets and give the `Read and Write` permission. +
+ + how-to use form + +
+- Now, drag a table on the canvas and add the form component next to it. +
+ + how-to use form + +
+ +- Currently, the table component is populated with the sample data that it has by default. Let's create a **new query** from the query panel and choose the **Google Sheet** datasource. +
+ + how-to use form + +
+ +- The query will read the data from the database and we will use the returned data to populate the table. Go to the **table** property and in the table data value enter **{{queries.queryname.data}}** where queryname is the name of the query that we created in previous step. +
+ + how-to use form + +
+ +- let's go to the form and add the components inside it required for adding a record into the database. +
+ + how-to use form + +
+ +- Since our database record has five fields **Id**, **Title**, **Price**, **Category** and **Image** we will add the components in the form for the same. The form already comes with a Submit button so we don't have to add that. For Id, Title, and Image we will use text-input, for Price we will use number-input and for category we can use dropdown components. +
+ + how-to use form + +
+ +- Before editing the form properties, let's make a few changes in the components that we have added inside it. First edit the property of the **number input** and set the default value, maximum and minimum value, and then edit the **dropdown** component and set the option values and option labels. +
+ + how-to use form + +
+ +- Now, we can edit the properties of the form component. Go to its properties, in **Button To Submit Form** select the button1 that was already there on the form. Go to event handler, and for **On submit** event we will **run the query** that will get the data from the form and will store into the database. +
+ + how-to use form + +
+ +- Let's create a query that will get the data from the form and add a record in the sheet. Create a new google sheeet query and from the operation choose **Append data to a spreadsheet** + ```js + [ + { + "id":"{{components.form1.data.textinput1.value}}", + "title":"{{components.form1.data.textinput2.value}}", + "price":"{{components.form1.data.numberinput1.value}}", + "category":"{{components.form1.data.dropdown1.value}}", + "image":"{{components.form1.data.textinput4.value}}" + } + ] + ``` + +- Once done, save the query and add it to the Form's event handler. + +- Now, this application can be used to load the data from the Google Sheet and the form can be used to append more records to the sheet. + +:::tip +- Make sure to enable **Run query on page load?** option of the **read** query to populate the table everytime the app is loaded +- You can also add a event handler on the **append** query to run the **read** query when **append** is successful, this will update the table data when the append is done +- Learn more about the connecting Google sheet datasource and the CRUD **operations** available [here](/docs/data-sources/google.sheets). +::: diff --git a/docs/versioned_docs/version-2.3.0/how-to/use-inspector.md b/docs/versioned_docs/version-2.3.0/how-to/use-inspector.md new file mode 100644 index 0000000000..90e24ff47e --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/use-inspector.md @@ -0,0 +1,112 @@ +--- +id: use-inspector +title: Use Inspector +--- + +In this how-to guide, we will take a look at **Inspector** of the app-builder and see how it can be helpful in building applications. + +The Inspector can be used to inspect the data of the queries, properties and values of the components that are there on the canvas, ToolJet's global variables and the variables that have been set by the user. + +
+ +How to - Use Inspector + +
+ +## Layout + +Let's take a look at the layout of the Inspector panel: + +- On the top-right, we have a **Pin** button to pin and unpin the inspector panel. This button can be useful when you want to see the live changes on inspector while triggering a query or performing some event/action on any component. +
+ + How to - Use Inspector + +
+ +- At the bottom right, you can click and hold to resize the inspector. +
+ + How to - Use Inspector + +
+ +- On hovering an item on the inspector, the **copy path** and **copy value** buttons will appear on the right of the item. Copying the path and pasting it onto the component property or query parameter will always get the dynamic value but using `Copy value` uption will copy the current value of the item and will be static when pasted in a component property or query parameter. +
+ + How to - Use Inspector + +
+ +## Sections + +The Inspector panel has the following 4 main sections: + +- **[queries](#queries)** +- **[components](#components)** +- **[globals](#globals)** +- **[variables](#variables)** + +### queries + +The queries section can be used to inspect the query details but the data of the query will only be available if query has been run/triggered. + +:::tip +You can click on the Preview button of the button on the query manager to check the response(data) of the query without triggering it. +::: + +#### Example + +- Let's create a new query using a mock REST API endpoint (`https://fakestoreapi.com/products`). +- Now go to the Inspector and expand the **queries** section, you'll see an entry inside queries with the query name that we created in the previous step i.e. `restapi1` but if you notice the `data` and `rawData` object is empty i.e. 0 entry. The reason is the data won't show up on the inspector unless query is run. +
+ + How to - Use Inspector + +
+ +- Let's pin the inspector and then trigger the query from the query manager. You'll see that as soon as the query is triggered the `rawData` and `data` object in the query has 20 entries and the query has more properties like `request`, `response`, and `responseHeaders` data. +
+ + How to - Use Inspector + +
+ +### components + +components section can be used to inspect the properties and values of the components that are added onto the canvas. + +
+ +How to - Use Inspector + +
+ +### globals + +globals section includes the following sub-sections: + +- **currentUser:** The currentUser object contains information about the currently logged-in user such as **email**, **firstName**, and **lastName**. +- **groups:** The groups array contains the name of the groups the currently logged-in user is added to. Note: The `all_users` is default groups for everyone. +- **theme:** The theme object contains the name of the currently active theme. +- **urlparam:** The urlparams contains the information about the url parameters of the application. + +:::info +All the global variables can be accessed anywhere inside the ToolJet applications. Here's an **[example use-case](/docs/how-to/access-currentuser)** of using these variables. +::: + +
+ +How to - Use Inspector + +
+ +### variables + +variables section include all the variables set by the user in the application. These variables can be set from the event handlers from the components or from the queries. The variables will be in the **key-value** pair and can be accessed throughout the application. + +:::info + +- Setting variables from the [event handler](/docs/actions/set-variable) +- Setting variables from the [Run JavaScript code](/docs/how-to/run-actions-from-runjs#set-variable) + ::: diff --git a/docs/versioned_docs/version-2.3.0/marketplace.md b/docs/versioned_docs/version-2.3.0/marketplace.md new file mode 100644 index 0000000000..0e031decf5 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/marketplace.md @@ -0,0 +1,120 @@ +--- +id: marketplace +title: Marketplace +--- + +# ToolJet Marketplace + +ToolJet marketplace for plugins will allow users to install the custom plugins (datasources) for their ToolJet instances. This will allow ToolJet users to build their own custom plugins according to their requirements and then easily connect them to ToolJet. + +## Enabling the marketplace for your instance + +Users must add the following environment variable to the [`.env`](/docs/setup/env-vars#marketplace-feature-enable--optional-) file to enable the marketplace feature: + +```bash +ENABLE_MARKETPLACE_FEATURE=true +``` + +Once the marketplace feature is enabled, users can open the **Marketplace** page from the dropdown on the navbar of the dashboard. Users can also directly access the marketplace using the URL: `https://tooljet.yourcompany.com/integrations` + +:::info +The user logged-in should be the **Administrator** to access the marketplace page. +::: + +## Installing a plugin + +When you [create a plugin](#creating-a-marketplace-plugin) using the [tooljet cli](https://www.npmjs.com/package/@tooljet/cli), an object is created in the **plugins.json** (`ToolJet/server/src/assets/marketplace/plugins.json`) file for that particular plugin. + +Here's an example of an entry created for AWS S3 plugin: + +```json +[ + { + "name": "AWS S3 plugin", + "description": "Datasource plugin for AWS S3", + "version": "1.0.0", + "id": "s3", + "repo": "", + "author": "Tooljet", + "timestamp": "Mon, 31 Oct 2022 11:02:10 GMT" + } +] +``` + +Now to install the plugin to the marketplace, you'll have to install npm package to a plugin: + +```bash +npm i --workspace= +``` + +Finally, run the build commands: + +```bash +npm install +npm run build --workspaces +``` + +Once done, you'll find the plugin on the marketplace page. + + +## Removing a plugin + +To remove a plugin from the marketplace, you can simply remove the object entry of the plugin from the **plugins.json**(`ToolJet/server/src/assets/marketplace/plugins.json`) and then re-run the build commands. + +## Using a plugin as datasource + +The flow for installing and using a plugin as a datasource is really simple. The steps are: +- Go to the **Marketplace** +- Click the Marketplace link in the left sidebar to view all available plugins. +
+ + Marketplace + +
+- Click on the **Install** button of the plugin that you want to install +- Once installed, you can check the installed plugins from **Installed** on the left sidebar. You can also **remove** the plugins from the Installed section of the marketplace. +
+ + Installed plugins + +
+- Now, let's use the installed plugin as the datasource for an application. User will have to open the application, go to the **Add Datasource** button on the left sidebar of the app builder, and then select Plugins on the modal that pops-up. The Plugins section will include all the plugins installed via Marketplace. The next steps are same as connecting a datasource to the application. +
+ + Installed plugins as datasource + +
+ +## Creating a marketplace plugin + +The steps for creating a Marketplace plugin are similar to those for creating [plugins for ToolJet](/docs/contributing-guide/tutorials/creating-a-plugin) except that for a Marketplace plugin, the user will have to type `yes` when prompted `Is it a marketplace integration?` in the `tooljet command line`. + +The steps to create a marketplace plugin are: + +- Install [tooljet-cli](https://www.npmjs.com/package/@tooljet/cli): + ```bash + npm i -g @tooljet/cli + ``` +- Bootstrap a new plugin using cli + ```bash + tooljet plugin create bigquery + ``` +- On the CLI, you'll be prompted to enter a display name: + ```bash + Enter plugin display name: + ``` +- In the next step, you'll be asked to choose a plugin type **database**, **api**, or **cloud-storage** +- Now choose if `Is it a marketplace integration?` by entering `y/N` +- Enter the repository URL if the plugin is hosted on GitHub or else just press enter to skip to the next step +- Once done, all the plugin files will be generated inside the marketplace directory + ```bash + creating plugin... done + Plugin: bigquery created successfully + └─ marketplace + └─ plugin + └─ bigquery + ``` + +:::info +For more information on **[creating plugin for ToolJet](/docs/contributing-guide/tutorials/creating-a-plugin)**, please see the documentation on creating plugins. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/org-management/permissions.md b/docs/versioned_docs/version-2.3.0/org-management/permissions.md new file mode 100644 index 0000000000..5e33f5cb2c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/org-management/permissions.md @@ -0,0 +1,21 @@ +--- +id: permissions +title: Permissions +--- + +Permissions allow you to create and share resources to easily ensure what level of access each User has to ToolJet Apps and other resources. + +Admins can invite **Users** to their workspaces and assign them to the **Groups** that have Permissions to access Apps, folders, or workspace variables. + +:::info +See **[Manage Users and Groups](/docs/tutorial/manage-users-groups)** to learn how to invite users to ToolJet. +::: + +## Role-Based Access Control (RBAC) Glossary + +- **Users -** Users can be added to more than one or more Groups. Each User is associated with an email. +- **Groups -** By default, there are two groups: **All Users** and **Admin**. Additionally, you can create custom groups like Support, Engineering, etc. + - **All Users** - Contains all the users in your workspace. When **New Users** are invited they are added to this group by default. + - **Admins** - Contains all Admins in your workspace. Everyone added to this group will Permission to access all the ToolJet resources. +- **Apps, Folder, Workspace Variables -** Resources that Admins can set permissions on. +- **Permissions -** Create, Update and Delete. diff --git a/docs/versioned_docs/version-2.3.0/release-management/multi-env.md b/docs/versioned_docs/version-2.3.0/release-management/multi-env.md new file mode 100644 index 0000000000..fe02a74824 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/release-management/multi-env.md @@ -0,0 +1,32 @@ +--- +id: multi-environment +title: Multi-Environment +--- + +
Available on: Enterprise Edition
+ +ToolJet's **multi-environment** helps in streamlining workflows, thereby minimizing the chances of errors, and enables effective application management. Using multi-environment ensures that your ToolJet application is rigorously tested before it is made available to users. + +
+ +Multi-Environment + +
+ +## Using Multi-environments + +ToolJet comes with three default **environments**: +- **Production** +- **Development** +- **Staging** + +### Switching environments + +For switching the environment, click on the **Environment Manager** on the navbar of app-builder to open the dropdown and select a environment. + +The **datasource credentials** are required to be entered specifically for every environment. + +:::tip Best Practice +Make your default environment the **Production** environment - the environment in which the users use the final versions of your developed applications. This will help ensure that the production environment has access to all of the data sources. +::: + diff --git a/docs/versioned_docs/version-2.3.0/security.md b/docs/versioned_docs/version-2.3.0/security.md new file mode 100644 index 0000000000..6ff5ed1523 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/security.md @@ -0,0 +1,23 @@ +--- +id: security +title: Security +slug: /security +--- + +# Security + +## Data storage + +ToolJet does not store data returned from your data sources. ToolJet server acts as a proxy and passes the data as it is to the ToolJet client. The credentials for the data sources are handled by the server and never exposed to the client. For example, if you are making an API request, the query is run from the server and not from the frontend. + +## Datasource credentials +All the datasource credentials are securely encrypted using `aes-256-gcm`. The credentials are never exposed to the frontend ( ToolJet client ). + +## Other security features +- **TLS**: If you are using ToolJet cloud, all connections are encrypted using TLS. We also have documentation for setting up TLS for self-hosted installations of ToolJet. +- **Audit logs**: Audit logs are available on the enterprise edition of ToolJet. Every user action is logged along with the IP addresses and user information. +- **Request logging**: All the requests to server are logged. If self-hosted, you can easily extend ToolJet to use your preferred logging service. ToolJet comes with built-in Sentry integration. +- **Whitelisted IPs**: If you are using ToolJet cloud, you can whitelist our IP address (3.129.198.40) so that your datasources are not exposed to the public. +- **Backups**: ToolJet cloud is hosted on AWS using EKS with autoscaling and regular backups. + +If you notice a security vulnerability, please let the team know by sending an email to `security@tooljet.com`. diff --git a/docs/versioned_docs/version-2.3.0/setup/_category_.json b/docs/versioned_docs/version-2.3.0/setup/_category_.json new file mode 100644 index 0000000000..1211453a23 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Setup", + "position": 2, + "collapsed": true +} diff --git a/docs/versioned_docs/version-2.3.0/setup/client.md b/docs/versioned_docs/version-2.3.0/setup/client.md new file mode 100644 index 0000000000..71bba4ed7e --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/client.md @@ -0,0 +1,96 @@ +--- +id: client +title: Deploying ToolJet client +--- + +# Deploying ToolJet client + +ToolJet client is a standalone application and can be deployed on static website hosting services such as Netlify, Firebase, S3/Cloudfront, etc. + +You can build standalone client with the below command: +```bash +SERVE_CLIENT=false npm run build +``` + +## Deploying ToolJet client on Firebase + +:::tip +You should set the environment variable `TOOLJET_SERVER_URL` ( URL of the server ) while building the frontend and also set `SERVE_CLIENT` to `false`` for standalone client build. + +For example: `SERVE_CLIENT=false TOOLJET_SERVER_URL=https://server.tooljet.com npm run build && firebase deploy` +::: + +1. Initialize firebase project + ```bash + firebase init + ``` + Select Firebase Hosting and set build as the static file directory +2. Deploy client to Firebase + ```bash + firebase deploy + ``` + +## Deploying ToolJet client with Google Cloud Storage + +:::tip +You should set the environment variable `TOOLJET_SERVER_URL` ( URL of the server ) while building the frontend. + + +For example: `SERVE_CLIENT=false TOOLJET_SERVER_URL=https://server.tooljet.io npm run build` +::: + +#### Using Load balancer + +Tooljet client can be hosted from Cloud Storage bucket just like hosting any other static website. +Follow the instructions from google documentation [here](https://cloud.google.com/storage/docs/hosting-static-website). + +Summarising the steps below: +1. Create a bucket and upload files within the build folder such that the `index.html` is at the bucket root. + +2. Edit permissions for the bucket to assign *New principal* as `allUsers` with role as `Storage Object Viewer` and permit for public access for the bucket. + +3. Click on *Edit website configuration* from the [buckets browser](https://console.cloud.google.com/storage/browser?_ga=2.180838119.1530169400.1637242882-657891227.1637242882) and specify the main page as `index.html` + +4. Follow the [instructions](https://cloud.google.com/storage/docs/hosting-static-website#lb-ssl) on creating a load balancer for hosting a static website. + +5. Optionally, create Cloud CDN to use with the backend bucket assigned to the load balancer. + +6. After the load balancer is created there will be an IP assigned to it. Try hitting it to check the website is being loaded. + +7. Use the load balancer IP as the static IP for the A record of your domain. + +#### Using Google App Engine + +1. Upload the build folder onto a bucket + +2. Upload `app.yaml` file onto bucket with the following config + + ```yaml + runtime: python27 + api_version: 1 + threadsafe: true + + handlers: + - url: / + static_files: build/index.html + upload: build/index.html + + - url: /(.*) + static_files: build/\1 + upload: build/(.*) + ``` + +3. Activate cloud shell on your browser and create build folder + ```bash + mkdir tooljet-assets + ``` + +4. Copy the uploaded files onto an assets folder which is to be served + ```bash + gsutil rsync -r gs://your-bucket-name/path-to-assets ./tooljet-assets + ``` + +5. Deploy static assets to be served + ```bash + cd tooljet-assets && gcloud app deploy + ``` diff --git a/docs/versioned_docs/version-2.3.0/setup/digitalocean.md b/docs/versioned_docs/version-2.3.0/setup/digitalocean.md new file mode 100644 index 0000000000..017eddd99a --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/digitalocean.md @@ -0,0 +1,64 @@ +--- +id: digitalocean +title: DigitalOcean +--- + +# Deploying ToolJet on DigitalOcean + +Now you can quickly deploy ToolJet using the Deploy to DigitalOcean button. + +## Deploying + +#### Follow the steps below to deploy ToolJet on DigitalOcean: + + +1. Click on the button below to start one click deployment + +
+ + [![Deploy to DigitalOcean](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/ToolJet/ToolJet/tree/main) + +
+ +2. A new tab will open up, sign-in to your DigitalOCean account. Once signed-in, the **Create App** page will open up and **Resources** will be already selected. Click on **Next** button. + + ToolJet - Deploy on DigitalOcean - Resources + +3. Now, on **Environment Variables** page you can add new variables or edit the existing ones. Check the [environment variables here](/docs/setup/env-vars). + + ToolJet - Deploy on DigitalOcean - Environment Variables + +4. On the next page, you can change the **App name**, **Project**, and the **Region**. + + ToolJet - Deploy on DigitalOcean - App name + +5. On the last page, you'll be asked to **Review** all the app details such that we entered before such as **Resources**, **Environment Variables**, **Region**, and there will also be **Billing** section at the end. Review all the details and click the **Create Resource** button. + + ToolJet - Deploy on DigitalOcean - App name + +6. Once you click the **Create Resource** button, the build will begin. Once the build is complete, you'll see the resource and a **URL** next to it. Click on the URL to open the deployed **ToolJet**. + +:::tip +ToolJet server and client can be deployed as standalone applications. If you do not want to deploy the client on DigitalOcean, modify `package.json` accordingly. We have a [guide](/docs/setup/client) on deploying ToolJet client using services such as Firebase. +::: + +#### Deploying Tooljet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. +You can learn more about this feature [here](/docs/tooljet-database). + +Follow the steps below to deploy ToolJet Database on DigitalOcean: + +1. If you are using dev database within ToolJet deployment, upgrade it to managed database. You could also add a separate database, if you intent use a differenet database, please refer the [environment variables](/docs/setup/env-vars#tooljet-database-feature-enable--optional-) for additional env variables. + +2. Create a new app for PostgREST server. You can opt for docker hub to deploy PostgREST image of version `10.1.x`. + + ToolJet - Deploy on DigitalOcean - PostgREST resource + +3. Update the [environment variables](/docs/setup/env-vars#postgrest-server-optional) for PostgREST and expose the HTTP port `3000`. + + ToolJet - Deploy on DigitalOcean - PostgREST environment variables + +4. Add your newly created PostgREST app to the trusted sources of your managed or separate database. + +5. Update your existing ToolJet application deployment with [environment variables](/docs/setup/env-vars#tooljet-database-feature-enable--optional-) required for PostgREST. diff --git a/docs/versioned_docs/version-2.3.0/setup/docker-local.md b/docs/versioned_docs/version-2.3.0/setup/docker-local.md new file mode 100644 index 0000000000..0b10c8e4d2 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/docker-local.md @@ -0,0 +1,29 @@ +--- +id: docker-local +title: Try ToolJet locally +--- + +# Try ToolJet with Docker + +:::info +This doc is not for setting up the development environment, it is only for trying out ToolJet locally using Docker. Check out [Contributing Guide](/docs/category/contributing-guide). +::: + +You can run the command below to have ToolJet up and running right away. + +```bash +docker run \ + --name tooljet \ + --restart unless-stopped \ + -p 3000:3000 \ + -v tooljet_data:/var/lib/postgresql/13/main \ + tooljet/try:latest +``` + +## Setup information + +- Runs the ToolJet server on the port 3000 on your machine. +- Container has postgres already configured within. All the data will be available in the docker volume `tooljet_data`. +- Default user credentials to login (email: `dev@tooljet.io`, password: `password`). +- You can make use of `--env` or `--env-file` flag to test against various env configurables mentioned [here](https://docs.tooljet.com/docs/setup/env-vars). +- Use `docker stop tooljet` to stop the container and `docker start tooljet` to start the container thereafter. diff --git a/docs/versioned_docs/version-2.3.0/setup/docker.md b/docs/versioned_docs/version-2.3.0/setup/docker.md new file mode 100644 index 0000000000..c23a52343d --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/docker.md @@ -0,0 +1,149 @@ +--- +id: docker +title: Docker +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Deploying ToolJet using Docker Compose + +Follow the steps below to deploy ToolJet on a server using Docker Compose. ToolJet requires a PostgreSQL database to store applications definitions, (encrypted) credentials for datasources and user authentication data. + +:::info +If you rather want to try out ToolJet on your local machine with Docker, you can follow the steps [here](https://docs.tooljet.com/docs/setup/docker-local). +::: +### Installing Docker and Docker Compose +Install docker and docker-compose on the server. + - Docs for [Docker Installation](https://docs.docker.com/engine/install/) + - Docs for [Docker Compose Installation](https://docs.docker.com/compose/install/) + +### Deployment options + +There are two options to deploy ToolJet using Docker Compose: +1. **Using an external PostgreSQL database**. This setup is recommended if you want to use a managed PostgreSQL service such as AWS RDS or Google Cloud SQL. +2. **Using in-built PostgreSQL database**. This setup uses the official Docker image of PostgreSQL. + +Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack. + +:::info +We recommend using the managed PostgreSQL service on production for ease of administration, security, and management (backups, monitoring, etc). +If you'd want to run postgres with persistent volume rather, curl for the alternate docker compose file shared in the next step. +::: + + + + + 1. Setup a PostgreSQL database and make sure that the database is accessible. + + 2. Download our production docker-compose file into the server. + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/docker/docker-compose.yaml + ``` + + 3. Create `.env` file in the current directory (where the docker-compose.yaml file is downloaded): + + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/docker/.env.example + mv .env.example .env + ``` + + Set up environment variables in `.env` file as explained in [environment variables reference](/docs/setup/env-vars) + + `TOOLJET_HOST` environment variable can either be the public ipv4 address of your server or a custom domain that you want to use. + + Examples: + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://yourdomain.com` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` + + :::info + Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` + ::: + + :::info + If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. + ::: + + 4. Once you've populated the `.env` file, run + + :::note + Kindly uncomment PostgREST service within the [docker-compose.yaml](https://raw.githubusercontent.com/tooljet/tooljet/main/deploy/docker/docker-compose.yaml) if you intend to use tooljet database. + ::: + + ```bash + docker-compose up -d + ``` + + to start all the required services. + + :::info + If you're running a linux server, `docker` might need sudo permissions. In that case you can either run: + `sudo docker-compose up -d` + or + setup docker to run without root privileges by following the instructions written here https://docs.docker.com/engine/install/linux-postinstall/ + ::: + + 5. If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the server. + + + + + + 1. Download our production docker-compose file into the server. + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/docker/docker-compose-db.yaml + mv docker-compose-db.yaml docker-compose.yaml + mkdir postgres_data + ``` + + 2. Create `.env` file in the current directory (where the docker-compose.yaml file is downloaded): + + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/docker/.env.example + mv .env.example .env + ``` + + Set up environment variables in `.env` file as explained in [environment variables reference](/docs/setup/env-vars) + + `TOOLJET_HOST` environment variable can either be the public ipv4 address of your server or a custom domain that you want to use. + + Examples: + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://yourdomain.com` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` + + :::info + Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` + ::: + + :::info + If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. + ::: + + 3. Once you've populated the `.env` file, run + + :::note + Kindly uncomment PostgREST service within the [docker-compose.yaml](https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/docker/docker-compose-db.yaml) if you intend to use tooljet database. + ::: + + ```bash + docker-compose up -d + ``` + + to start all the required services. + + :::info + If you're running on a linux server, `docker` might need sudo permissions. In that case you can either run: + `sudo docker-compose up -d` + OR + Setup docker to run without root privileges by following the instructions written here https://docs.docker.com/engine/install/linux-postinstall/ + ::: + + 4. If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the server. + + + + + + diff --git a/docs/versioned_docs/version-2.3.0/setup/ec2.md b/docs/versioned_docs/version-2.3.0/setup/ec2.md new file mode 100644 index 0000000000..e7506d3056 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/ec2.md @@ -0,0 +1,78 @@ +--- +id: ec2 +title: AWS EC2 +--- + +# AWS EC2 + +:::info +You should setup a PostgreSQL database manually to be used by the ToolJet server. +::: + +Follow the steps below to deploy ToolJet on AWS EC2 instances. + +1. Setup a PostgreSQL database and make sure that the database is accessible from the EC2 instance. + +2. Login to your AWS management console and go to the EC2 management page. + +3. Under the `Images` section, click on the `AMIs` button. + +4. Find the [ToolJet version](https://github.com/ToolJet/ToolJet/releases) you want to deploy. Now, from the AMI search page, select the search type as "Public Images" and input the version you'd want `AMI Name : tooljet_vX.X.X.ubuntu_bionic` in the search bar. + +5. Select ToolJet's AMI and bootup an EC2 instance. + + Creating a new security group is recommended. For example, if the installation should receive traffic from the internet, the inbound rules of the security group should look like this: + + protocol| port | allowed_cidr| + ----| ----------- | ----------- | + tcp | 22 | your IP | + tcp | 80 | 0.0.0.0/0 | + tcp | 443 | 0.0.0.0/0 | + + +6. Once the instance boots up, SSH into the instance by running `ssh -i ubuntu@` + +7. Switch to the app directory by running `cd ~/app`. Modify the contents of the `.env` file. ( Eg: `vim .env` ) + + The default `.env` file looks like this: + ```bash + TOOLJET_HOST=http:// + LOCKBOX_MASTER_KEY= + SECRET_KEY_BASE= + PG_DB=tooljet_prod + PG_USER= + PG_HOST= + PG_PASS= + ``` + Read **[environment variables reference](/docs/setup/env-vars)** + + :::info + If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. + ::: + +8. `TOOLJET_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. + + Examples: + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://yourdomain.com` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` + + :::info + We use a [lets encrypt](https://letsencrypt.org/) plugin on top of nginx to create TLS certificates on the fly. + ::: + + :::info + Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` + ::: + +9. Once you've configured the `.env` file, run `./setup_app`. This script will install all the dependencies of ToolJet and then will start the required services. + +10. If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the EC2 instance. + +12. You're all done, ToolJet client would now be served at the value you've set in `TOOLJET_HOST`. + +#### Deploying Tooljet Database + +ToolJet AMI comes inbuilt with PostgREST. If you intend to use this feature, you'd only have to setup the environment variables in `~/app/.env` file and run `./setup_app` script. + +You can learn more about this feature [here](/docs/tooljet-database). \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/setup/ecs.md b/docs/versioned_docs/version-2.3.0/setup/ecs.md new file mode 100644 index 0000000000..76ffb14bad --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/ecs.md @@ -0,0 +1,77 @@ +--- +id: ecs +title: AWS ECS +--- + +# Deploying ToolJet on Amazon ECS + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. +::: + +Follow the steps below to deploy ToolJet on a ECS cluster. + +1. Setup a PostgreSQL database + ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. + +2. Create a target group and an application load balancer to route traffic onto ToolJet containers. + You can [reference](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create-application-load-balancer.html) AWS docs to set it up. Please note that ToolJet server exposes `/api/health`, which you can configure for health checks. + + :::note + This setup follows the old AWS UI for ECS as some options are missing on the latest experience. + ::: + +3. Create task definition for deploying ToolJet app as a service on your preconfigured cluster. + + 1. Select Fargate as launch type compatibility. + select launch type compatibility + + 2. Configure IAM roles and set operating system family as Linux + task definition config + + 3. Select task size to have 3GB of memory and 1vCpu + task size config + + 4. Click on add container to update container definitions + add container button + + Within the add container form that is shown: + + - Specify your container name ex: `tooljet-ce` + - Set the image you intend to deploy. ex: `tooljet/tooljet-ce:v1.26.0` + - Update port mappings at container port `3000` for tcp protocol. + container setup + + - Update container command field to be `npm,run,start:prod`. + container command + + - Specify environmental values for the container. You'd want to make use of secrets to store sensitive information or credentials, kindly refer the AWS [docs](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-secrets.html) to set it up. + + container env setup + + :::note + For the minimal setup, ToolJet requires: + `TOOLJET_HOST`, `PG_HOST`, `PG_DB`, `PG_USER`, `PG_PASSWORD`, `SECRET_KEY_BASE` & `LOCKBOX_MASTER_KEY` keys in the secret. + + Read **[environment variables reference](/docs/setup/env-vars)** + + ::: + +4. Create a service to run your task definition within your cluster. + - Select launch type as Fargate. + - Set operating system family as Linux + - Select task definition family as the one created earlier. ex: `tooljet-ce` + - Select the cluster and set the service name + - You can set the number of tasks to start with as two + - Rest of the values can be kept as default + service config + - Click on next step to configure networking options + - Select your designated VPC, Subnets and Security groups. Kindly ensure that the security group allows for inbound traffic to http port 3000 for the task. + service security group config + - Since migrations are run as a part of container boot, please specify health check grace period for 900 seconds. + - Select the application loadbalancer option and set the target group name to the one we had created earlier. This will auto populate the health check endpoints. + +:::info +The setup above is just a template. Feel free to update the task definition and configure parameters for resources and environment variables according to your needs. +::: + diff --git a/docs/versioned_docs/version-2.3.0/setup/env-vars.md b/docs/versioned_docs/version-2.3.0/setup/env-vars.md new file mode 100644 index 0000000000..3569378507 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/env-vars.md @@ -0,0 +1,301 @@ +--- +id: env-vars +title: Environment variables +--- + +# Environment variables + +Both the ToolJet server and client requires some environment variables to start running. + +## ToolJet server + +#### ToolJet host ( required ) + +| variable | description | +| ------------ | ---------------------------------------------------------------- | +| TOOLJET_HOST | the public URL of ToolJet client ( eg: https://app.tooljet.com ) | + +#### Lockbox configuration ( required ) + +ToolJet server uses lockbox to encrypt datasource credentials. You should set the environment variable `LOCKBOX_MASTER_KEY` with a 32 byte hexadecimal string. + +#### Application Secret ( required ) + +ToolJet server uses a secure 64 byte hexadecimal string to encrypt session cookies. You should set the environment variable `SECRET_KEY_BASE`. + +:::tip +If you have `openssl` installed, you can run the following commands to generate the value for `LOCKBOX_MASTER_KEY` and `SECRET_KEY_BASE`. + +For `LOCKBOX_MASTER_KEY` use `openssl rand -hex 32` +For `SECRET_KEY_BASE` use `openssl rand -hex 64` +::: + +#### Database configuration ( required ) + +ToolJet server uses PostgreSQL as the database. + +| variable | description | +| -------- | ---------------------- | +| PG_HOST | postgres database host | +| PG_DB | name of the database | +| PG_USER | username | +| PG_PASS | password | +| PG_PORT | port | + +:::tip +If you are using docker-compose setup, you can set PG_HOST as `postgres` which will be DNS resolved by docker +::: + +:::info +If you intent you use the DB connection url and if the connection does not support ssl. Please use the below format using the variable DATABASE_URL. +`postgres://username:password@hostname:port/database_name?sslmode=disable` +::: + +### Disable database and extension creation (optional) + +ToolJet by default tries to create database based on `PG_DB` variable set and additionally my try to create postgres extensions. This requires the postgres user to have CREATEDB permission. If this cannot be granted you can disable this behaviour by setting `PG_DB_OWNER` as `false` and will have to manually run them. + +#### Check for updates ( optional ) + +Self-hosted version of ToolJet pings our server to fetch the latest product updates every 24 hours. You can disable this by setting the value of `CHECK_FOR_UPDATES` environment variable to `0`. This feature is enabled by default. + +#### Comment feature enable ( optional ) + +Use this environment variable to enable/disable the feature that allows you to add comments on the canvas. + +| variable | value | +| ---------------------- | ----------------- | +| COMMENT_FEATURE_ENABLE | `true` or `false` | + +#### Multiplayer feature enable ( optional ) + +Use this environment variable to enable/disable the feature that allows users to collaboratively work on the canvas. + +| variable | value | +| -------------------------- | ----------------- | +| ENABLE_MULTIPLAYER_EDITING | `true` or `false` | + +#### Marketplace feature enable ( optional ) + +Use this environment variable to enable/disable the feature that allows users to use the [marketplace](/docs/marketplace). + +| variable | value | +| -------------------------- | ----------------- | +| ENABLE_MARKETPLACE_FEATURE | `true` or `false` | + +#### Enable ToolJet Database ( optional ) + +| variable | description | +| ----------------- | -------------------------------------------- | +| ENABLE_TOOLJET_DB | `true` or `false` | +| TOOLJET_DB | Default value is `tooljet_db` | +| TOOLJET_DB_HOST | database host | +| TOOLJET_DB_USER | database username | +| TOOLJET_DB_PASS | database password | +| TOOLJET_DB_PORT | database port | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_HOST | postgrest database host | + +Use `ENABLE_TOOLJET_DB` to enable/disable the feature that allows users to work with inbuilt data store to build apps with. Inorder to set it up, [follow the instructions here](/docs/tooljet-database#enabling-the-tooljet-database-for-your-instance). + +:::tip +When this feature is enabled, the database name provided for `TOOLJET_DB` will be utilized to create a new database during server boot process in all of our production deploy setups. +Incase you want to trigger it manually, use the command `npm run db:create` on ToolJet server. +::: + +:::info +If you intent you use the DB connection url and if the connection does not support ssl. Please use the below format using the variable TOOLJET_DB_URL. +`postgres://username:password@hostname:port/database_name?sslmode=disable` +::: + +#### Server Host ( optional ) + +You can specify a different server for backend if it is hosted on another server. + +| variable | value | +| ----------- | ------------------------------------------------------------------------------------------------- | +| SERVER_HOST | Configure a hostname for the server as a proxy pass. If no value is set, it defaults to `server`. | + +#### Disable Multi-Workspace ( optional ) + +If you want to disable Multi-Workspace feature, set the environment variable `DISABLE_MULTI_WORKSPACE` to `true`. + +### Hide account setup link + +If you want to hide account setup link from admin in manage user page, set the environment variable `HIDE_ACCOUNT_SETUP_LINK` to `true`, please make sure you have configured SMTP to receive welcome mail for users. Valid only if `DISABLE_MULTI_WORKSPACE` is not `true`. + +#### Disabling signups ( optional ) + +Sign up is enabled only if Multi-Workspace is enabled. If you want to restrict the signups and allow new users only by invitations, set the environment variable `DISABLE_SIGNUPS` to `true`. + +:::tip +You will still be able to see the signup page but won't be able to successfully submit the form. +::: + +#### Serve client as a server end-point ( optional ) + +By default, the `SERVE_CLIENT` variable will be unset and the server will serve the client at its `/` end-point. +You can set `SERVE_CLIENT` to `false` to disable this behaviour. + +#### Serve client at subpath + +If ToolJet is hosted on a domain subpath, you can set the environment variable `SUB_PATH` to support it. +Please note the subpath is to be set with trailing `/` and is applicable only when the server is serving the frontend client. + +#### SMTP configuration ( optional ) + +ToolJet uses SMTP services to send emails ( Eg: invitation email when you add new users to your workspace ). + +| variable | description | +| ------------------ | ----------------------------------------- | +| DEFAULT_FROM_EMAIL | from email for the email fired by ToolJet | +| SMTP_USERNAME | username | +| SMTP_PASSWORD | password | +| SMTP_DOMAIN | domain or host | +| SMTP_PORT | port | + +#### Slack configuration ( optional ) + +If your ToolJet installation requires Slack as a data source, you need to create a Slack app and set the following environment variables: + +| variable | description | +| ------------------- | ------------------------------ | +| SLACK_CLIENT_ID | client id of the slack app | +| SLACK_CLIENT_SECRET | client secret of the slack app | + +#### Google OAuth ( optional ) + +If your ToolJet installation needs access to data sources such as Google sheets, you need to create OAuth credentials from Google Cloud Console. + +| variable | description | +| -------------------- | ------------- | +| GOOGLE_CLIENT_ID | client id | +| GOOGLE_CLIENT_SECRET | client secret | + +#### Google maps configuration ( optional ) + +If your ToolJet installation requires `Maps` widget, you need to create an API key for Google Maps API. + +| variable | description | +| ------------------- | ------------------- | +| GOOGLE_MAPS_API_KEY | Google maps API key | + +#### APM VENDOR ( optional ) + +Specify application monitoring vendor. Currently supported values - `sentry`. + +| variable | description | +| ---------- | ----------------------------------------- | +| APM_VENDOR | Application performance monitoring vendor | + +#### SENTRY DNS ( optional ) + +| variable | description | +| ---------- | ------------------------------------------------------------------------------------------------- | +| SENTRY_DNS | DSN tells a Sentry SDK where to send events so the events are associated with the correct project | + +#### SENTRY DEBUG ( optional ) + +Prints logs for sentry. + +| variable | description | +| ------------ | ------------------------------------------- | +| SENTRY_DEBUG | `true` or `false`. Default value is `false` | + +#### Server URL ( optional) + +This is used to set up for CSP headers and put trace info to be used with APM vendors. + +| variable | description | +| ------------------ | ------------------------------------------------------------ | +| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: https://server.tooljet.com ) | + +#### RELEASE VERSION ( optional) + +Once set any APM provider that supports segregation with releases will track it. + +#### NODE_EXTRA_CA_CERTS (optional) + +Tooljet needs to be configured for custom CA certificate to be able to trust and establish connection over https. This requires you to configure an additional env var `NODE_EXTRA_CA_CERTS` to have absolute path to your CA certificates. This file named `cert.pem` needs to be in PEM format and can have more than one certificates. + +| variable | description | +| ------------------- | ------------------------------------------------------------------ | +| NODE_EXTRA_CA_CERTS | absolute path to certificate PEM file ( eg: /ToolJet/ca/cert.pem ) | + +#### Disable telemetry ( optional ) + +Pings our server to update the total user count every 24 hours. You can disable this by setting the value of `DISABLE_TOOLJET_TELEMETRY` environment variable to `true`. This feature is enabled by default. + +#### Password Retry Limit (Optional) + +The maximum retry limit of login password for a user is by default set to 5, account will be locked after 5 unsuccessful login attempts. Use the variables mentioned below to control this behavior: + +| variable | description | +| ---------------------------- | ------------------------------------------------------------------------------------------------------ | +| DISABLE_PASSWORD_RETRY_LIMIT | (true/false) To disable the password retry check, if value is `true` then no limits for password retry | +| PASSWORD_RETRY_LIMIT | To change the default password retry limit (5) | + +#### SSO Configurations (Optional) + +Configurations for instance level SSO. Valid only if `DISABLE_MULTI_WORKSPACE` is not `true`. + +| variable | description | +| ---------------------------- | -------------------------------------------------------------- | +| SSO_GOOGLE_OAUTH2_CLIENT_ID | Google OAuth client id | +| SSO_GIT_OAUTH2_CLIENT_ID | GitHub OAuth client id | +| SSO_GIT_OAUTH2_CLIENT_SECRET | GitHub OAuth client secret | +| SSO_GIT_OAUTH2_HOST | GitHub OAuth host name if GitHub is self hosted | +| SSO_ACCEPTED_DOMAINS | comma separated email domains that supports SSO authentication | +| SSO_DISABLE_SIGNUPS | Disable user sign up if authenticated user does not exist | + +## ToolJet client + +#### Server URL ( optionally required ) + +This is required when client is built separately. + +| variable | description | +| ------------------ | ------------------------------------------------------------ | +| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: https://server.tooljet.com ) | + +#### Server Port ( optional) + +This could be used to for local development, it will set the server url like so: `http://localhost:` + +| variable | description | +| ------------------- | --------------------------------------- | +| TOOLJET_SERVER_PORT | the port of ToolJet server ( eg: 3000 ) | + +#### Asset path ( optionally required ) + +This is required when the assets for the client are to be loaded from elsewhere (eg: CDN). +This can be an absolute path, or relative to main HTML file. + +| variable | description | +| ---------- | -------------------------------------------------------------- | +| ASSET_PATH | the asset path for the website ( eg: https://app.tooljet.com/) | + +#### Serve client as a server end-point ( optional ) + +By default the client build will be done to be served with ToolJet server. +If you intend to use client separately then can set `SERVE_CLIENT` to `false`. + +## PostgREST server (Optional) + +| variable | description | +| ---------------- | ----------------------------------------------- | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_DB_URI | database connection string for tooljet database | +| PGRST_LOG_LEVEL | `info` | + +If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). + +:::tip +If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + +If this parameter is not specified then PostgREST refuses authentication requests. +::: + +:::info +Please make sure that DB_URI is given in the format `postgrest://[USERNAME]:[PASSWORD]@[HOST]:[PORT]/[DATABASE]` +::: diff --git a/docs/versioned_docs/version-2.3.0/setup/google-cloud-run.md b/docs/versioned_docs/version-2.3.0/setup/google-cloud-run.md new file mode 100644 index 0000000000..d4f35ab641 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/google-cloud-run.md @@ -0,0 +1,151 @@ +--- +id: google-cloud-run +title: Google Cloud Run +--- + +# Deploying ToolJet on Google Cloud Run + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. +::: + +Follow the steps below to deploy ToolJet on Cloud run with `gcloud` CLI. + + +## Deploying ToolJet application + +1. Cloud Run requires prebuilt image to be present within cloud registry. You can pull specific tooljet image from docker hub and then tag with your project to push it to cloud registry. + + ```bash + gcloud auth configure-docker + docker pull tooljet/tooljet-ce:latest + docker tag tooljet/tooljet-ce:latest gcr.io//tooljet/tooljet-ce:latest + docker push gcr.io//tooljet/tooljet-ce:latest + ``` + + Please run the above command by launching GoogleCLI which will help to push the Tooljet application image to Google container registry. + +
+ CLI +
+ + +2. Create new cloud run service + + Select and add the pushed Tooljet application image as shown below. + +
+ tooljet-app-service +
+ +3. Ingress and Authentication can be set as shown below, to begin with. Feel free to change the security configurations as per you see fit. + +
+ ingress-auth +
+ +4. Under containers tab, please make sure the port is set 3000 and command `npm, run, start:prod` is entered in container argument field with CPU capacity is set to 2GiB. + +
+ port-and-capacity-tooljet +
+ + +5. Under environmental variable please add the below Tooljet application variables. You can also refer env variable [**here**](/docs/setup/env-vars). + + Update `TOOLJET_HOST` environment variable if you want to use the default url assigned with Cloud run after the initial deploy. + +
+ env-variable-tooljet +
+ +:::tip +If you are using [Public IP](https://cloud.google.com/sql/docs/postgres/connect-run) for Cloud SQL, then database host connection (value for `PG_HOST`) needs to be set using unix socket format, `/cloudsql/`. +::: + + +6. Please go to the connection tab. Under Cloud SQL instance please select the PostgreSQL database which you have set-up. + +
+ cloud-SQL-tooljet +
+ + +Click on deploy once the above parameters are set. + +:::info +Once the Service is created and live, to make the Cloud Service URL public. Please follow the steps [**here**](https://cloud.google.com/run/docs/securing/managing-access) to make the service public. +::: + + + + + +### Deploying ToolJet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. + +#### PostgREST server + +1. Cloud Run requires prebuilt image to be present within cloud registry. You can pull specific PostgREST image from docker hub and then tag with your project to push it to cloud registry. + + ```bash + gcloud auth configure-docker + docker pull postgrest/postgrest:v10.1.1.20221215 + docker tag postgrest/postgrest:v10.1.1.20221215 gcr.io/tooljet-test-338806/postgrest/postgrest:v10.1.1.20221215 + docker push gcr.io/tooljet-test-338806/postgrest/postgrest:v10.1.1.20221215 + ``` + + Please run the above command by launching googleCLI which will help to push the PostgREST image to Google container registry. + +
+ CLI +
+ + +2. Once the PostgREST image is pushed. Click on create service. + + Select and add the pushed PostgREST image as shown in below. + +
+ create-service-cloud-run-postgrest +
+ + +3. Ingress and Authentication can be set as shown below, to begin with. Feel free to change the security configurations as per you see fit. + +
+ ingress-auth +
+ + +4. Under containers tab, please make sure the port is set 3000 and CPU capacity is set to 1GiB. + +
+ port-and-capacity-postgrest +
+ +5. Under environmental variable please add corresponding Tooljet database env variables. You can also refer [env variable](/docs/setup/env-vars#tooljet-database). + +6. Please go to connection tab. Under Cloud SQL instance please select the PostgreSQL database which you have set-up for Tooljet application or the separate PostgreSQL database created respective to Tooljet Database from the drop-down option. + + +
+ Cloud-SQL-instance +
+ + +Click on deploy once the above parameters are set. + +:::info +Once the Service is created and live, to make the Cloud Service URL public. Please follow the steps [**here**](https://cloud.google.com/run/docs/securing/managing-access) to make the service public. +::: + + + +7. Additional Environmental variable to be added to Tooljet application or Tooljet Server connect to PostgREST server. You can also refer env variable [**here**](/docs/setup/env-vars#tooljet-database) + + +
+ env-for-tooljet +
diff --git a/docs/versioned_docs/version-2.3.0/setup/heroku.md b/docs/versioned_docs/version-2.3.0/setup/heroku.md new file mode 100644 index 0000000000..143306f9ce --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/heroku.md @@ -0,0 +1,142 @@ +--- +id: heroku +title: Heroku +--- + +# Deploying ToolJet on Heroku + + + +### Follow the steps below to deploy ToolJet on Heroku: + +1. Click the button below to start one click deployment. +
+ + [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/tooljet/tooljet/tree/main) + +
+ +2. On Heroku tab, you'll be asked to provide an `App name` and `Choose a region`. Enter the name for your deployment and select the region according to your choice. + +
+ + heroku appname + +
+ +3. Now let's enter the `Config vars` to configure additional [environment variables](/docs/setup/env-vars) that are required for the installation. + - **LOCKBOX_MASTER_KEY**: ToolJet server uses lockbox to encrypt datasource credentials. You should set the environment variable LOCKBOX_MASTER_KEY with a 32 byte hexadecimal string. If you have OpenSSL installed, you can run the command `openssl rand -hex 32` to generate the key. + - **NODE_ENV**: By default NODE_ENV is set to production. + - **NODE_OPTIONS**: Node options are configured to increase node memory to support app build. + - **SECRET_KEY_BASE**: ToolJet server uses a secure 64 byte hexadecimal string to encrypt session cookies. You should set the environment variable SECRET_KEY_BASE. If you have OpenSSL installed, you can run the command `openssl rand -hex 64` to generate the key. + - **TOOLJET_HOST**: Public URL of ToolJet installation. This is usually `https://.herokuapp.com`. + - **TOOLJET_SERVER_URL**: URL of ToolJet server installation. (This is same as the TOOLJET_HOST for Heroku deployments) + + +4. Click on `Deploy app` button at the bottom to initiate the build. + +5. After the successful build, you'll see two buttons at the bottom: `Manage App` and `View`. Click on the `View` to open the app or click on `Manage App` to configure any settings. + +
+ +heroku build + +
+ + +:::tip +ToolJet server and client can be deployed as standalone applications. If you do not want to deploy the client on Heroku, modify `package.json` accordingly. We have a [guide](/docs/setup/client) on deploying ToolJet client using services such as Firebase. +::: + + + +### Deploying Tooljet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. + +This feature is only enabled if `ENABLE_TOOLJET_DB` is set to `true` in the Tooljet application. + +#### Follow the steps below to deploy ToolJet Database on Heroku: + +:::note +Please install Heroku CLI on your local machine. Please refer Heroku CLI installation steps [**here**](https://devcenter.heroku.com/articles/heroku-cli). +::: + +1. **Create a new Heroku app using the PostgREST buildpack** + + 1.1 Create a folder with your app name. Please give a unique name to the app. + + ```bash + mkdir ${YOUR_PGRST_APP_NAME} + cd $${YOUR_PGRST_APP_NAME} + git init + ``` + + 1.2 Add PostgREST buildpack to your app. + + ```bash + heroku apps:create ${YOUR_PGRST_APP_NAME} --buildpack https://github.com/PostgREST/postgrest-heroku.git + heroku git:remote -a ${YOUR_PGRST_APP_NAME} + ``` + +2. **Attach the Tooljet app’s PostgreSQL database your Tooljet database app** + + `${HEROKU_PG_DB_NAME` Should be the name of the PostgreSQL created by the Tooljet app. + + You can get the `${HEROKU_PG_DB_NAME` of the Tooljet application from the Resources tab under Heroku Postgre attachments as shown below. (eg: `${HEROKU_PG_DB_NAME = postgresql-transparent-24158` ). + + ```bash + heroku addons:attach ${HEROKU_PG_DB_NAME} -a ${YOUR_PGRST_APP_NAME} + ``` + +
+ PostgreSQL-database +
+ + +3. **Create a Procfile** + + :::info + The Procfile is a simple text file that is named Procfile without a file extension. For example, Procfile.txt is not valid. + ::: + + Please paste the below string within the Procfile file. + + ```bash + web: PGRST_SERVER_HOST=0.0.0.0 PGRST_SERVER_PORT=${PORT} PGRST_DB_URI=${PGRST_DB_URI:-${DATABASE_URL}} ./postgrest-${POSTGREST_VER} + ``` + + +4. **Set environment variables** + + You can also refer environment variable [**here**](/docs/setup/env-vars#tooljet-database). + + :::tip + If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + + If this parameter is not specified then PostgREST refuses authentication requests. + ::: + + ```bash + heroku config:set PGRST_JWT_SECRET= + heroku config:set POSTGREST_VER=10.0.0 + ``` + + You can also refer environment variable [**here**](/docs/setup/env-vars#tooljet-database). + + +5. **Build and deploy your app** + + ```bash + git add Procfile + git commit -m "PostgREST on Heroku" + git push --set-upstream heroku main + ``` + + Your Heroku app should be live at `${YOUR_APP_NAME}.herokuapp.com`. + + +6. **Additional environment variables for Tooljet application** + + + Please enter the below env variables in the Tooljet application, under the setting tab. You can also refer environment variable [**here**](/docs/setup/env-vars#tooljet-database). diff --git a/docs/versioned_docs/version-2.3.0/setup/http-proxy.md b/docs/versioned_docs/version-2.3.0/setup/http-proxy.md new file mode 100644 index 0000000000..c52eea2e40 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/http-proxy.md @@ -0,0 +1,12 @@ +--- +id: http-proxy +title: Connecting via HTTP proxy +--- + +#### Connecting via HTTP proxy + +Server will connect to internet via the configured HTTP proxy when this environment variable is set. + +| variable | description | +| ----------------------- | ------------------------------------- | +| TOOLJET_HTTP_PROXY | used for both HTTP and HTTPS requests | diff --git a/docs/versioned_docs/version-2.3.0/setup/index.md b/docs/versioned_docs/version-2.3.0/setup/index.md new file mode 100644 index 0000000000..4e6274d6cb --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/index.md @@ -0,0 +1,12 @@ +# Setup ToolJet + +Check out the different methods you can use to deploy ToolJet on your machine + +```mdx-code-block +import {DocsCardList} from '../../../src/components/DocsCard'; +import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; + + +``` + +If you have any questions feel free to join our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) or send us an email at hello@tooljet.com. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/setup/kubernetes-aks.md b/docs/versioned_docs/version-2.3.0/setup/kubernetes-aks.md new file mode 100644 index 0000000000..9cf94982a7 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/kubernetes-aks.md @@ -0,0 +1,53 @@ +--- +id: kubernetes-aks +title: Kubernetes (AKS) +--- + +# Deploying ToolJet on Kubernetes (AKS) + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using Azure Database for PostgreSQL since this guide is for deploying using AKS. +::: + +Follow the steps below to deploy ToolJet on a AKS Kubernetes cluster. + +1. Create an AKS cluster and connect to it to start with the deployment. You can follow the steps as mentioned on the [Azure's documentation](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough-portal). + +2. Create k8s deployment + + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/AKS/deployment.yaml + ``` + +Make sure to edit the environment variables in the `deployment.yaml`. We advise to use secrets to setup sensitive information. You can check out the available options [here](https://docs.tooljet.com/docs/setup/env-vars). + +:::info +If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. +::: + +3. Create k8s service and reserve a static IP and inorder expose it via a service load balancer as mentioned in the [doc](https://docs.microsoft.com/en-us/azure/aks/static-ip). You can refer `service.yaml`. + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/AKS/service.yaml + ``` + +4. Apply YAML configs + + ```bash + kubectl apply -f deployment.yaml, service.yaml + ``` + +You will be able to access your ToolJet installation once the pods and services running. + + + +## ToolJet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars#tooljet-database) for additional environment variables configuration to be done. + +1. Setup PostgREST server + + ```bash + kubectl apply -f https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/AKS/postgrest.yaml + ``` + +2. Update ToolJet deployment with the appropriate env variables [here](https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/AKS/deployment.yaml) and apply the changes. diff --git a/docs/versioned_docs/version-2.3.0/setup/kubernetes-gke.md b/docs/versioned_docs/version-2.3.0/setup/kubernetes-gke.md new file mode 100644 index 0000000000..020b2cedda --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/kubernetes-gke.md @@ -0,0 +1,79 @@ +--- +id: kubernetes-gke +title: Kubernetes (GKE) +--- + +# Deploying ToolJet on Kubernetes (GKE) + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using Cloud SQL since this guide is for deploying using GKE. +::: + +Follow the steps below to deploy ToolJet on a GKE Kubernetes cluster. + +1. Create an SSL certificate. + +```bash +curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/certificate.yaml +``` + +Change the domain name to the domain/subdomain that you wish to use for ToolJet installation. + +2. Reserve a static IP address using `gcloud` cli + +```bash +gcloud compute addresses create tj-static-ip --global +``` + +3. Create k8s deployment + +```bash +curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/deployment.yaml +``` + +Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](https://docs.tooljet.com/docs/setup/env-vars). + +:::info +If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. +::: + +4. Create k8s service + +```bash +curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/service.yaml +``` + +5. Create k8s ingress + +```bash +curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/ingress.yaml +``` + +Change the domain name to the domain/subdomain that you wish to use for ToolJet installation. + +6. Apply YAML configs + +```bash +kubectl apply -f certificate.yaml, deployment.yaml, service.yaml, ingress.yaml +``` + +:::info +It might take a few minutes to provision the managed certificates. [Managed certificates documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs). +::: + +You will be able to access your ToolJet installation once the pods, service and the ingress is running. + + + + +## ToolJet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars#tooljet-database) for additional environment variables configuration to be done. + +1. Setup PostgREST server + + ```bash + kubectl apply -f https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/postgrest.yaml + ``` + +2. Update ToolJet deployment with the appropriate env variables [here](https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/deployment.yaml) and apply the changes. diff --git a/docs/versioned_docs/version-2.3.0/setup/kubernetes.md b/docs/versioned_docs/version-2.3.0/setup/kubernetes.md new file mode 100644 index 0000000000..31735dafff --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/kubernetes.md @@ -0,0 +1,61 @@ +--- +id: kubernetes +title: Kubernetes +--- + +# Deploying ToolJet on Kubernetes + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. +::: + +Follow the steps below to deploy ToolJet on a Kubernetes cluster. + +1. Setup a PostgreSQL database + ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. We do not have plans to support other databases such as MySQL. + +2. Create a Kubernetes secret with name `server`. For the minimal setup, ToolJet requires `pg_host`, `pg_db`, `pg_user`, `pg_password`, `secret_key_base` & `lockbox_key` keys in the secret. + + Read **[environment variables reference](/docs/setup/env-vars)** + +3. Create a Kubernetes deployment + + ```bash + kubectl apply -f https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/deployment.yaml + ``` + +:::info +The file given above is just a template and might not suit production environments. You should download the file and configure parameters such as the replica count and environment variables according to your needs. +::: + +:::info +If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. +::: + +4. Verify if ToolJet is running + + ```bash + kubectl get pods + ``` + +5. Create a Kubernetes services to publish the Kubernetes deployment that you've created. This step varies with cloud providers. We have a [template](https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/service.yaml) for exposing the ToolJet server as a service using an AWS loadbalancer. + + **Examples:** + - [Application load balancing on Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html) + - [GKE Ingress for HTTP(S) Load Balancing](https://cloud.google.com/kubernetes-engine/docs/concepts/ingress) + +:::tip +If you want to serve ToolJet client from services such as Firebase or Netlify, please read the client Setup documentation **[here](/docs/setup/client)**. +::: + +## ToolJet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars#tooljet-database) for additional environment variables configuration to be done. + +1. Setup PostgREST server + + ```bash + kubectl apply -f https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/postgrest.yaml + ``` + +2. Update ToolJet deployment with the appropriate env variables [here](https://github.com/ToolJet/ToolJet/blob/chore/main/kubernetes/deployment.yaml#L83) and apply the changes. diff --git a/docs/versioned_docs/version-2.3.0/setup/openshift.md b/docs/versioned_docs/version-2.3.0/setup/openshift.md new file mode 100644 index 0000000000..d7dc7ebe11 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/openshift.md @@ -0,0 +1,68 @@ +--- +id: openshift +title: Openshift +--- + +# Deploying ToolJet on Openshift + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. +::: + +Follow the steps below to deploy ToolJet on Openshift. + +1. Setup a PostgreSQL database ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. We do not have plans to support other databases such as MySQL. + +2. Create a Kubernetes secret with name `server`. For the minimal setup, ToolJet requires `pg_host`, `pg_db`, `pg_user`, `pg_password`, `secret_key_base` & `lockbox_key` keys in the secret. + +Read **[environment variables reference](https://docs.tooljet.com/docs/setup/env-vars)** + +3. Once you have logged into the Openshift developer dashboard click on `+Add` tab. Select import YAML from the local machine. + +:::note +When entering one or more files and use --- to separate each definition +::: + +Copy paste depolyment.yaml to the online editor + +``` +https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/openshift/deployment.yaml +``` + + +Copy paste the service.yaml to the online editor + +``` +https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/openshift/service.yaml +``` + +
+ +online yaml editor + +
+ +Once you have added the files click on create. + +:info +If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. +::: + + +4. Navigate to topology tab and use the visual connector to establish the connect between tooljet-deployment and postgresql as shown in the screenshot below. + +
+ +toplogy + +
+ +## ToolJet Database + +You can know more about tooljet database [here](https://docs.tooljet.com/docs/tooljet-database) + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](https://docs.tooljet.com/docs/setup/env-vars#tooljet-database) for additional environment variables configuration to be done. + +``` +https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/openshift/postgrest.yaml +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/setup/tooljet-subpath.md b/docs/versioned_docs/version-2.3.0/setup/tooljet-subpath.md new file mode 100644 index 0000000000..5bee3604e8 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/tooljet-subpath.md @@ -0,0 +1,21 @@ +--- +id: tooljet-subpath +title: Deploying ToolJet on a subpath +--- + +ToolJet can now be deployed at a subpath rather than the root (`/`) of a public domain. Example subpath installation URL: **`http://www.yourcompany.com/apps/tooljet`** + +You'll need to setup the following environment variables if ToolJet installation is on a domain subpath: + +| variable | value | +| -------- | ---------------------- | +| TOOLJET_HOST | the public URL ( eg: https://www.yourcompany.com ) | +| SERVE_CLIENT | By default, this variable will be unset and the server will serve the client at its `/` end-point. You can set `SERVE_CLIENT` to `false` to disable this behaviour. | +| SUB_PATH | Set a subpath to this variable. The subpath is to be set with trailing `/` and is applicable only when the server is serving the frontend client. ( eg: `/apps/tooljet/` ) | + + +:::info +See all **[Environment Variables](/docs/setup/env-vars)** here. +::: + + diff --git a/docs/versioned_docs/version-2.3.0/setup/try-tooljet.md b/docs/versioned_docs/version-2.3.0/setup/try-tooljet.md new file mode 100644 index 0000000000..00084e426b --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/try-tooljet.md @@ -0,0 +1,38 @@ +--- +id: try-tooljet +title: Try ToolJet +--- + +# Try ToolJet +## On local with Docker + +You can run the command below to have ToolJet up and running right away. + +```bash +docker run \ + --name tooljet \ + --restart unless-stopped \ + -p 80:80 \ + -v tooljet_data:/var/lib/postgresql/13/main \ + tooljet/try:latest +``` + +#### Setup information + +- Runs the ToolJet server on the port 80 on your machine. +- Container has postgres already configured within. All the data will be available in the docker volume `tooljet_data`. +- You can make use of `--env` or `--env-file` flag to test against various env configurables mentioned [here](https://docs.tooljet.com/docs/setup/env-vars). +- Use `docker stop tooljet` to stop the container and `docker start tooljet` to start the container thereafter. + +## On Play with docker + +You can deploy ToolJet on PWD for free with the one-click-deployment button below. + + + Try in PWD + + +#### Setup information + +- Open port 80 after the docker containers are up and running +- Visit the url shared on the dashboard to try out tooljet diff --git a/docs/versioned_docs/version-2.3.0/setup/v2-migration.md b/docs/versioned_docs/version-2.3.0/setup/v2-migration.md new file mode 100644 index 0000000000..f8ded40f23 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/setup/v2-migration.md @@ -0,0 +1,33 @@ +--- +id: v2-migration-guide +title: V2 migration guide +--- +# Version 2 migration guide + +ToolJet version 2 comes with a bunch of exciting features, with the major ones being: +1. Multi page +2. Multi env +3. Forms widget +4. [Database](/docs/tooljet-database) (Requires opt-in) +5. [Marketplace](/docs/marketplace) (Requires opt-in) + +Checkout the latest changelog for v2 [here](https://github.com/ToolJet/ToolJet/releases). + +## Deployment + +Based on your opted deployment method from our [setup doc](/docs/setup/), you can directly deploy v2 without any additional configuration for the default setup. + +Additional configuration are only required for the opt-in features mentioned above. You can check the respective documentation of those features for the configuration changes needed. + +:::info +Server may take some time to be ready to handle the HTTP request as v2 changes requires some data migrations for the initial deployment. This is automatically triggered as a part of the server boot. +:::: + +## Deprecations + +#### Deployments +- Docker compose deployments with [auto SSL](/docs/1.x.x/setup/docker) is deprecated + +## Help and Support +- Feel free to join our highly active **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg)** or you can also e-mail us at **hello@tooljet.com**. +- If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. diff --git a/docs/versioned_docs/version-2.3.0/tooljet_database.md b/docs/versioned_docs/version-2.3.0/tooljet_database.md new file mode 100644 index 0000000000..92549ffec2 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tooljet_database.md @@ -0,0 +1,302 @@ +--- +id: tooljet-database +title: ToolJet Database +--- + +Use the ToolJet-hosted database to build apps faster, and manage your data with ease. ToolJet database require no setup and give you a powerful user interface for managing your data. + +
+ +ToolJet Database + +
+ +## Enabling the ToolJet Database for your instance + +Requires: +- PostgREST server +- Additional configuration for ToolJet server + +This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#tooljet-database-feature-enable--optional-) is set to `true`. + +### PostgREST server + +PostgREST is a standalone web server that turns your PostgreSQL database directly into queryable RESTful APIs which is utilized for Tooljet Database. This server only talks with ToolJet server and therefore does not have to be publicly exposed. + +:::tip +If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + +If this parameter is not specified then PostgREST refuses authentication requests. +::: + +| variable | description | +| ------------------ | ----------------------------------------------- | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_DB_URI | database connection string for tooljet database | +| PGRST_LOG_LEVEL | `info` | + +:::info +Please make sure that DB_URI is given in the format `postgres://[USERNAME]:[PASSWORD]@[HOST]:[PORT]/[DATABASE]` +::: + +#### Additional ToolJet server configuration + + +| variable | description | +| ------------------ | -------------------------------------------- | +| ENABLE_TOOLJET_DB | `true` or `false` | +| TOOLJET_DB | Default value is `tooljet_db` | +| TOOLJET_DB_HOST | database host | +| TOOLJET_DB_USER | database username | +| TOOLJET_DB_PASS | database password | +| TOOLJET_DB_PORT | database port | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_HOST | postgrest database host | + + +If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). + +:::tip +When this feature is enabled, the database name provided for `TOOLJET_DB` will be utilized to create a new database during server boot process in all of our production deploy setups. +Incase you want to trigger it manually, use the command `npm run db:create` on ToolJet server. +::: + +## Features + +ToolJet database allows you to: + +- **[Maintain tables of data](#accessing-tooljet-database)** in a secure database that's only accessible within your ToolJet organization. +- **[Edit, search, filter, sort, and filter](#database-editor)** data using a spreadsheet-like interface. +- **[Quickly build applications and write queries](#querying-data-from-the-tooljet-database)** to interact with the ToolJet Database, just like any other datasource but without any setup. + +## Accessing ToolJet Database + +Once you log-in to your ToolJet account, from the left sidebar of the dashboard you can navigate to **ToolJet Database**. + +The ToolJet Database is available on: **[ToolJet Cloud](https://tooljet.com)**, **[Self-Host](/docs/setup/)**, and **Enterprise Edition**. You can view and manage your database and the data it contains using the **Database editor UI**. + +
+ +ToolJet Database editor + +
+ +## Database Editor + +You can manage the ToolJet Database directly from the Database Editor. ToolJet Database organizes the data into **tables** that can have different structures. All the tables will be listed lexicographically on the left, click on any of the table to view the table data. + +
+ +ToolJet Database editor + +
+ +### Add table + +For creating a new table in ToolJet Database, click on the **Add table** button on the top left corner of the Database editor. + +
+ +ToolJet Database editor + +
+ +When the **Add table** button is clicked, a drawer opens up from the right where you can enter the details of your new table. + +
+ +ToolJet Database editor + +
+ +#### For creating a new table, you'll need to: +- Enter a **Table name** +- Add **Columns** (Any one column is required to be set as Primary key) + +#### Supported data types +- **varchar**: varchar data type is used to store characters of indefinite length +- **serial**: serial is used to generate a sequence of integers which are often used as the Primary key of a table. +- **int**: It is a numeric data type used to store whole numbers, that is, numbers without fractional components. +- **float**: float is also a numeric data type that is used to store inexact, variable-precision values. +- **boolean**: boolean data type can hold true, false, and null values. + +Click on **Create** button to create a new table. + +
+ +ToolJet Database editor + +
+ +### Search Table + +You can enter a search term to search through all tables in the database. + +
+ +ToolJet Database editor + +
+ +### Add column + +You can add a new column to the existing table by clicking on the **Add new column** button from the top of the database editor. + +A drawer from the right will open up from where you can create a new column by entering the values for the new column such as: +- **Column name**: name of the column (key) +- **Data type**: Check available data types [here](#supported-data-types) +- **Default Value** Any default value for the column (not mandatory) + +
+ +ToolJet Database editor + +
+ +### Filter + +You can add as many filter as you want into the table by clicking on the **Filter** button present on the top of the database editor. + +#### Adding a filter on the table data +- Select a **column** from the Columns dropdown +- Choose an **[operation](#available-operations-are)** +- Enter a **value** for the selected operation + +#### Available operations are: +- **equals** +- **greater than** +- **greater than or equal** +- **less than** +- **less than or equal** +- **not equal** +- **like** +- **ilike** +- **match** +- **imatch** +- **in** +- **contains** +- **contained** +- **not** + +
+ +ToolJet Database editor + +
+ +### Sort + +To sort the table data, click on the **Sort** button on top, select a **column** from the dropdown, and then choose an order **ascending** or **descending**. + +
+ +ToolJet Database editor + +
+ +### Add new row + +To add a new row to the existing table data, click on the **Add new row** button. A drawer will open from the right where you can **enter the values** for the new row. + +
+ +ToolJet Database editor + +
+ +### Edit row + +To edit the rows from the ToolJet database dashboard, click on the **Edit row** button. A drawer will open from the right from where first you need to **select the id** of the row to be edited from the dropdown and then you can edit the cell values of the selected row. + +
+ +ToolJet Database editor + +
+ +### Delete records + +To delete one or many records/rows, select on the checkbox at the right of the record or records that you want to delete. As soon as you select a single record, the button to delete record will appear on the top, click on the **Delete record** button to delete the selected records. + +
+ +ToolJet Database editor + +
+ +### Delete column + +To delete a particular column, just click on the column name and the **delete** button will appear, click on it to delete the column. + +
+ +ToolJet Database editor + +
+ +### Edit or Delete a table + +When you click on the kebab menu (three vertical dots icon) on the right of the table name, you'll get two options: Edit and Delete. +- **Edit** will allow you to rename the table +- **Delete** will allow you to delete the table permanently + +
+ +ToolJet Database editor + +
+ +## Querying data from the ToolJet database + +Querying ToolJet database is as easy as querying any other datasource on ToolJet. + +- Go to the **query panel**, and click on the **+Add** button to add a new query, and select **Run ToolJetDb query** +
+ + ToolJet Database editor + +
+ +- Enter the **Name** of the table that you want to query, select an **Operation** from the dropdown, **Create** the query, and then **Run** the query to get the response. +
+ + ToolJet Database editor + +
+ +:::info +- **Preview** button on the query panel returns the query response without executing the query. Once clicked, the response will be displayed on the Preview section of the query panel which can be viewed in JSON or Raw. +- When a new query is created, by default the query name is set to `tooljetdbN` (where N is a number) - you can rename the query by click on the query name or from the left sidebar of query panel. +::: + +### Available operations + +#### List rows +This operation returns the list of all the records in the table + +#### Optional parameters +- **Filter**: Add a filter to the query response by setting a column, operation and value. +- **Sort**: Add a sort to the query response by setting a column and direction. +- **Limit**: Limit the query response. This parameter expects a numerical value. ex: 5 + +#### Create row +This operation creates a new record in the table + +#### Required parameters +- **Columns**: Choose a column from the dropdown and enter a value for the new record. + +#### Update row +This operation updates an existing record in the table + +#### Required parameter +- **Filter**: Add a condition by choosing a column, an operation, and the value for updating a particular record. + +#### Delete row +This operation deletes a record from the table + +#### Required parameters +- **Filter**: Add a condition by choosing a column, an operation, and the value for deleting a particular record. + +:::info +If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com)** +::: diff --git a/docs/versioned_docs/version-2.3.0/tracking.md b/docs/versioned_docs/version-2.3.0/tracking.md new file mode 100644 index 0000000000..6033e14f19 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tracking.md @@ -0,0 +1,23 @@ +--- +id: tracking +title: Tracking +slug: /tracking +--- + +# Tracking + +:::tip +ToolJet does not store any data fetched from the data sources. ToolJet acts as a proxy and the data from data sources is sent to the client application without storing. +::: + +## Server + +:::tip +Self-hosted version of ToolJet pings our server to fetch the latest product updates every 24 hours. You can disable this by setting the value of `CHECK_FOR_UPDATES` environment variable to `0`. This feature is enabled by default. +::: + +## Client + +ToolJet tracks anonymous usage data such as page loads and clicks. ToolJet tracks only the events and doesn't capture data from data sources. + +Tracking can be disabled by setting the value environment variable `ENABLE_TRACKING` to `0`. diff --git a/docs/versioned_docs/version-2.3.0/tutorial/_category_.json b/docs/versioned_docs/version-2.3.0/tutorial/_category_.json new file mode 100644 index 0000000000..1ed20f00b1 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tutorial", + "position": 4, + "collapsed": false +} diff --git a/docs/versioned_docs/version-2.3.0/tutorial/actions.md b/docs/versioned_docs/version-2.3.0/tutorial/actions.md new file mode 100644 index 0000000000..92586941e0 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/actions.md @@ -0,0 +1,31 @@ +--- +id: actions +title: Adding actions +--- + +# Adding actions + +ToolJet supports several actions that can be invoked as the handler for any `event` that is triggered in an application. + +## To add actions + +To attach an action for component events, click on the component's handle, and then click on the `Add handler` button on the +inspector panel available on the right side. + +To attach an action for query events, select the query, go to the `advanced` tab and then click on the `Add handler` button. + +## Available actions + +Some of the actions that ToolJet Support are + + Action| Description| + ----| ----------- | + Show alert | Show an alert message as a bootstrap toast | + Run query | Run any of the data queries that you have created | + Open webpage | Go to another webpage in a new tab | + Goto app | Go to another ToolJet application | + Show modal | Open any modal that you've added | + Close modal | Close any modal that you've added if its already open | + Copy to clipboard | Copy any available text that you see on the application to clipboard | + Set localStorage | Set a key and corresponding value to localStorage | + Generate file | Construct file using data available in your application and let the user download it | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/tutorial/adding-a-datasource.md b/docs/versioned_docs/version-2.3.0/tutorial/adding-a-datasource.md new file mode 100644 index 0000000000..a8e2d9fb8e --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/adding-a-datasource.md @@ -0,0 +1,36 @@ +--- +id: adding-a-datasource +title: Adding a data source +--- + +# Adding a data source + +:::tip +The data sources are created on app level and not on workspace level. +::: + +**Datasource manager** is on the left-sidebar of the app builder. To add a new data source, click on the
`Add datasource` button. + + +adding datasource + + +You will be prompted to select the data source that you wish to add. Let's select PostgreSQL for this tutorial. You will then need to provide the credentials of your PostgreSQL database. The fields that are marked as `encrypted` will be encrypted before saving to ToolJet's database. + +
+ +![ToolJet - Tutorial - Adding a data source](/img/tutorial/adding-datasource/datasources.png) + +
+ +The name of the data source must be unique (within the app) and can be changed by clicking on the data source name at the top of the prompt. Click on `Test Connection` button to verify the connection, this might take a couple of minutes. Once verified, save the data source. + +:::tip +If you are using ToolJet cloud and if your data source is not publicly accessible, please white-list our IP address ( shown while creating a new data source ). +::: + +
+ +postgre add datasource + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/tutorial/adding-widget.md b/docs/versioned_docs/version-2.3.0/tutorial/adding-widget.md new file mode 100644 index 0000000000..f1e69e62ee --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/adding-widget.md @@ -0,0 +1,66 @@ +--- +id: adding-widget +title: Adding a widget +--- + +# Adding a widget + +To add a widget, navigate to the `Widget manager` on the right sidebar. It will display the list of built-in widgets that can be added to the app. Use the search functionality to quickly find the widget that you want. + +widget + +## Drag and drop a widget + +Let's add a `table` widget to the app to show the customer data from the query that we created in the previous steps. +To add a widget, drag and drop the widget to the canvas. + +## Resize a widget + +The widgets can be resized and repositioned within the canvas. + +resize + +## Adding widgets to Modal + +To add a widget to Modal, we need to trigger [Show modal action](/docs/tutorial/actions#available-actions) + +:::info +Before triggering `Show modal action` we need to add a modal widget to the canvas. +::: + +- Add a `modal widget` to the app +- Trigger the **Show modal action** +- Click on the canvas area for the `Widget manager` sidebar +- Navigate to the Widget manager on the right sidebar and Drag and drop a widget into the Modal + +adding-widget + +## Resize table columns + +We can resize the column width using the resize handle of the column. + +resize-table-column + +## Change widget properties + +Click on the widget to open the inspect panel on right sidebar. Here you can change the properties of the widgets. Let's configure the table columns to display the customer data. The display order of columns can be changed by dragging icon near the column name. + +inspect panel + +## Connecting data with widget + +Now we will connect the `data` object of the `fetch customers` query with the table. Click on the table widget to open the inspector on the right sidebar. We can see that the data property of the table has an empty array as the value. The data field, like almost every other field on the editor supports single-line javascript code within double brackets. Variable suggestions will be shown as a dropdown while you type the code in the field. + +Let's select the `data` object of the 'postgresql' query. + +` {{queries.postgresql1.data}}` + +Since we have already run the query in the previous step, the data will be immediately displayed in the table. + +table data + +So far in this tutorial, we have connected to a PostgreSQL database and displayed the data on a table. + +:::tip +Read the widget reference of table [here](/docs/widgets/table) for more customizations such as server-side pagination, actions, editing data. +::: diff --git a/docs/versioned_docs/version-2.3.0/tutorial/app-menu-options.md b/docs/versioned_docs/version-2.3.0/tutorial/app-menu-options.md new file mode 100644 index 0000000000..65425b0782 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/app-menu-options.md @@ -0,0 +1,69 @@ +--- +id: app-menu-options +title: App menu options +--- + +# App menu options + +Options that are available in the overflow menu of the app card are: + +- **[Change Icon](#change-icon)** +- **[Add to folder](#add-to-folder)** +- **[Clone app](#clone-app)** +- **[Export app](#export-app)** +- **[Delete app](#delete-app)** + +
+ +App menu options + +
+ +## Change Icon + +The icon on the app cards can be customised by selecting the `Change Icon` option. + +
+ +App menu options + +
+ +## Add to folder + +ToolJet allows you to create folders (`+ Create new folder` from the left sidebar) on the dashboard, and any application can be added to these folders. + +
+ +App menu options + +
+ +## Clone app + +Any application created on ToolJet can be cloned using the `Clone app` option. The cloned application is the exact copy of the original app except that the user will have to re-enter the datasource credentials in cloned app. + +## Export app + +Export app option will allow the users to download `JSON` file with all the information about your application(excluding credentials). This JSON file can be used to import this application to the same or other workspace. + +Users get the option to export: +- the currently released version +- a particular version from list latest version to oldest version +- all versions + +
+ +App menu options + +
+ +## Delete app + +Use this option to complete remove the app from the workspace. + +
+ +App menu options + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/tutorial/building-queries.md b/docs/versioned_docs/version-2.3.0/tutorial/building-queries.md new file mode 100644 index 0000000000..9598c2f9da --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/building-queries.md @@ -0,0 +1,53 @@ +--- +id: building-queries +title: Building Queries +--- + +# Building Queries + +Query Editor lives at the bottom of the page. We will now build a query for the PostgreSQL datasource that we connected in the previous step. + +:::tip +You can click on the 'enlarge' icon to enlarge query editor pane. +::: + +- Click on the `+` icon of the query editor to create a new query. +- Select the PostgreSQL datasource created in previous step. +- Copy the query given below and paste on the query area. +- Select SQL mode + +```sql +SELECT * FROM customers; +``` + + +query + + +Query results can be previewed by clicking the `preview` button. Previewing queries will not alter the state of the app. + + +preview + + + +## Advanced options + + +advanced options + + +#### Run query on page load +If this option is enabled, the query will be run when the app is loaded for the first time. The queries can have more than one trigger, ie the same query can later be triggered again using a button's click event or table's row selected event or any other events. + +#### Request confirmation before running query +Enable this option to show a prompt to confirm the action before a query is run. The confirmation prompt will look like this: + +
+ +confirm + +
+ +#### Show notification on success +Enable this option to show a custom message on query completion. Duration of the notification can also be set. diff --git a/docs/versioned_docs/version-2.3.0/tutorial/creating-app.md b/docs/versioned_docs/version-2.3.0/tutorial/creating-app.md new file mode 100644 index 0000000000..08d97e2496 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/creating-app.md @@ -0,0 +1,31 @@ +--- +id: creating-app +title: Creating new app +--- + +# Creating new app + +:::info +Apps in ToolJet binds the widgets, data sources and queries together. +::: + +This tutorial will walk you through building a simple app to fetch customer information from a PostgreSQL database and display the data using the table widget. +To create a new ToolJet app, click on the **'Create new application'** button on the ToolJet dashboard. + + +dashboard create new app + + +You will be redirected to the visual app editor once the app has been created. Create the first version of your app to start building. The name of the app can be changed by clicking on the app name at top-left of the app builder. + +
+ +![ToolJet - Creating an app](/img/tutorial/creating-new-app/visual-app-editor.png) + +
+ +The main components of an app: + +- **[Widgets](https://docs.tooljet.com/docs/tutorial/adding-widget)** - UI components such as tables, buttons, dropdowns. +- **[Data sources](https://docs.tooljet.com/docs/tutorial/adding-a-datasource)** - ToolJet can connect to databases, APIs and external services to fetch and modify data. +- **[Queries](https://docs.tooljet.com/docs/tutorial/building-queries)** - Queries are used to access the connected data sources. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/tutorial/debugger.md b/docs/versioned_docs/version-2.3.0/tutorial/debugger.md new file mode 100644 index 0000000000..bc61761ba4 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/debugger.md @@ -0,0 +1,19 @@ +--- +id: debugger +title: Debugger +--- + +# Debugger + +The debugger captures errors that happens while running the queries. For example, when a database query fails due to the unavailability of a database or when a REST API query fails due to an incorrect URL, the errors will be displayed on the debugger. The debugger also displays relevant data related to the error along with the error message. Debugger is located on the left-sidebar. + + +debugger + + + +## Pin Debugger +You can click on the `pin` icon at the top-right corner of the debugger if you do not want the debugger to close. The debugger will remain open until it is unpinned. + + +pinned debugger diff --git a/docs/versioned_docs/version-2.3.0/tutorial/keyboard-shortcuts.md b/docs/versioned_docs/version-2.3.0/tutorial/keyboard-shortcuts.md new file mode 100644 index 0000000000..f534298ff4 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/keyboard-shortcuts.md @@ -0,0 +1,122 @@ +--- +id: keyboard-shortcuts +title: Keyboard Shortcuts +--- + +# Keyboard Shortcuts + +You can perform operations like undo, redo, clone, or removing the widget directly using the keyboard shortcuts. + +## Copy + +You can copy the component on the visual app editor using the following shortcut keys: + +**On Mac:** `cmd + c` + +**On Linux/Windows:** `ctrl + c` + +
+ +Copy + +
+ +## Cut + +You can cut the component on the visual app editor using the following shortcut keys: + +**On Mac:** `cmd + x` + +**On Linux/Windows:** `ctrl + x` + +
+ +Cut + +
+ +## Paste + +You can paste the selected component using the following shortcut keys: + +**On Mac:** `cmd + v` + +**On Linux/Windows:** `ctrl + v` + +
+ +Paste + +
+ +:::caution +There are few edge cases when copy-paste commands might not work: +- The URL should be `https` and it won't work on http on many browsers +- Recent Firefox versions has some issue with copy functionality +::: + +## Undo + +You can undo any operation performed on the visual app editor using the following shortcut keys: + +**On Mac:** `cmd + z` + +**On Linux/Windows:** `ctrl + z` + +
+ +Undo + +
+ +## Redo + +If you have `undo` an operation and want to redo that again than you can use the following shortcut keys: + +**On Mac:** `cmd + shift + z` + +**On Linux/Windows:** `ctrl + shift + z` + +
+ +Redo + +
+ +## Clone + +Now you can create multiple clones of any widget without having to drag and drop the widget again from the sidebar. Just select any widget that you want to create a clone and use the following shortcut keys: + +**On Mac:** `cmd + d` + +**On Linux/Windows:** `ctrl + d` + +
+ +Clone + +
+ +## Remove widget + +Now you can delete a selected widget by using the following shortcut keys: + +**On Mac:** `delete` + +**On Linux/Windows:** `backspace` + +
+ +Remove + +
+ +## Unselect the selected widget + +You can quickly deselect a widget using the `esc` key. + +
+ +Unselect + +
diff --git a/docs/versioned_docs/version-2.3.0/tutorial/manage-users-groups.md b/docs/versioned_docs/version-2.3.0/tutorial/manage-users-groups.md new file mode 100644 index 0000000000..95991fd7fa --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/manage-users-groups.md @@ -0,0 +1,184 @@ +--- +id: manage-users-groups +title: Managing Users and Groups +--- + +# Managing Users and Groups + +## Managing Users + +Admin of a workspace can add users to the workspace. To manage the users in your workspace, just go to the **Workspace Settings** from the left sidebar on the dashboard and click on the **Users** option. + +
+ +Manage Users + +
+ +### Inviting users + +Admins can invite anyone to a workspace using the email address. To invite a user: + +- On the **Users** page click on the `Invite new user` button. +
+ + Manage Users + +
+ +- Now enter the details of new user such as first name, last name, email, and then click on the **Create User**. +
+ + add new user + +
+ + +- An email including the **Invite Link** to join your workspace will be send to the created user. The status will turn from **invited** to **active** after the user successfully joins your workspace using the invite link. + + :::tip + You can also copy the invitation url by clicking on the copy icon next to `invited` status of the created user. + ::: + +
+ + add new user + +
+ +:::tip +You can also **Bulk Invite Users** by editing and uploading the sample CSV file including all the users details. +
+ +add new user + +
+::: + +### Disabling a user's access + +You can disable any active user's access to your workspace by clicking on the **Archive** button and the status of the user will change from **active** to **archived**. + +
+ +archived + +
+ +### Enabling a user's access + +Similar to archiving a user's access, you can enable it again by clicking on **Unarchive**. The status of user will change from **archived** to **invited** and the user will have to join again using the invite link received via the e-mail. + +
+ +status + +
+ +## Managing Groups + +On ToolJet, Admins can create groups for users added in a workspace and grant them access to particular app(s) with specific permissions. To manage groups, just go to the **Workspace Settings** from the left-sidebar of the dashboard and click on the **Groups**. + +
+ +Manage Groups + +
+ +### Group properties + +Every group on ToolJet has three sections: + +#### Apps: + +Admins can add or remove any number of apps for a group of users. To add an app to a group, select an app from the dropdown and click on `Add` button next to it. You can also set app permissions such as `View` or `Edit` for the group. You can set different permissions for different apps in a group. + +
+ +apps + +
+ +#### Users: + +Admins can add or remove any numbers of users in a group. Just select a user from the dropdown and click on `Add` button to add it to a group. To delete a user from a group, click on `Delete` button next to it. + +
+ +users + +
+ +#### Permissions: + +Admins can set granular permission like creating/deleting apps or creating folder for a group of users. + +
+ +permissions + +
+ +:::tip +All the activities performed by any Admin or any user in a workspace is logged in `Audit logs` - including any activity related with managing users and groups. +::: + +### Predefined Groups + +By default, every workspace will have two User Groups: + +**1. All Users** + +This group contains all the users and admins. + +| Apps | Users | Permissions | +| ----------- | ----------- | ----------- | +| You can add or remove apps. | Modification is disabled. This group will have all the users and admins added in a workspace. | You can edit permissions for all the users globally. | + +
+ +all users + +
+ +**2. Admin** + +This group contains admins by default. Admins can add more admins or remove the users in this group. + +| Apps | Users | Permissions | +| ----------- | ----------- | ----------- | +| Modification is disabled. By default, this group has `Edit` permission for all the apps in a workspace | Admins can add or remove users in this group. | Modification is disabled. By default, all the admins can create and delete apps or create folders. | + +
+ +admin + +
+ +### Creating new group + +- Click on `Create new group` button in the **User Groups** page. +
+ + new group + +
+ +- Enter a name for the group and click `Create Group` button. +
+ + new group 2 + +
+ +- Once the group is created, you can add **Apps**, **Users** and set their **Permissions** for that group. + +### Deleting a group + +To delete a group, click on `Delete` next to it. It will confirm whether you want to delete it or not, Click on `Yes` to delete the group. + +
+ +delete group + +
diff --git a/docs/versioned_docs/version-2.3.0/tutorial/mobile-layout.md b/docs/versioned_docs/version-2.3.0/tutorial/mobile-layout.md new file mode 100644 index 0000000000..6d53baf5fe --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/mobile-layout.md @@ -0,0 +1,26 @@ +--- +id: mobile-layout +title: Mobile layout +--- + +# Mobile layout + +Mobile layout is activated when the width of the window is less than 600px. + +:::tip +Widgets can be shown on desktop, mobile, or both. +::: + + +mobile layout + + +## Adding existing widget to mobile layout +Click on the widget to open inspector. Scroll down to the `layout` section and enable mobile layout. The width of the widget will be adjusted to fit the mobile layout. + +## Adding a new widget to mobile layout +Switch the layout to mobile by clicking the button on the top navigation bar. Drag and drop a widget to the canvas. This widget will not be shown on desktop layout unless enabled from the widget inspector via the "Show on desktop" button manually. + +:::tip +Width of the widgets will be automatically adjusted to fit the screen while viewing the application in app viewer. +::: diff --git a/docs/versioned_docs/version-2.3.0/tutorial/multiworkspace.md b/docs/versioned_docs/version-2.3.0/tutorial/multiworkspace.md new file mode 100644 index 0000000000..84719881ea --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/multiworkspace.md @@ -0,0 +1,49 @@ +--- +id: multiworkspace +title: Multi-Workspace +--- + +# Multi-Workspace + +User can create their own workspaces, user who created workspace will be having admin privileges for the workspace. + +
+ +multi workspace + +
+ +## Hierarchy + +
+ +tooljet workspace + +
+ +## Permissions + +:::tip +Please check the detailed doc on **[Permissions](/docs/org-management/permissions)**. +::: + +- The administrator can manage [users and groups](/docs/tutorial/manage-users-groups) of each workspace +- Applications and settings can not be shared between workspaces +- A user authorised to login to Tooljet will not have access to all workspaces, Usesr should be invited or signed up to a workspace to log-in to it. + +## Enabling Multi-Workspace + +Set environment variable **DISABLE_MULTI_WORKSPACE** value to **false** to enable the feature, and **true** to disable it. + +### When enabled + +- When Multi-Workspace feature is enabled, user should login with username and password to log in to Tooljet. +- Administrator can configure authentication methods for their workspaces. +- If password login is enabled, switching to the workspace will happen without any other authorization since the user is already authorized with password login. +- User logged in to Toojet and trying to switch to a workspace where SSO is enabled and password login is disabled, will be redirected to workspace login page and enabled SSO options will be shown +- User can directly login to a workspace using workspace login URL, Administrator can view the URL **Manage SSO -> General Settings -> Login URL**. + +### When disabled + +- If Multi-Workspace is disabled, Create workspace feature won’t be available. +- No separate login page for workspace and SSO configured for the workspace will be reflected to the main login page/login. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/tutorial/pages.md b/docs/versioned_docs/version-2.3.0/tutorial/pages.md new file mode 100644 index 0000000000..f492fcb32c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/pages.md @@ -0,0 +1,205 @@ +--- +id: pages +title: Pages +--- + +Pages allows you to have multiple pages in a single application, making your ToolJet applications more robust and user-friendly. + +
+ +Multi-page app + +
+ +## Pages Panel + +You can open the **Pages Panel** by clicking on the **Pages** icon on the left sidebar of the app-builder. + +
+ +Pages Panel + +
+ +## Panel Options + +- **[Add Page](#add-page)** +- **[Settings](#settings)** +- **[Pin](#pin)** +- **[Search](#search)** + +### Add Page + +On the header of the Pages Manager, the **+** button that allows you to add more pages to your application + +
+ +Pages Panel + +
+ +On clicking the **+** button, a new page will be added, enter the name for the page and press enter. +
+ +Pages Panel + +
+ +### Settings + +From **Settings**, you can hide the **page navigation sidebar** in viewer mode, by enabling the **Disable Menu** option. +
+ +Pages Panel + +
+ +### Pin + +You can pin the pages panel from the **Pin** button and the panel won't close until you **unpin** it. +
+ +Pages Panel + +
+ +### Search + +If there are many pages on the panel then you can use the **Search bar** to look for specific page. +
+ +Pages Panel + +
+ +## Page options + +There are several options available for a Page. To use these options, click on the kebab menu on the right of the page card. + +- **[Page Handle](#page-handle)** +- **[Rename](#rename)** + +- **[Mark Home](#mark-home)** +- **[Hide Page](#hide-page)** +- **[Delete Page](#delete-page)** +- **[Event Handlers](#event-handlers)** + +
+ +Pages Panel + +
+ +### Page Handle + +Page Handle is the slug that is added at the end of the application URL. Page Handle get its default value when the page name is entered on the creation of the page. You can change the Page Handle from this option. + +
+ +Pages Panel + +
+ +### Rename + +Rename option will allow you to rename the page. + +
+ +Pages Panel + +
+ + + +### Mark Home + +Mark home option can be used to make a page the default landing page of the application, so whenever the app will be loaded the page that is marked home will be loaded. + +
+ +Pages Panel + +
+ +:::info +The page which is marked home will have a **Home** icon on the left of the Page Card. +
+ +Pages Panel + +
+::: + + +### Hide Page + +Hide Page option can be used to hide a page from the **page navigation sidebar** in viewer mode. + +
+ +Pages Panel + +
+ +:::info +If a page is hidden then you'll see an **eye** icon on the right of the card. +
+ +Pages Panel + +
+::: + +You can go to the options again and **unhide** the app from the **page navigation sidebar** + +
+ +Pages Panel + +
+ + +### Delete Page + +You can **delete** a page from an application using this option. + +
+ +Pages Panel + +
+ +:::info +If a page is **Marked Home** then you won't be able to delete and the delete page option will be disabled. +
+ +Pages Panel + +
+::: + +### Event Handlers + +Just like other Event Handlers on ToolJet, you can add event handlers too pages too. + +Currently, there is **On page load** event available. You can use all the available actions for this event along with the new actions added specifically for the pages: +- **[switch page](/docs/actions/switch-page)** +- **[set page variable](/docs/actions/set-page-variable)** +- **[unset page variable](/docs/actions/unset-page-variable)** + +
+ +Pages Panel + +
diff --git a/docs/versioned_docs/version-2.3.0/tutorial/sharing-and-deploying.md b/docs/versioned_docs/version-2.3.0/tutorial/sharing-and-deploying.md new file mode 100644 index 0000000000..4931337d82 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/sharing-and-deploying.md @@ -0,0 +1,55 @@ +--- +id: sharing-and-deploying +title: Preview and Sharing Apps +--- + +# Preview and Sharing Apps + +## Preview + +Clicking on `Preview` will open up the currently opened version of the app in the new tab. This is useful if you want to immediately check the app in production. + + +preview + +## Sharing an app + +Once you have released a version of your app, you can share the app with others using a customised url. To share an app: + +- Click on the **Share** button on the top-right corner + +
+ + +share + + +
+ +- In the dialog box, turn on the toggle switch to `Make the application public` and shareable + +
+ + +toggle + + +
+ +- Create your own `customised URL` for the app and click on `copy` to copy the URL + +
+ +url + + +
+ +- You can also `Embedd` your application using the embeddable link + +
+ +embed + + +
diff --git a/docs/versioned_docs/version-2.3.0/tutorial/transformations.md b/docs/versioned_docs/version-2.3.0/tutorial/transformations.md new file mode 100644 index 0000000000..deca9fad6f --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/transformations.md @@ -0,0 +1,93 @@ +--- +id: transformations +title: Transformations +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Transformations + +Transformations can be enabled on queries to transform the query results. ToolJet allows you to transform the query results using two programming languages: + +- **[JavaScript](#transform-using-javascript)** +- **[Python](#transform-using-python)** + +:::caution +- Every transformation is scoped to the query it's written for. +- Actions and CSA(Component Specific Actions) cannot be called within the transformation, they can only be called within **[RunJS](/docs/data-sources/run-js)** query or **[RunPy](/docs/data-sources/run-py)** query. +::: + +## Transform using JavaScript + +Let's assume a query is returning the customers data with a `name` row, so we will write a simple transformation to compute `first_name` and `last_name` for all the customers. + +```javascript +// write your code here +// return value will be set as data and the original data will be available as rawData +return data.map((row) => { + return { + ...row, + first_name: row.name.split(' ')[0], + last_name: row.name.split(' ')[1], + }; +}); +``` + +The query will now look like this: + +
+ +Transformation + +
+ +## Transform using Python + +Let's use Python transformation to compute `first_name` and `last_name` for all the customers that we fetch in the previous step. + +```python +return list(map(lambda row: { + **row, + 'first_name': row['name'].split(' ')[0], + 'last_name': row['name'].split(' ')[1], +}, data)) +``` + +#### Example + +- Let's take a look at the data returned by a RESTAPI (using mock data here): +
+ + raw data + +
+ +- Now we will transform the returned data using Python that will append a new key in the returned data called `user` and that user will have the value from the exposed global variables of ToolJet which is `globals.currentUser.email` + ```python + return list(map(lambda item: {**item, "user": f"{globals['currentUser']['email']}"}, data)) + ``` + +- Now, you can click on the preview button to check the transformed data. +
+ + raw data + +
+ +--- + +Click the `Save` button to create the query. Saved queries can be run using the `Run` button on the top-right of query panel. Queries run using the run button will behave just as if it was triggered by an app event like button click and thus will alter the state of the app. You can view the query results using the state inspector on the left side-bar of the app builder. + +
+ +result + +
+ +We can see that `first_name` and `last_name` are added to all the rows in the `data` object of the query. If you need the original data of the query, it will be available in the `rawData` object of the query. + +
+ +raw data + +
diff --git a/docs/versioned_docs/version-2.3.0/tutorial/versioning-and-release.md b/docs/versioned_docs/version-2.3.0/tutorial/versioning-and-release.md new file mode 100644 index 0000000000..06ff52467a --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/versioning-and-release.md @@ -0,0 +1,67 @@ +--- +id: versioning-and-release +title: Versioning and Release +--- + +# Versioning and Release + +Versioning and Release lets you version control your apps and release app changes to the users. + +## Versioning + +Versioning is really useful if multiple developers are working on an app, it allows them to save their own version of the app. This also prevents developers from overwriting the other developer's work. + +### Creating a Version + +You can create new versions from **App Version Manager** on the top-right corner. It displays the version of the app that you're currently working and can be used to switch between the different version of the app. To create a new version: + +- Go to the **App Version Manager** from the toolbar and click on the dropdown. It will display all the versions of the app that have been created. +
+ + app version + +
+ +- Click on **Create Version** and a modal will pop-up. Enter a **Version Name** and click on **Create version from** dropdown that will include all the versions of the app, choose a version that you want to use for your new version and then click on `Create Version`. +
+ + modal + +
+ +## Release + +Making a release let's you publish the app and push the changes to production. + +### Releasing a version + +To release a version: + +- Go to the **App Version Manager** and select the `version` from the dropdown that you want to release. +
+ + version dropdown + +
+ +- Click on the `Release` button on the top-right corner. +
+ + release + +
+ + +:::tip +ToolJet will block editing of the `Released version` of an app and will display a prompt to create a new version to make the changes. This is to prevent accidentally pushing an unfinished app to the live version. +
+ +release + +
+::: + + + + + diff --git a/docs/versioned_docs/version-2.3.0/tutorial/workspace-environment-variables.md b/docs/versioned_docs/version-2.3.0/tutorial/workspace-environment-variables.md new file mode 100644 index 0000000000..b7675e4f01 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/tutorial/workspace-environment-variables.md @@ -0,0 +1,65 @@ +--- +id: workspace-environment-variables +title: Workspace Variables +--- + +Workspace Variables are the variables with some value(usually tokens/secret keys/API keys) that can be used in different apps across the same Workspace. + +## How can we add these variables to an Workspace? + +Suppose there is an `API key` or a value that you want to use in the queries or widgets in the multiple apps of the same Workspace then the Workspace admin or the user with permissions can add an environment variable. + +#### Adding the environment variable +- Go to the ToolJet Dashboard, and click on the dropdown on the navigation bar to show `Workspace` options +- Select `Manage Environment Variables` +- Click on `Add New Variable` button +- Give a `Name` to the variable, set the value, choose `Type`, toggle `Encryption`, and click **Add Variable** button +- Now this variable can be used inside any application of this Workspace + +
+ +add variable + +
+ +### Types of variables + +- **Client**: The client variable can be used in widgets and queries. + +- **Server**: The server variables can be used with all the queries except the `RunJS`. The reason why we don't allow the server variables to be used with the widgets is that these variables are only resolved during the runtime so they're highly secured. + +:::info +Variable Type cannot be changed once it has been created. +::: + +
+ +variable-type + +
+ +### Encryption + +This feature enables us to add a client variable with and without `encryption`. The server variables are always encrypted by default. + +### Using variable in an app + +Let's use the variable that we created [here](Workspace-environment-variables#adding-the-environment-variable). If you have used ToolJet before, then you know that for getting the values from any variable we use JS notation i.e. `{{}}` but for using the Workspace variables we have different opening and closing notation `%% %%`. The environment variables will not work inside js code `{{}}`. + +So, the syntax for using the variable that we created before will be `%%client.pi%%` + +**Example for client variable usage:** + +
+ +variable-usage + +
+ +**Example for server variable usage:** + +
+ +server-variable-usage + +
diff --git a/docs/versioned_docs/version-2.3.0/user-authentication/general-settings.md b/docs/versioned_docs/version-2.3.0/user-authentication/general-settings.md new file mode 100644 index 0000000000..e0e6098e43 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/user-authentication/general-settings.md @@ -0,0 +1,38 @@ +--- +id: general-settings +title: General Settings +--- + +# Single Sign-On General Settings + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
+ + General Settings: SSO + +
+ +- Select `SSO` from sidebar and then select **General Settings** +
+ + General Settings: SSO + +
+ +## Enable Signup + +You can enable/disable `Enable signup`. If it is enabled, new account will be created for user's first time SSO sign in else only existing users will be allowed to sign in via SSO. + +## Allowed domains + +You can set allowed domains for SSO login, can add multiple domains comma separated. Allowed all domains by default. + +## Login URL + +You can use the login URL to login directly to the workspace. This will be hidden if Multi-Workspace is disabled. + +
+ +General Settings: SSO + +
diff --git a/docs/versioned_docs/version-2.3.0/user-authentication/password-login.md b/docs/versioned_docs/version-2.3.0/user-authentication/password-login.md new file mode 100644 index 0000000000..8dfb6e405f --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/user-authentication/password-login.md @@ -0,0 +1,32 @@ +--- +id: password-login +title: Password Login +--- + +# Password Login + +Password login is enabled by default for all workspaces. User with admin privilege can enable/disable it. + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
+ + General Settings: SSO + +
+ +- Select `SSO` from sidebar +
+ + General Settings: SSO + +
+ +- Select **Password Login**. You can enable/disable it +
+ + General Settings: SSO + +
+ +## Retry limits +The user password authentication method will be disabled after predefined numbers of wrong password attempts. This feature can be disabled using setting `DISABLE_PASSWORD_RETRY_LIMIT` to `true` in environment variables. Number of retries allowed will be 5 by default, it can be override by `PASSWORD_RETRY_LIMIT` environment variable. diff --git a/docs/versioned_docs/version-2.3.0/user-authentication/sso/_category_.json b/docs/versioned_docs/version-2.3.0/user-authentication/sso/_category_.json new file mode 100644 index 0000000000..109724a4fd --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/user-authentication/sso/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Single Sign-on", + "position": 10, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/user-authentication/sso/github.md b/docs/versioned_docs/version-2.3.0/user-authentication/sso/github.md new file mode 100644 index 0000000000..6b48c66975 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/user-authentication/sso/github.md @@ -0,0 +1,67 @@ +--- +id: github +title: GitHub +--- + +# GitHub Single Sign-on + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
+ + General Settings: SSO + +
+ +- Select `SSO` from sidebar and then select **GitHub**. GitHub login will be **disabled** by default, +
+ + General Settings: SSO + +
+ +- Enable GitHub. You can see `Redirect URL` generated +
+ + General Settings: SSO + +
+ +- Go to **[GitHub Developer settings](https://github.com/settings/developers)** and navigate to `OAuth Apps` and create a project. `Authorization callback URL` should be the generated `Redirect URL` in Git manage SSO page. +
+ + General Settings: SSO + +
+ +- Open the application details, and you can see the `Client ID` +
+ + General Settings: SSO + +
+ +- Then create `Client secrets` by clicking `Generate new client secret` +
+ + General Settings: SSO + +
+ +Lastly, enter **Client Id** and **Client Secret** in GitHub manage SSO page and save. + +The GitHub sign-in button will now be available in your ToolJet login screen if you have not enabled Multi-Workspace. + +:::info +Should configure `Host Name` if you are using GitHub Enterprise self hosted. Host name should be a URL and should not ends with `/`, example: `https://github.tooljet.com` +::: + +## Multi-Workspace +If you have enabled Multi-Workspace you can configure GitHub SSO as mentioned above, for setting default SSO for the instance use environment variable. + +| variable | description | +| ------------------------------------- | ----------------------------------------------------------- | +| SSO_GIT_OAUTH2_CLIENT_ID | GitHub OAuth client id | +| SSO_GIT_OAUTH2_CLIENT_SECRET | GitHub OAuth client secret | +| SSO_GIT_OAUTH2_HOST | GitHub OAuth host name if GitHub is self hosted | + +Redirect URL should be `/sso/git` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/user-authentication/sso/google.md b/docs/versioned_docs/version-2.3.0/user-authentication/sso/google.md new file mode 100644 index 0000000000..384c93bc62 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/user-authentication/sso/google.md @@ -0,0 +1,85 @@ +--- +id: google +title: Google +--- + +# Google Single Sign-on + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
+ + General Settings: SSO + +
+ +- Select `SSO` from sidebar and then select **Google**. Google login will be **disabled** by default, +
+ + General Settings: SSO + +
+ +- Enable Google. You can see `Redirect URL` generated +
+ + General Settings: SSO + +
+ +- Go to **[Google cloud console](https://console.cloud.google.com/)** and create a project. +
+ + General Settings: SSO + +
+ +- Go to the **[Google cloud console credentials page](https://console.cloud.google.com/apis/credentials)**, and create an OAuth client ID +
+ + General Settings: SSO + +
+ +- You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise, +select 'External'. +
+ + General Settings: SSO + +
+ +- You'll be led to an app registration page where you can set OAuth scopes. Select 'Add or remove scopes' and add the scopes +userinfo.email and userinfo.profile as shown in the image. This will allow ToolJet to store the email and name of the +user who is signing in +
+ + General Settings: SSO + +
+ +- Set the domain on which ToolJet is hosted as an authorized domain +
+ + General Settings: SSO + +
+ +- Set the `Redirect URL` generated at manage SSO `Google` page under Authorised redirect URIs +
+ + General Settings: SSO + +
+ +Lastly, set the `client id` in google manage SSO page. This value will be available from your [Google cloud console credentials page](https://console.cloud.google.com/apis/credentials) + +The Google sign-in button will now be available in your ToolJet login screen, if you are not enabled Multi-Workspace. + +## Multi-Workspace +If you have enabled Multi-Workspace you can configure Google SSO as mentioned above, for setting default SSO for the instance use environment variable. + +| variable | description | +| ------------------------------------- | ----------------------------------------------------------- | +| SSO_GOOGLE_OAUTH2_CLIENT_ID | Google OAuth client id | + +Redirect URL should be `/sso/google` diff --git a/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/azuread.md b/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/azuread.md new file mode 100644 index 0000000000..c124c7a852 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/azuread.md @@ -0,0 +1,67 @@ +--- +id: azuread +title: AzureAD +--- + +# AzureAD Single Sign-on + +:::info +To construct a Well Known URL refer this link :: https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-protocols-oidc +::: + +- Open your organisation page and select `app registration` +
+ + Azure AD: SSO + +
+ +- Select `new registration` +
+ + Azure AD: SSO + +
+ +- Open your organisation page and select App registration. + +- Enter name, select supported account type and enter the redirect URL which can be copied from `Manage SSO -> Open Id -> Redirect URL, click on register`. +
+ + Azure AD: SSO + +
+ +- Application will be registered and will be able to view the details + +- Configure Application (Client) ID as `client id` in Open Id configuration page. +
+ + Azure AD: SSO + +
+ +- Click on `Add certificate or secret` next to the **Client credentials**. + +- Click on `+New Client Secret` +
+ + Azure AD: SSO + +
+ +- Give a description, set the expiry, and then click on the `Add` button. +
+ + Azure AD: SSO + +
+ +- Secret will be created, copy value and add it to the `client secret` section of Open Id SSO config. + +- You can brand the redirect page using the branding and properties option. +
+ + Azure AD: SSO + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/google-openid.md b/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/google-openid.md new file mode 100644 index 0000000000..1fdb46e62b --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/google-openid.md @@ -0,0 +1,82 @@ +--- +id: google-openid +title: Google (Open ID) +--- + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
+ + Google Open ID + +
+ +- Select `SSO` from workspace options +
+ + Google Open ID + +
+ +- Select `Open ID Connect` from the left sidebar +
+ + Google Open ID + +
+ +- Set **Name** as `Google` and get the **Client ID** and **Client Secret** from your [Google Clound Console](https://console.cloud.google.com/apis/credentials). + +- Set the **Well Known URL** to `https://accounts.google.com/.well-known/openid-configuration` + +#### Generating Cliend ID and Cliend Secret on GCS + +- Go to [Google cloud console](https://console.cloud.google.com/) and create a project. +
+ + Google Open ID + +
+ +- Go to the [Google cloud console credentials page](https://console.cloud.google.com/apis/credentials), and create an OAuth client ID +
+ + Google Open ID + +
+ +- You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise, +select 'External'. +
+ + Google Open ID + +
+ +- You'll be led to an app registration page where you can set OAuth scopes. Select 'Add or remove scopes' and add the scopes +userinfo.email and userinfo.profile as shown in the image. This will allow ToolJet to store the email and name of the +user who is signing in +
+ + Google Open ID + +
+ +- Set the domain on which ToolJet is hosted as an authorized domain +
+ + Google Open ID + +
+ +- Set the `Redirect URL` generated at manage SSO `Open ID` page under Authorised redirect URIs +
+ + Google Open ID + +
+ +- Now, you can view your **client ID** and **client secret** from the [Credentials page](https://console.developers.google.com/apis/credentials) in API Console: + - Go to the Credentials page. + - Click the name of your credential or the pencil icon. Your client ID and secret are at the top of the page. + + diff --git a/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/okta.md b/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/okta.md new file mode 100644 index 0000000000..c10c68592c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/okta.md @@ -0,0 +1,53 @@ +--- +id: okta +title: Okta +--- + +# Okta Single Sign-on + +- Sign in to [Okta developer console](https://developer.okta.com/) + +- Go to the `Applications` section and click on the `Create App Integration` +
+ + Okta: SSO + +
+ +- Select `Sign-in method` as `OIDC - OpenID Connect` and `Application type` as `Web Application`. Go to the next step +
+ + Okta: SSO + +
+ +- Enter `App integration name` and then enter `Sign-in redirect URIs` as `/sso/okta`. +
+ + Okta: SSO + +
+ +- Create application and configure `Client Credentials` in the UI. +
+ + Okta: SSO + +
+ +- If you wish to show your application on Okta, edit the application and select `Login initiated by` section as `Either Okta or App`, set visibility according to your preference and `Login flow` should `Redirect to app to initiate login (OIDC Compliant)`. +
+ + Okta: SSO + +
+ +:::info Change Grant type +To change the Login flow to `Redirect to app to initiate login (OIDC Compliant)`, its mandatory to change the `Grant type` - `Client acting on behalf of a user` section to `Implicit (hybrid)` and tick `Allow Access Token with implicit grant type`. +::: + +- The Okta sign-in button will now be available in your ToolJet login screen. + +:::info Find Well Known URL +Refer to this Link: https://developer.okta.com/docs/concepts/auth-servers/#org-authorization-server +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/setup.md b/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/setup.md new file mode 100644 index 0000000000..60868de59e --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/user-authentication/sso/openid/setup.md @@ -0,0 +1,33 @@ +--- +id: setup +title: Setup +--- + + +
Available on: Enterprise Edition
+ +# Configure OpenId Connect Single Sign-on + + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
+ + General Settings: SSO + +
+ +- Select `SSO` from workspace options +
+ + Okta: SSO + +
+ +- Select `OpenId Connect`. +
+ + Okta: SSO + +
+ +- Find and set **Name**, **Client Id**, **Client Secret**, and **Well Known URL** from your Open Id provider. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/user-authentication/user-lifecycle.md b/docs/versioned_docs/version-2.3.0/user-authentication/user-lifecycle.md new file mode 100644 index 0000000000..ab9deaa571 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/user-authentication/user-lifecycle.md @@ -0,0 +1,167 @@ +--- +id: user-lifecycle +title: User Lifecycle +--- + +# User Lifecycle + +## Single-Workspace + +### User onboarding +- If no user is present in the system, there will be `Sign-up` option in the login page. User can sign up by entering their email address. Tooljet will be sending a welcome email with activation URL to the email address. User can follow the activation URL and onboard to ToolJet. + +
+ + ![ToolJet - Single-Workspace sign up](/img/user-lifecycle/single-ws-signup.png) + +
+ +- User with admin privileges can invite members + +
+ + ![ToolJet - Single-Workspace invite user](/img/user-lifecycle/user-invite-sw.png) + +
+ +- Invited user will receive welcome email with activation URL, unregistered user can follow the link and setup Tooljet account + +
+ + ![ToolJet - Single-Workspace accept invite](/img/user-lifecycle/accept-invite-sw.png) + +
+ +- Invited user can onboard through SSO login, without using an invitation link + +
+ + ![ToolJet - Single-Workspace accept invite](/img/user-lifecycle/sso-onboard-sw.png) + +
+ +- If `enable signup` option in enabled in SSO general settings, user can setup account through SSO login without an invite + +
+ + ![ToolJet - Single-Workspace sign up using SSO](/img/user-lifecycle/sso-enable-signup-sw.png) + +
+ +### Archive user + - User can be archived by workspace admin from using `Manage User` page + +
+ + ![ToolJet - Single-Workspace Archive user](/img/user-lifecycle/archive-user.png) + +
+ +### Unarchive user + - User can be unArchived by workspace admin from using `Manage User` page + +
+ + ![ToolJet - Single-Workspace Unarchive user](/img/user-lifecycle/unarchive-sw.png) + +
+ + :::info + Archive or unarchive will affect user login, user won't be able to login using email id and password unless user is in active state + ::: + +## Multi-Workspace + +:::info +Check Multi-workspace docs [here](/docs/tutorial/multiworkspace). +::: + +### User onboarding + + - User can sign up using the sign up link provided on the login page, user will receive a welcome email with activation link. New workspace will be created for the user. + +
+ + ![ToolJet - Multi-Workspace sign up](/img/user-lifecycle/signup-mw.png) + +
+ + - Users can be added to multiple workspaces. Users can create their own workspaces and manage them. + +
+ + ![ToolJet - Multi-Workspace sign up](/img/user-lifecycle/user-mw.png) + +
+ + - Existing user in active state for a workspace can be invited and on boarded to other workspaces, User will receive an invitation email with join link. If a user does not exist in the system, then they will receive a welcome email to setup the account, user can follow the link and on setup the account, once its done the user will be assigned to the new workspace created for the user. + +
+ + ![ToolJet - Multi-Workspace sign up](/img/user-lifecycle/invite-link-mw.png) + +
+ + - Invited user can onboard through SSO login, without using an invitation link from the workspace [login page](/docs/user-authentication/general-settings#login-url) + +
+ + ![ToolJet - Single-Workspace accept invite](/img/user-lifecycle/sso-onboard-sw.png) + +
+ + - If `enable sign up` option in enabled in SSO [general settings](/docs/user-authentication/general-settings#enable-signup) for the workspace, user can setup account through SSO login without an invite from the workspace [login page](/docs/user-authentication/general-settings#login-url) + +
+ + ![ToolJet - Single-Workspace sign up using SSO](/img/user-lifecycle/sso-enable-signup-sw.png) + +
+ +### Archive user + - User can be archived by workspace admin from using `Manage User` page + +
+ + ![ToolJet - Single-Workspace Archive user](/img/user-lifecycle/archive-user.png) + +
+ +### Unarchive user + - User can be unarchive by workspace admin from using `Manage User` page + +
+ + ![ToolJet - Single-Workspace Unarchive user](/img/user-lifecycle/unarchive-user-mw.png) + +
+ + :::info + Archive or unarchive will not affect user login, user can login and use other workspaces where user is in active state. + ::: + +### Switch between workspaces + +
+ + ![ToolJet - Single-Workspace sign up using SSO](/img/user-lifecycle/switch.png) + +
+ + +## User status + +| Status | Able to log in | How to activate | +| -------- | ---------------- | ------------------------------------ | +| active | Yes | | +| invited | No (Yes with SSO)| Login through SSO or invitation link | +| archived | No | Not able to activate. Invite from `Manage Users` page, status will be changed to invited | + +## Multi-Workspace SSO flow + - Diagram shows how SSO configurations are chosen in common login page and workspace login page. Instance level SSO is configured in environment variables and Workspace level SSO is configured in respective `Manage SSO` page. + +
+ + ![ToolJet - SSO Flow](/img/user-lifecycle/sso-flow.png) + +
diff --git a/docs/versioned_docs/version-2.3.0/widgets/_category_.json b/docs/versioned_docs/version-2.3.0/widgets/_category_.json new file mode 100644 index 0000000000..28ad4a4735 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Widget Reference", + "position": 6, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/bounded-box.md b/docs/versioned_docs/version-2.3.0/widgets/bounded-box.md new file mode 100644 index 0000000000..4a7edb33be --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/bounded-box.md @@ -0,0 +1,100 @@ +--- +id: bounded-box +title: Bounded Box +--- + +# Bounded box + +A bounded box is an infinitely customizable image annotation component that can be used to select and tag areas of an image. It supports selection using specific points (landmarking) or draw rectangular areas (bounding boxes). + +
+ +Bounded Box + +
+ +## Properties + +
+ +Bounded Box + +
+ +### Image URL + +The bounding box required an image to display, enter the URL of the image to display it on the component. + +### Selector + +The bounded box support selection using: +- **Rectangle** +- **Point** + +You can also click on the **Fx** to set the value programmatically. + +### List of labels + +This property will include the list of label that will be displayed in the dropdown while selection in the bounded-box. This property requires the label in array format. + +## Events + +To add an event to a bounded-box, click on the component handle to open its properties on the right. Go to the **Events** accordion and click on **Add handler**. + +
+ +Button group events + +
+ +### On change + +On change event is triggered when the label from the dropdown in the selector is changed in the bounded box. Just like any other event on ToolJet, you can set multiple handlers for on-change event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General + +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Hovering over the component will display the string as the tooltip. + +
+ +Button group Tooltip + +
+ +## Layout + +
+ +Button group layout + +
+ +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +
+ +Bounded box properties + +
+ +| Style | Description | +| ----------- | ----------- | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the component will not be visible when the app is loaded. By default, it's set to `{{true}}`. | +| Disable | Toggle on to disable the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the component will be disabled and becomes non-functional. By default, its value is set to `{{false}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/button-group.md b/docs/versioned_docs/version-2.3.0/widgets/button-group.md new file mode 100644 index 0000000000..f415e830c7 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/button-group.md @@ -0,0 +1,95 @@ +--- +id: button-group +title: Button Group +--- +# Button group + +Button group widget can be used to take actions. + +
+ +Button group + +
+ +## Properties +### Events + +To add an event to a button group, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +
+ +Button group events + +
+ +#### On click +On click event is triggered when the button group is clicked. Just like any other event on ToolJet, you can set multiple handlers for on click event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +### Properties + +
+ +Button group properties + +
+ +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| label | label is used to set the heading of the button group. | Any **String** value | +| values |Values for button group items. | **Array** of strings and numbers | +| labels | It can be used to set the labels of the button group items. | **Array** of strings and numbers | +| Default selected | Initial selected values can be set using this. | **Array** of strings and numbers | +| Enable multiple selection | Toggle this to allow multiple button selection. | Toggle to true/false | + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +Button group Tooltip + +
+ +### Layout + +
+ +Button group layout + +
+ +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +### Styles + +
+ +Button group properties + +
+ +| Style | Description | +| ----------- | ----------- | +| Background color | You can change the background color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. | +| Text color | You can change the color of the Text in button by entering the Hex color code or choosing a color of your choice from the color picker. | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | Toggle on to lock the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the button. | +| Selected text color | Use this property to modify the background colour of text in selected button | +| Selected background color | Use this property to modify the background colour of selected button | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/button.md b/docs/versioned_docs/version-2.3.0/widgets/button.md new file mode 100644 index 0000000000..dd86c3b615 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/button.md @@ -0,0 +1,96 @@ +--- +id: button +title: Button +--- +# Button + +Button widget can be used to take actions. + + + +## Properties + +To add an event to a button, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +### Events + +
+ +ToolJet - Widget Reference - Button Events List + +
+ +#### On click + +**On Click** event is triggered when the button is clicked. + +#### On hover + +**On hover** event is triggered when the mouse cursor is moved over the button. Just like any other event on ToolJet, you can set multiple handlers for on click event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +### Properties + +
+ +ToolJet - Widget Reference - Button Properties + +
+ +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| Button Text | It can be used to set the label of the button. | Any **String** value: `Send Message`, `Delete`, or `{{queries.xyz.data.action}}` | +| Loading state | Loading state can be used to show a spinner as the button content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. | Switch the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}` | + + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Tooltip + +
+ +### Layout + +
+ +ToolJet - Widget Reference - Layout + +
+ +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +### Styles + +
+ +ToolJet - Widget Reference - Button Styles + +
+ + +| Style | Description | +| ----------- | ----------- | +| Background color | You can change the background color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. | +| Text color | You can change the color of the Text in button by entering the Hex color code or choosing a color of your choice from the color picker. | +| Loader color | You can change the color of the loader in button by entering the Hex color code or choosing a color of your choice from the color picker. This will only be affective if the [loading state](#properties-1) property of the button is enabled. | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | Toggle on to lock the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the button. | +| Border color | Add a color to the border of the button using this property. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/calendar.md b/docs/versioned_docs/version-2.3.0/widgets/calendar.md new file mode 100644 index 0000000000..454a2393da --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/calendar.md @@ -0,0 +1,199 @@ +--- +id: calendar +title: Calendar +--- +# Calendar + +Calendar widget comes with the following features: +- **Day, month and week level views** +- **Events** +- **Resource scheduling** + +
+ +ToolJet - Widget Reference - Calendar + +
+ +## Properties + +### Date format +Determines the format in which any date passed to the calendar via any of the properties will be parsed. It also determines the format in which any date made available by the calendar via exposed variables will be displayed. It uses the date format conventions of [moment.js](https://momentjs.com/). The default Date format is set to `MM-DD-YYYY HH:mm:ss A Z`. +### Default date +Determines the date on which the calendar's view will be centered on. By default, the default date is set to the current date using moment.js i.e. `{{moment().format("MM-DD-YYYY HH:mm:ss A Z")}}`. If the calendar is on `month` view, it will show the month on which this date exists. If the calendar is on `week` view, it will show the week on which this date exists. This property needs to be formatted using the `Date format` property which is configurable on the inspector. + +### Events +`Events` property should contain an array of objects, each of which describes the events that the calendar needs to display. + +Assuming that you set the date format to `MM-DD-YYYY HH:mm:ss A Z`, setting the `Events` property to the following code snippet will display an event titled `Sample Event` at the first hour of this day, as displayed in the image of calendar at the beginning of this page. + +```javascript +{{[ + { + title: 'Sample event', + start: `${moment().startOf('day').format('MM-DD-YYYY HH:mm:ss A Z')}`, + end: `${moment().endOf('day').format('MM-DD-YYYY HH:mm:ss A Z')}`, + allDay: false, + tooltip: 'Sample event', + color: 'lightgreen', + } +]}} +``` + +### Event object properties + +| Name | Description | +|------|-------------| +| title | Title of the event | +| start | The date(and time) on which this event begins. Needs to be formatted in the `Date format` you've supplied | +| end | The date(and time) on which this event ends. Needs to be formatted in the `Date format` you've supplied | +| allDay | Optional. Qualifies the event as an 'All day event', which will pin it to date headers on `day` and `week` level views | +| tooltip | Tooltip which will be display when the user hovers over the event | +| color | Background color of the event, any css supported color name or hex code can be used | +| textColor | Color of the event title, any css supported color name or hex code can be used | +| textOrientation | Optional. If it is set to `vertical`, the title of the event will be oriented vertically. | +| resourceId | Applicable only if you're using resource scheduling. This is the id of the resource to which this event correspond to. | + +You may supply any other additional property to the event(s). These additional properties will available to you when the calendar widget +exposes any of the events via its exposed variables. + +### Resources + +Specifying resources will make the calendar categorize `week` view and `day` view for each of the resources specified. + + For example, to categorize week/day view into for three rooms, we specify `resources` this way: + +```javascript +{{[ + {resourceId: 1, title: 'Room A'}, + {resourceId: 2, title: 'Room B'}, + {resourceId: 3, title: 'Room C'}, + ]}} +``` + +If we specify the `resourceId` of any of the events as `1`, then that event will be assigned to `Room A`, generating the following calendar, assuming that we've set the view to `day` and are viewing the day on which this event exists. + +
+ +ToolJet - Widget Reference - Calendar + +
+ +### Default view + +Determines whether the calendar would display a `day`, a `week` or a `month`. Setting this property to anything other than these values will make the calendar default to `month` view. + +The view that is currently selected will be exposed as the variable `currentView`. + +### Start time on week and day view + +This determines the time at which week view and day view cells begins. Keep in mind that this field accepts a date, but still only the time and timezone(if provided) are taken from this date. The date should be provided in the date format chosen by you in the first property field. + +### End time on week and day view + +This determines the time at which week view and day view cells ends. Keep in mind that this field accepts a date, but still only the time and timezone(if provided) are taken from this date. The date should be provided in the date format chosen by you in the first property field. + +### Show toolbar + +Determines whether the calendar toolbar should be displayed or not. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +### Show view switcher + +Determines whether the calendar's buttons that allow user to switch between `month`, `week` and `day` level views will be displayed. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +### Highlight today + +Determines whether the today's card on the calendar should be highlighted or not. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +### Show popover when the event is clicked + +Determines whether to display a popover whenever an event is clicked. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +## Events + +
+ +ToolJet - Widget Reference - Calendar + +
+ +### On Event selected + +This event is fired when the user clicks on a calendar event. + +Last selected event is exposed as `selectedEvent`. + +### on Slot selected + +This event is fired when the user either clicks on an calendar slot(empty cell or empty space of a cell with event) or when they click and drag to select multiple slots. + +Last selected slot(s) are exposed as `selectedSlots`. + +### On Date Navigate + +This event is fired when the user clicks on `Today`, `Next` or `Back` buttons on the calendar. + +The corresponding date to which the user navigated, will be exposed as `currentDate`. + +### On View Change + +This event is fired when a different view is selected by the user. + +The current view is exposed as `currentView`. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. Under the General accordion,you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Calendar + +
+ +## Layout + +
+ +ToolJet - Widget Reference - Calendar + +
+ +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
+ +ToolJet - Widget Reference - Calendar + +
+ +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Cell size in views classified by resource + +When `resources` are specified, the calendar could take up quite a lot of horizontal space, making the horizontal scroll bar of calendar having to be relied upon all the time. + +If we set this property to `compact`, the cell sizes will be smaller in `week` and `day` views. + +### Header date format on week view + +This format determines how the column header for each day in week view will be displayed. As with every other date format field in ToolJet, this follows the **momentjs** standard of date formatting. By default, its set to `DD MMM`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + diff --git a/docs/versioned_docs/version-2.3.0/widgets/chart.md b/docs/versioned_docs/version-2.3.0/widgets/chart.md new file mode 100644 index 0000000000..9760de273f --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/chart.md @@ -0,0 +1,389 @@ +--- +id: chart +title: Chart +--- +# Chart + +Chart widget takes the chart type, data and styles to draw charts using Plotly.js. + +## How To Use Chart Widget + + + +## Chart types +### Line charts + +**Data requirements:** The data needs to be an array of objects and each object should have `x` and `y` keys. + +**Example:** +```json +[ + { "x": "Jan", "y": 100}, + { "x": "Feb", "y": 80}, + { "x": "Mar", "y": 40}, + { "x": "Apr", "y": 100}, + { "x": "May", "y": 80}, + { "x": "Jun", "y": 40} +] +``` + +The chart will look like this: + +
+ +ToolJet - Widget Reference - Chart + +
+ +### Bar charts + +**Data requirements:** The data needs to be an array of objects and each object should have `x` and `y` keys. + +**Example:** + +```json +[ + { "x": "Jan", "y": 100}, + { "x": "Feb", "y": 80}, + { "x": "Mar", "y": 40}, + { "x": "Apr", "y": 100}, + { "x": "May", "y": 80}, + { "x": "Jun", "y": 40}, + { "x": "Jul", "y": 100}, + { "x": "Aug", "y": 80}, + { "x": "Sep", "y": 40} +] +``` + +The chart will look like this: + +
+ +ToolJet - Widget Reference - Chart + +
+ +### Pie charts + +**Data requirements:** The data needs to be an array of objects and each object should have `label` and `value` keys. + +**Example:** + +```json +[ + { "x": "Jan", "y": 100}, + { "x": "Feb", "y": 80}, + { "x": "Mar", "y": 40}, + { "x": "Apr", "y": 100}, + { "x": "May", "y": 80}, + { "x": "Jun", "y": 40} +] +``` + +The chart will look like this: + +
+ +ToolJet - Widget Reference - Chart + +
+ +## Properties + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +### Title + +This field is used to add a title to your selected chart. + +### Plotly JSON chart schema + +In the chart widget, you can also plot a chart with JSON data. So the JSON will contain the information about the chart type, chart data, etc. You can learn more about the JSON properties from [here](https://plotly.com/javascript/reference/). + +Anyway, to work with the JSON you need to enable the `Use Plotly JSON schema` toggle from the properties section. + +
+ +ToolJet - Widget Reference - Chart + +
+ +It will show the [JSON description](https://plotly.com/chart-studio-help/json-chart-schema/) field to put the JSON data. + +The result will be like this: + +
+ +ToolJet - Widget Reference - Chart + +
+ +### Using Plotly JSON chart schema + +In the **JSON description**, the value needs to be the `data` array with x and y axis values and at the end we need to specify the `type`. let's take a look at the examples for different chart types. +#### Line + +```bash + { + "data": [ + { + "x": [ + "Jan", + "Feb", + "Mar" + ], + "y": [ + 100, + 80, + 40 + ], + "type": "line" + }, + { + "x": [ + "Jan", + "Feb", + "Mar" + ], + "y": [ + 300, + 30, + 20 + ], + "type": "line" + } + ] + } +``` + +
+ +ToolJet - Widget Reference - Chart + +
+ +#### Bar + +```bash +{ + "data": [ + { + "name": "SF Zoo", + "type": "bar", + "x": [ + 20, + 14, + 23 + ], + "y": [ + "giraffes", + "orangutans", + "monkeys" + ], + "marker": { + "line": { + "color": "rgba(55, 128, 191, 1.0)", + "width": 1 + }, + "color": "rgba(55, 128, 191, 0.6)" + }, + "orientation": "h" + }, + { + "name": "LA Zoo", + "type": "bar", + "x": [ + 12, + 18, + 29 + ], + "y": [ + "giraffes", + "orangutans", + "monkeys" + ], + "marker": { + "line": { + "color": "rgba(255, 153, 51, 1.0)", + "width": 1 + }, + "color": "rgba(255, 153, 51, 0.6)" + }, + "orientation": "h" + } + ], + "layout": { + "barmode": "stack" + }, + "frames": [] +} +``` +
+ +ToolJet - Widget Reference - Chart + +
+ +#### Area + +```bash +{ + "data": [ + { + "uid": "babced", + "fill": "tonexty", + "mode": "none", + "name": "Col2", + "type": "scatter", + "x": [ + "2000-01-01", + "2001-01-01", + "2002-01-01", + "2003-01-01", + "2004-01-01", + "2005-01-01", + "2006-01-01", + "2007-01-01", + "2008-01-01", + "2009-01-01", + "2010-01-01", + "2011-01-01", + "2012-01-01", + "2013-01-01", + "2014-01-01", + "2015-01-01", + "2016-01-01" + ], + "y": [ + "17087182", + "29354370", + "38760373", + "40912332", + "51611646", + "64780617", + "85507314", + "121892559", + "172338726", + "238027855", + "206956723", + "346004403", + "697089489", + "672985183", + "968882453", + "863105652", + "1068513050" + ], + "fillcolor": "rgb(224, 102, 102)" + } + ], + "layout": { + "title": "Total Number of Websites", + "width": 800, + "xaxis": { + "type": "date", + "range": [ + 946702800000, + 1451624400000 + ], + "title": "Source: Scribblrs
Source: Internet Live Stats", + "showgrid": false, + "autorange": true, + "tickformat": "%Y" + }, + "yaxis": { + "type": "linear", + "range": [ + 0, + 1124750578.9473684 + ], + "title": "", + "autorange": true + }, + "height": 500, + "autosize": false + }, + "frames": [] +} +``` + +
+ +ToolJet - Widget Reference - Chart + +
+ +#### Few more exmaples: + +**Link to JSON description:** https://raw.githubusercontent.com/plotly/plotly.js/master/test/image/mocks/0.json + +
+ +ToolJet - Widget Reference - Chart + +
+ +**Link to JSON description:** https://raw.githubusercontent.com/plotly/plotly.js/master/test/image/mocks/12.json + +
+ +ToolJet - Widget Reference - Chart + +
+ +:::tip +Check the **[Plotly documentation](https://plotly.com/chart-studio-help/json-chart-schema/#more-examples)** to explore the all type of charts available. +::: + +## Marker color + +Modify the color of marker using the color picker or by providing a `HEX color code`. + +## Options +### Loading state + +Toggle `on` the switch to display a loader on the widget. You can also programmatically define it's value by clicking on `Fx`, acceptable values are - `{{true}}` and `{{false}}`. + +### Show Axes + +Enable or disable the `x` and `y` axes on the chart through this property. You can also programmatically define it's value by clicking on `Fx`, acceptable values are - `{{true}}` and `{{false}}`. + +### Show grid lines + +Toggle `on` or `off` to show or hide the grid lines on the chart. You can also programmatically define it's value by clicking on `Fx`, acceptable values are - `{{true}}` and `{{false}}`. + +## Layout + +
+ +ToolJet - Widget Reference - Chart + +
+ +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
+ +ToolJet - Widget Reference - Chart + +
+ +### Padding + +Define a space between the widget element and the widget border using `Padding` property. Use any numerical value between `1` to `100`. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. diff --git a/docs/versioned_docs/version-2.3.0/widgets/checkbox.md b/docs/versioned_docs/version-2.3.0/widgets/checkbox.md new file mode 100644 index 0000000000..dbdc0f0650 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/checkbox.md @@ -0,0 +1,108 @@ +--- +id: checkbox +title: Checkbox +--- +# Checkbox + +Checkbox widget can be used for allowing the users to make a binary choice, e.g,. unselected or selected. + +:::info +The checkbox widget consists of a single checkbox input. +::: + +## How To Use Checkbox Widget + + + +## Properties + +### Label + +The text is to be used as the label for the checkbox. This field expects a `String` input. + +### Default Status + +The property is used to set the default status (enabled or disabled) of the checkbox widget when the app is loaded. By default, the checkbox component is set to `{{false}}`/disabled. + +### Events + +To add an event to a checkbox component, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **+ Add handler**. + +
+ +ToolJet - Widget Reference - Checkbox + +
+ +#### On check + +On check event is triggered when checkbox input is checked. +#### On uncheck + +On uncheck event is triggered when checkbox input is unchecked. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Checkbox + +
+ +### Layout + +
+ +ToolJet - Widget Reference - Checkbox + +
+ +#### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +#### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
+ +ToolJet - Widget Reference - Checkbox + +
+ +### Text color + +Change the color of the Text in checkbox by entering the `Hex color code` or choosing a color of your choice from the color-picker. + +### Checkbox color + +You can change the color of the checkbox by entering the `Hex color code` or choosing a color of your choice from the color-picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| `setChecked` | Set checkbox state. | pass status as parameter. ex: `components.checkbox1.setChecked(true)` | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/circular-progressbar.md b/docs/versioned_docs/version-2.3.0/widgets/circular-progressbar.md new file mode 100644 index 0000000000..47064de88e --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/circular-progressbar.md @@ -0,0 +1,78 @@ +--- +id: circular-progress-bar +title: Circular Progress Bar +--- +# Circular Progress Bar + +Circular progress bar widget can be used to show progress in a progress circle. + +
+ +ToolJet - Widget Reference - Circular progress bar + +
+ +## Properties + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +
+ +ToolJet - Widget Reference - Circular progress bar + +
+ +| properties | description | Expected Value | +| ----------- | ----------- | --------------- | +| Text | We can set a text inside the progress circle.| It expects a `String`, you can also use js to dynamically update the text as the progress changes. | +| Progress | It can be used to set the progress of the widget. | Progress should be an integer between 0 and 100.| + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Circular progress bar + +
+ +## Layout + +
+ +ToolJet - Widget Reference - Circular progress bar + +
+ +| Layout | description | +| ----------- | ----------- | +| Show on desktop | Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | + +## Styles + +
+ +ToolJet - Widget Reference - Circular progress bar + +
+ +| properties | description | Expected Value | +| ----------- | ----------- | ------------------- | +| Color | To define stroke color.| `HEX color code` or choose color from color-picker. | +| Text color | To define color of the text inside circular progress bar.| `HEX color code` or choose color from color-picker. | +| Text size | To define the size of the text | Value must between 0-100. | +| Stroke width | To define the width of stroke | Value must between 0-100.| +| Counter Clockwise | Whether to rotate progress bar in counterclockwise direction. | It accepts `{{true}}` and `{{false}}`, Default value is `false`.| +| Circle ratio | To define ratio of the full circle diameter the progressbar should use. | It accepts numerical value and the default is `1`. | +| Visibility | Toggle on or off to control the visibility of the widget. | You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Circular progress bar widget uses [react-circular-progress](https://github.com/kevinsqi/react-circular-progressbar) package. Check the repo for further more details about properties and styles. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/code-editor.md b/docs/versioned_docs/version-2.3.0/widgets/code-editor.md new file mode 100644 index 0000000000..612593221e --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/code-editor.md @@ -0,0 +1,209 @@ +--- +id: code-editor +title: Code Editor +--- +# Code Editor + +Code Editor widget is a versatile text editor for editing code and supports several languages. + +
+ +ToolJet - Widget Reference - Code editor + +
+ +## Properties + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +
+ +ToolJet - Widget Reference - Code editor + +
+ +| properties | description | Expected value | +| ----------- | ----------- | ----------------- | +| Placeholder | It specifies a hint that describes the expected value.| This field requires a `String` value | +| Mode | It is used to specify the language to be used for the code-editor.| See `info` below for the list of all supported languages | +| Show Line Number | This property is used to show or hide line numbers to the left of the editor.| This fields expects a boolean value `{{true}}` or `{{false}}` | + +:::info +
+Supporting all commonly used languages. +
    +
  • APL
  • +
  • ASN.1
  • +
  • Asterisk dialplan
  • +
  • Brainfuck
  • +
  • C, C++, C#
  • +
  • Ceylon
  • +
  • Clojure
  • +
  • Closure Stylesheets (GSS)
  • +
  • CMake
  • +
  • COBOL
  • +
  • CoffeeScript
  • +
  • Common Lisp
  • +
  • Crystal
  • +
  • CSS
  • +
  • Cypher
  • +
  • Cython
  • +
  • D
  • +
  • Dart
  • +
  • Django (templating language)
  • +
  • Dockerfile
  • +
  • diff
  • +
  • DTD
  • +
  • Dylan
  • +
  • EBNF
  • +
  • ECL
  • +
  • Eiffel
  • +
  • Elixir
  • +
  • Elm
  • +
  • Erlang
  • +
  • Factor
  • +
  • FCL
  • +
  • Forth
  • +
  • Fortran
  • +
  • F#
  • +
  • Gas (AT&T-style assembly)
  • +
  • Gherkin
  • +
  • Go
  • +
  • Groovy
  • +
  • HAML
  • +
  • Handlebars
  • +
  • Haskell
  • +
  • Haxe
  • +
  • HTML embedded (JSP, ASP.NET)
  • +
  • HTML mixed-mode
  • +
  • HTTP
  • +
  • IDL
  • +
  • Java
  • +
  • JavaScript (JSX)
  • +
  • Jinja2
  • +
  • Julia
  • +
  • Kotlin
  • +
  • LESS
  • +
  • LiveScript
  • +
  • Lua
  • +
  • Markdown (GitHub-flavour)
  • +
  • Mathematica
  • +
  • mbox
  • +
  • mIRC
  • +
  • Modelica
  • +
  • MscGen
  • +
  • MUMPS
  • +
  • Nginx
  • +
  • NSIS
  • +
  • N-Triples/N-Quads
  • +
  • Objective C
  • +
  • OCaml
  • +
  • Octave (MATLAB)
  • +
  • Oz
  • +
  • Pascal
  • +
  • PEG.js
  • +
  • Perl
  • +
  • PGP (ASCII armor)
  • +
  • PHP
  • +
  • Pig Latin
  • +
  • PowerShell
  • +
  • Properties files
  • +
  • ProtoBuf
  • +
  • Pug
  • +
  • Puppet
  • +
  • Python
  • +
  • Q
  • +
  • R
  • +
  • RPM
  • +
  • reStructuredText
  • +
  • Ruby
  • +
  • Rust
  • +
  • SAS
  • +
  • Sass
  • +
  • Spreadsheet
  • +
  • Scala
  • +
  • Scheme
  • +
  • SCSS
  • +
  • Shell
  • +
  • Sieve
  • +
  • Slim
  • +
  • Smalltalk
  • +
  • Smarty
  • +
  • Solr
  • +
  • Soy
  • +
  • Stylus
  • +
  • SQL (several dialects)
  • +
  • SPARQL
  • +
  • Squirrel
  • +
  • Swift
  • +
  • sTeX, LaTeX
  • +
  • Tcl
  • +
  • Textile
  • +
  • Tiddlywiki
  • +
  • Tiki wiki
  • +
  • TOML
  • +
  • Tornado (templating language)
  • +
  • troff (for manpages)
  • +
  • TTCN
  • +
  • TTCN Configuration
  • +
  • Turtle
  • +
  • Twig
  • +
  • VB.NET
  • +
  • VBScript
  • +
  • Velocity
  • +
  • Verilog/SystemVerilog
  • +
  • VHDL
  • +
  • Vue.js app
  • +
  • Web IDL
  • +
  • WebAssembly Text Format
  • +
  • XML/HTML
  • +
  • XQuery
  • +
  • Yacas
  • +
  • YAML
  • +
  • YAML frontmatter
  • +
  • Z80
  • +
+
+::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Code editor + +
+ +## Layout + +
+ +ToolJet - Widget Reference - Code editor + +
+ +| Layout | description | +| ----------- | ----------- | +| Show on desktop | Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | + +## Styles + +
+ +ToolJet - Widget Reference - Code editor + +
+ +| Styles | description | +| ----------- | ----------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the editor. The field expects only numerical value from `1` to `100`, default is `0`. | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/color-picker.md b/docs/versioned_docs/version-2.3.0/widgets/color-picker.md new file mode 100644 index 0000000000..36a8fc6658 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/color-picker.md @@ -0,0 +1,84 @@ +--- +id: color-picker +title: Color Picker +--- + +# Color Picker + +Color Picker widget is used to select the desired color from the color picker + +
+ +ToolJet - Widget Reference - Color Picker + +
+ +## Properties + +### Default Color + +The data needs to be an valid hex color + +- One can change default color either from color picker or using fx (need to provide only respective hex value) + +**Example:** + +```json +Valid color : #000000 or #000 +Invalid Color : #0000, "black" , rgb(0,0,0) , +``` + +
+ +ToolJet - Widget Reference - Color Picker + +
+ +## Events + +To add an event to a color-picker component, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **+ Add handler**. + +
+ +ToolJet - Widget Reference - Color Picker + +
+ +### On change + +On change event is triggered when the color is changed on the color-picker. + +## Layout + +| Layout | description | Expected value | +| --------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +### Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| setColor | Set the color. | `color` eg - `#ffffff` | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Example: Selecting/changing color from the color picker and getting respective hex, rgb and rgba value of selected color +- Let's start by creating a new app and then dragging the Color Picker widget onto the canvas. +- Click on the Color Picker widget, a picker pop-up will appear, one can select desired color from the picker. +- In order to close the appeared picker pop-up, one need's to move away mouse from the picker pop-up and picker pop-up will fade away. +- In the Inspector, inside component, look for colorpicker, where one can get respective hex, rgb and rgba color + +
+ +ToolJet - Widget Reference - Color Picker + +
\ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/container.md b/docs/versioned_docs/version-2.3.0/widgets/container.md new file mode 100644 index 0000000000..fc58141f51 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/container.md @@ -0,0 +1,60 @@ +--- +id: container +title: Container +--- +# Container + +Containers are used to group widgets together. You can move the desired number of widgets inside a container to organize your app better. + +
+ +ToolJet - Widget Reference - Container + +
+ +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers themouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Container + +
+ +## Layout + +
+ +ToolJet - Widget Reference - Container + +
+ +| Layout | description | +| ----------- | ----------- | +| Show on desktop | This property have toggle switch. If enabled, the Container widget will display in the desktop view else it will not appear. This is enabled by default.| +| Show on mobile | This property have toggle switch. If enabled, the Container wisget will display in the mobile view else it will not appear.| + +## Styles + +
+ +ToolJet - Widget Reference - Container + +
+ +| Style | Description | +| ----------- | ----------- | +| Background Color | You can change the background color of the Container by entering the `Hex color code` or choosing a color of your choice from the color picker. | +| Border radius | Use this property to modify the border radius of the container. The field expects only numerical value from `1` to `100`, default is `0`. | +| Border Color | You can change the border color of the Container by entering the `Hex color code` or choosing a color of your choice from the color picker. | +| Visibility | This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | + + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/custom-component.md b/docs/versioned_docs/version-2.3.0/widgets/custom-component.md new file mode 100644 index 0000000000..385252605d --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/custom-component.md @@ -0,0 +1,105 @@ +--- +id: custom-component +title: Custom Component +--- + +# Custom Component + +Custom Component can be used to do create your own React component when the needed functionality isn't available in other components. + +
+ +ToolJet - Widget Reference - Custom Component + +
+ +## Properties + +### Data + +The data needs to be an objects which needs to be passed as `data` props to the custom component + +**Example:** + +```json +{{{ + title: "Hi! There", + buttonText: "Updated Text", + queryName: "runjs1" +}}} +``` + +### Code + +This field is used to add a React code for your custom component. The packages for the custom component can be imported from [Skypack](https://www.skypack.dev/). For example, to import `React` package into the custom component it can be imported as `import React from 'https://cdn.skypack.dev/react'`. + +Tooljet provides 3 props to interact with the app: `data`, `updateData` and `runQuery`. + +- `data` is a shared object between custom component and Tooljet app. +- `updateData` is a function which accepts a single object used to update the data passed to the custom component. +- `runQuery` is a function which accepts a query name as a string used to run the query from the custom component. + +**Example:** + +```js +import React from "https://cdn.skypack.dev/react"; +import ReactDOM from "https://cdn.skypack.dev/react-dom"; +import { Button, Container, Link } from "https://cdn.skypack.dev/@material-ui/core"; + +const MyCustomComponent = ({data, updateData, runQuery}) => ( + +

{data.title}

+ + +
+); + +const ConnectedComponent = Tooljet.connectComponent(MyCustomComponent); + +ReactDOM.render(, document.body); +``` + +:::info +`Tooljet.connectComponent` acts as a HOC and it is required to get access to the data passed into the custom component and run the query +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Custom Component + +
+ +## Layout + +| Layout | description | Expected value | +| --------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/date-range-picker.md b/docs/versioned_docs/version-2.3.0/widgets/date-range-picker.md new file mode 100644 index 0000000000..642c97b427 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/date-range-picker.md @@ -0,0 +1,81 @@ +--- +id: date-range-picker +title: Date-range picker +--- +# Date-range picker + +The date-range picker widget allows users to select a range of dates. + +## How To Use Date Range Picker Widget + + + +## Properties + +### Default start date + +Set the start date to be selected by default in the widget + +### Default end date + +Set the start date to be selected by default in the widget + +### Format + +The format of the date selected by the date picker. Default date format is **DD/MM/YYYY**. Date format should be followed as ISO 8601 as mentioned in the [moment documentation](https://momentjs.com/docs/). + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Date range picker + +
+ +## Events + +Date range picker supports the following events: + +### On select + +The On select event is triggered when the a start date and end date is selected on the picker. Just like any other event on ToolJet, you can set multiple handlers for on select event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
+ +ToolJet - Widget Reference - Date range picker + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Border Radius + +Use this property to modify the border radius of the date range picker. The field expects only numerical value from `1` to `100`, default is `0`. +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/datepicker.md b/docs/versioned_docs/version-2.3.0/widgets/datepicker.md new file mode 100644 index 0000000000..19001e9fb6 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/datepicker.md @@ -0,0 +1,108 @@ +--- +id: datepicker +title: Datepicker +--- +# Datepicker + +The Datepicker widget allows users to select a single value for date and time from a pre-determined set. + +
+ +ToolJet - Widget Reference - Date picker + +
+ +## How To Use Datepicker Widget + + + +## Events + +To add an event to a date-picker component, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **+ Add handler**. + +### On select + +On select event is triggered when an date is selected. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +### Default value + +This value acts as placeholder for the date picker widget, if any value is not provided then the default value will be used from the picker. The default value needs to be a `String` with respect to the `format` field. Ex: If format is set to `MM/YYYY` then provide default value as `04/2022`. + +### Format + +The format of the date selected by the date picker. Default date format is **DD/MM/YYYY**. Date format should be followed as ISO 8601 as mentioned in the [moment documentation](https://momentjs.com/docs/). This field requires a `String` input. Ex: `DD/MM`, `MM/YYYY`, `YY/MM`, `DD/MM/YYYY` etc. + +### Enable time selection? + +Toggle on or off to enable the time selection. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +### Enable date selection? + +Toggle on or off to enable the date selection. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +### Disabled dates + +We can give disabled dates property which will make specific dates disabled and cannot be selected. The default value needs to be an array of`Strings`. + +Example for disabling the 9th of January: +```js +{{['09-01']}} +``` + +Now user won't be able to select the mentioned date since it will be disabled. + +## Validation + +### Custom Validation + +Add a validation for the date input in the widget using the ternary operator. + +Example of validation for selecting dates that are after the current date: +```js +{{moment(components.datepicker1.value, 'DD/MM/YYYY').isAfter(moment()) ? true : 'Date should be after today'}} +``` +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Date picker + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +### Border Radius + +Use this property to modify the border radius of the date-picker. The field expects only numerical value from `1` to `100`, default is `0`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/divider.md b/docs/versioned_docs/version-2.3.0/widgets/divider.md new file mode 100644 index 0000000000..b027ae96d2 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/divider.md @@ -0,0 +1,56 @@ +--- +id: divider +title: Divider +--- +# Divider + +Divider widget is used to add separator between components. + +
+ +ToolJet - Widget Reference - Divider + +
+ +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Divider + +
+ +## Layout + +
+ +ToolJet - Widget Reference - Divider + +
+ +| properties | description | +| ----------- | ----------- | +| Show on Desktop | This property have toggle switch. If enabled, the divider will display in the desktop view else it will not appear. | +| Show on Mobile | This property have toggle switch. If enabled, the divider will display in the mobile view else it will not appear. | + +## Styles + +
+ +ToolJet - Widget Reference - Divider + +
+ +| properties | description | +| ----------- | ----------- | +| Divider Color | It is used to set the color of the divider. Use hex code to set the background color. | +| Visibility | This property is used to set the visibility of the divider. The property accepts Boolean value. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/dropdown.md b/docs/versioned_docs/version-2.3.0/widgets/dropdown.md new file mode 100644 index 0000000000..e4cdca4a72 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/dropdown.md @@ -0,0 +1,140 @@ +--- +id: dropdown +title: Dropdown +--- +# Dropdown + +The Dropdown widget can be used to collect user input from a list of options. + +## How To Use Dropdown Widget + + + +:::tip +Dropdown options can be referred to your query data with dynamic variables. +::: + +
+ +ToolJet - Widget Reference - Dropdown + +
+ +## Events + +
+ +ToolJet - Widget Reference - Dropdown + +
+ +### Event: On select + +On select event is triggered when an option is selected. + +### Event: On search text changed + +This event is triggered whenever the user searches through the options by typing on the dropdown's input box. The corresponding search text will be exposed as `searchText`. + +## Properties + +
+ +ToolJet - Widget Reference - Dropdown + +
+ +### Label + +The text is to be used as the label of the dropdown. + +### Default value + +Value of the default option + +### Option value + +Option values are values for different options in the list of the dropdown. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.value)}}` or populate it with sample values `{{[1,2,3]}}` + +### Option labels + +Option labels are labels for different options in the list of the dropdown. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.label)}}` or populate it with sample values `{{["one", "two", "three"]}}` + +### Options loading state + +Show a loading state in the widget using this property. It is off by default, toggle on to enable it. You can also programmatically set the values `{{true}}` or `{{false}}` by clicking on the `Fx` button. + +## Validation + +### Custom validation + +Add a validation for the options in dropdown widget using the ternary operator. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Dropdown + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
+ +ToolJet - Widget Reference - Dropdown + +
+ +### Border Radius + +Use this property to modify the border radius of the dropdown. The field expects only numerical value from `1` to `100`, default is `0`. + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Selected text color + +Change the text color of the selected option in the widget by providing the `HEX color code` or choosing the color from color picker. + +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +### Align text + +You can align the text inside the widget in following ways: left, right, center, justified + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Exposed variables + +
+ +ToolJet - Widget Reference - Dropdown widget + +
+ +| Variable | Description | +| -------- | ----------- | +| Value | This variable holds the value of the currently selected item on the dropdown. Value can be accesed using `{{components.dropdown1.value}}` | +| searchText | This variable is initially empty and will hold the value whenever the user searches on the dropdown. searchText's value can be accesed using`{{components.dropdown1.searchText}}` | +| label | The variable label holds the label name of the dropdown. label's value can be accesed using`{{components.dropdown1.searchText}}` | +| optionLabels | The optionLabels holds the option labels for the values of the dropdown. optionLabels can be accesed using`{{components.dropdown1.optionLabels}}` for all the option labels in the array form or `{{components.dropdown1.optionLabels[0]}}` for particular option label | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/file-picker.md b/docs/versioned_docs/version-2.3.0/widgets/file-picker.md new file mode 100644 index 0000000000..6d7efd4219 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/file-picker.md @@ -0,0 +1,172 @@ +--- +id: file-picker +title: Filepicker +--- +# Filepicker + +Filepicker widget allows the user to drag and drop files or upload files by browsing the filesystem and selecting one or more files in a directory. + +
+ +ToolJet - Widget Reference - File Picker + +
+ +:::info + File types must be a valid [MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) type according to input element specification or a valid file extension. + + To accept any/all file type(s), set `Accept file types` to an empty value. +::: + +
+ +ToolJet - Widget Reference - File Picker + +
+ +:::tip +[MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) type determination is not reliable across platforms. CSV files, for example, are reported as text/plain under macOS but as application/vnd.ms-excel under Windows. +::: + +## Events + +
+ +ToolJet - Widget Reference - File Picker + +
+ +### On file selected + +On file selected event is triggered when one or more files are selected by the selector dialogue box. + +### On file loaded + +On file loaded event is triggered when a file is loaded in the browser. + +### On file deselected + +On file selected event can be triggered when one or more files are removed from the picker. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +### Instruction Text + +Instruction text can be set to give information on the file picker. + +### Use Drop zone + +Creates a drag & drop zone. Files can be dragged and dropped to the "drag & drop" zone. + +### Use File Picker + +On clicking it invokes the default OS file prompt. + +### Pick multiple files + +Allows drag and drop (or selection from the file dialog) of multiple files. `Pick multiple files` is disabled by default. + +### Max file count + +The maximum accepted number of files The default value is `2`. + +### Accept file types + +By providing types, you can make the dropzone accept specific file types and reject the others. + +### Max size limit + +Maximum file size (in bytes). + +### Min size limit + +Minimum file size (in bytes). + +:::tip +Files can be accepted or rejected based on the file types, maximum file count, maximum file size (in bytes) and minimum file size (in bytes). +If `Pick multiple files` is set to false and additional files are dropped, all files besides the first will be rejected. +Any file that does not have a size in the range of `Max size limit` and `Min size limit` will be rejected. +::: + +## Options + +
+ +ToolJet - Widget Reference - File Picker + +
+ +### Parse content + +Parse the selected files, supports **CSV**, **xls**, and **xlsx** files. + +### File type + +If **Parse content** is enabled, options to auto-detect files and parse content or parse selected file types. + +:::info +- If **Parse content** option is toggled off, **File Type** option will not be available. +- If the **Parse content** option is toggled on, it only parses the next file that is selected, not the already selected one. +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - File Picker + +
+ +## Layout + +
+ +ToolJet - Widget Reference - File Picker + +
+ +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
+ +ToolJet - Widget Reference - File Picker + +
+ +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +### Border Radius + +Use this property to modify the border radius of the filepicker widget. The field expects only numerical value from `1` to `100`, default is `0`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------ | +| `clearFiles()` | It will clear the selected files | None | diff --git a/docs/versioned_docs/version-2.3.0/widgets/form.md b/docs/versioned_docs/version-2.3.0/widgets/form.md new file mode 100644 index 0000000000..8d368d65fd --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/form.md @@ -0,0 +1,76 @@ +--- +id: form +title: Form +--- + +# Form + +Form component can be used to get input from the user and store it in the connected datasource. Form component serves as a parent widget that can store different widgets like texts, input box, dropdown to allow selection, and a button for triggering the event. + +
+ +Form + +
+ +## Properties + +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| Button To Submit Form | The dropdown can be used to select the button that will be used as the submit button for the form | Any button that will be added as a child component inside the form component can be selected from the dropdown | +| Loading state | Loading state can be used to show a spinner as the form content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. | Switch the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}` | + +
+ +Form + +
+ +### Events + +To add an event to a button group, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +#### On submit + +**On submit** event is triggered when the button on the form component is clicked. Just like any other event on ToolJet, you can set multiple handlers for on submit event. + +#### On invalid + +**On invalid** event is triggered when the input on the form is invalid. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +### Layout + +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +
+ +Form + +
+ +| Style | Description | +| ----------- | ----------- | +| Background color | You can change the background color of the form by entering the Hex color code or choosing a color of your choice from the color picker. | +| Border radius | Use this property to modify the border radius of the form component. | +| Border color | You can change the color of the border of the form by entering the Hex color code or choosing a color of your choice from the color picker. | +| Visibility | Toggle on or off to control the visibility of the form. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | Toggle on to lock the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Box shadow | This property adds a shadow to the widget. | You can use different values for box shadow property like offsets, blur, spread, and the color code. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/html.md b/docs/versioned_docs/version-2.3.0/widgets/html.md new file mode 100644 index 0000000000..cdb523f9d7 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/html.md @@ -0,0 +1,72 @@ +--- +id: html +title: HTML +--- + +# HTML + +HTML widget can be used to create your own HTML-CSS layout. + +
+ +HTML component + +
+ +## Properties + +### Raw HTML + +The Raw HTML needs to be an HTML. In order to provide styles, one can add inline css to the respective HTML tags + +**Example:** + +```json + + + +
+
+ You can build your custom HTML-CSS template here +
+
+ + + +``` + +
+ +HTML component + +
+ +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +HTML component + +
+ +## Layout + +| Layout | description | Expected value | +| --------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/icon.md b/docs/versioned_docs/version-2.3.0/widgets/icon.md new file mode 100644 index 0000000000..9cd9fe3bd9 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/icon.md @@ -0,0 +1,64 @@ +--- +id: icon +title: Icon +--- + +An Icon widget can be used to add icons(sourced from icon library). It supports events like on hover and on click. + +
+ +ToolJet - Widget - Icon + +
+ +## Properties + +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| Icon | Use this to choose an icon form the list of available icons | You can also use the search bar in it to look for the icons | + +## Events + +
+ +ToolJet - Widget - Icon + +
+ +To add an event, click on the icon widget's configuration handle to open the widget properties on the components drawer on the right. Go to the **Events** section and click on **+ Add handler**. + +The Icon widget supports the following events: + +| Event | Description | +| ----------- | ----------- | +| On hover | This event is triggered when the cursor is hovered over the icon| +| On click | This event is triggered when the icon is clicked | + +Just like any other event on ToolJet, you can set multiple handlers for any of the above-mentioned events. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General + +Tooltip: Set a tooltip text to specify the information when the user moves the mouse pointer over the widget. + +## Layout + +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to show/hide the widget on desktop screens. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to show/hide the widget on mobile screens. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | Expected value | +| ----------- | ----------- | ------------- | +| Icon color | You can change the color of the icon widget by entering the Hex color code or choosing a color of your choice from the color picker. | +| Visibility | This is to control the visibility of the widget. | If `{{false}}` the widget will not visible after the app is deployed. | It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. | +| Box shadow | This property adds a shadow to the widget. | You can use different values for box shadow property like offsets, blur, spread, and the color code. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/iframe.md b/docs/versioned_docs/version-2.3.0/widgets/iframe.md new file mode 100644 index 0000000000..3157b9f979 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/iframe.md @@ -0,0 +1,67 @@ +--- +id: iframe +title: Iframe +--- +# Iframe + +Iframe widget is used to embed another HTML page into the current one and display iframes in your app. + +
+ +ToolJet - Widget Reference - Iframe + +
+ +## Properties + +### URL + +Set the **URL** of the page to embed. + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Iframe + +
+ +## Layout + +
+ +ToolJet - Widget Reference - Iframe + +
+ +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
+ +ToolJet - Widget Reference - Iframe + +
+ +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/image.md b/docs/versioned_docs/version-2.3.0/widgets/image.md new file mode 100644 index 0000000000..f84ee6f9c3 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/image.md @@ -0,0 +1,107 @@ +--- +id: image +title: Image +--- +# Image + +Image widget is used to display images in your app. + +
+ +ToolJet - Widget Reference - Image + +
+ +## Events + +
+ +ToolJet - Widget Reference - Image + +
+ +### On click + +On click event is triggered when an image is clicked. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +
+ +ToolJet - Widget Reference - Image + +
+ +### URL +Enter the URL of the image to display it on the widget. + +### Loading state +Loading state can be used to show a spinner as the image content. Loading state is commonly used with `isLoading` property of the queries to show a loading status while a query is being run. Switch the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}`. + +### Alternative text +Used for alt text of images. + +### Zoom buttons +Toggle this to enable zoom options inside image. + +### Rotate buttons +Toggle this on to enable rotate button in the image. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Image + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}`. + +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Border type +Choose a border type for the image from available options: +- **None** +- **Rounded** +- **Circle** +- **Thumbnail** + +### Image fit +Choose a image fit - similar to object fit for the image from available options: +- **fill** +- **cover** +- **contain** +- **scale-down** + +### Background color +Add a background color to widget by providing the `HEX color code` or choosing the color of your choice from the color-picker. + +### Padding +Adds padding between the image and widget border. It accepts any numerical value from `0` to `100`. + +### Visibility +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/kanban-board.md b/docs/versioned_docs/version-2.3.0/widgets/kanban-board.md new file mode 100644 index 0000000000..0dbb693192 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/kanban-board.md @@ -0,0 +1,137 @@ +--- +id: kanban +title: Kanban +--- + +# Kanban + +Kanban widget allows you to visually organize and prioritize your tasks with a transparent workflow. You can set the number of columns to display, enable/disable the add cards button, and bind data to the cards. + +
+ +ToolJet - Widget Reference - Kanban widget + +
+ +## Events + +To add an event, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +- **[On update](#on-update)** +- **[On add card click](#on-add-card-click)** +- **[Card removed](#card-removed)** +- **[Card added](#card-added)** +- **[Card moved](#card-moved)** +- **[Card selected](#card-selected)** + +
+ +ToolJet - Widget Reference - Kanban widget + +
+ +Just like any other event on ToolJet, you can set multiple handlers for any of the above mentioned events. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. + +Check the **[Component Specific Action](/docs/next/actions/control-component)** available for Kanban. +::: + +### On Update +On update event is triggered whenever the card data (id, title, description, or columnID) is updated using the component specific actions. + +### On add card click +This event is triggered whenever the **Add card** button on the kanban is clicked. + +### Card removed +This event is triggered whenever the card is **deleted** from the kanban by dragging it into the bottom delete box or using component specific action. + +### Card added +This event is triggered whenever a card is **added** on the kanban using the component specific action. + +### Card moved +This event is triggered whenever the card's position is changed on the kanban or using the component specific action. + +### Card selected +This event is triggered whenever a card is clicked to open the modal. + +## Properties + +
+ +ToolJet - Widget Reference - Kanban widget + +
+ +:::caution +- It is mandatory to provide `id` for each column in the `column data` field. The `id` can be of type `string` or `number`. +- It is mandatory to provide `id`, and `columnId` for each card in the `Card data` field. The `id` and `columnId` can be of type `string` or `number`. +::: + +| Properties | description | Expected value | +| ----------- | ----------- | ----------- | +| Column Data | Enter the columns data - `id` and `title` in the form of array of objects or from a query that returns an array of objects. | `{{[{ "id": "c1", "title": "to do" },{ "id": "c2", "title": "in progress" },{ "id": "c3", "title": "Completed" }]}}` or `{{queries.xyz.data}}` | +| Card Data | Enter the cards data - `id`, `title` and `columnId` in the form of array of objects or from a query that returns an array of objects. | `{{[{ id: "r1", title: "Title 1", description: "Description 1", columnId: "c1" },{ id: "r2", title: "Title 2", description: "Description 2", columnId: "c2" },{ id: "r3", title: "Title 3", description: "Description 3",columnId: "c3" }]}}` or `{{queries.abc.data}}` | +| Card Width | Set the width of the card | This property expects a numerical value. By default, the value is set to `{{302}}` | +| Card Height | Set the width of the card | This property expects a numerical value. By default, the value is set to `{{100}}` | +| Enable Add Card | This property allows you to show or hide the **+Add Cards** button on the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the `Fx` next to it | +| Show Delete button | This property allows you to show or hide the **Drop here to delete cards** section at the bottom of the kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the `Fx` next to it | + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Kanban widget + +
+ +## Layout + +
+ +ToolJet - Widget Reference - Kanban widget + +
+ +| Layout | description | Expected value | +| --------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display the widget in desktop view. | You can programmatically set the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display the widget in mobile view. | You can programmatically set the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +
+ +ToolJet - Widget Reference - Kanban widget + +
+ +| Style | Description | +| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Disable | If disabled or set to `{{false}}` the widget will be locked and becomes non-functional. By default, its disabled i.e. its value is set to `{{true}}` . | +| Visibility | This is to control the visibility of the widget. If `{{false}}`/disabled the widget will not visible after the app is deployed. By default, it's enabled (set to `{{true}}`). | +| Accent color | You can change the accent color of the column title by entering the Hex color code or choosing a color of your choice from the color picker. | + +## Exposed variables + +
+ +ToolJet - Widget Reference - Kanban widget + +
+ +| Variable | Description | +| -------- | ----------- | +| updatedCardData | The `updatedCardData` variable will hold the latest values of all the cards in the kanban. This variable won't have any values initially, it will have values only when any action on any of the card is performed like when the card is moved, added, deleted, or updated. | +| lastAddedCard | The variable `lastAddedCard` holds the values of the the last added card. It holds the following data - `id`, `title`, `description` and `columnId` of the last added card. You can get the values using `{{components.kanban1.lastAddedCard.title}}` | +| lastRemovedCard | The variable `lastRemovedCard` holds the properties of the card that has been recently deleted from the kanban. It holds the following data - `id`, `title`, `description` and `columnId` of the recently deleted card. You can get the values using `{{components.kanbanboard1.lastRemovedCard.title}}` | +| lastCardMovement | The variable `lastCardMovement` holds the properties of the card that has been recently moved from its original position. It holds the following data - `originColumnId`, `destinationColumnId`, `originCardIndex`, `destinationCardIndex` and an object `cardDetails` which includes `id`, `title`, `description` and `columnId` of the moved card. You can get the values using `{{components.kanbanboard1.lastCardMovement.cardDetails.title}}` or `{{components.kanbanboard1.lastCardMovement.destinationCardIndex}}` | +| lastSelectedCard | The variable `lastSelectedCard` holds the `id`, `title`, `columnId`, and `description` of the last selected(clicked to view) card on the kanban. You can get the values using `{{components.kanban1.lastSelectedCard.columnId}}` | +| lastUpdatedCard | The variable `lastUpdatedCard` holds the `id`, `title`, `description`, and `columnId` of the last updated card(using componenet specific action). You can get the values using `{{components.kanban1.lastUpdatedCard.columnId}}` | +| lastCardUpdate | The variable `lastCardUpdate` holds the old an new values of the property that has been changed in the card(using componenet specific action). You can get the values using `{{components.kanban1.lastCardUpdate[0].title.oldValue}}` | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/link.md b/docs/versioned_docs/version-2.3.0/widgets/link.md new file mode 100644 index 0000000000..ca20002102 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/link.md @@ -0,0 +1,68 @@ +--- +id: link +title: Link +--- + +# Link + +Link widget allows you to add a hyperlink and navigate to the external URL. + +
+ +ToolJet - Widget - Link + +
+ +## Properties + +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| Link Target | This property sets the URL where the user needs to be taken on clicking the link | example: `https://dev.to/tooljet` or `{{queries.xyz.data.url}}` | +| Link Text | This property sets the text for the link widget | example: `Click here` or `Open webpage` | +| Target Type | This property specifies the link to be opened in the same tab or new tab on clickinh the link | Options: `New Tab` & `Same Tab` | + +## Events +To add an event to a link, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +### On Click +**On Click** event is triggered when the link is clicked. Just like any other event on ToolJet, you can set multiple handlers for on click event. + +### On hover +**On Hover** event is triggered when the link is hovered. Just like any other event on ToolJet, you can set multiple handlers for on click event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +## Layout + +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to show/hide the widget on desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to show/hide the widget on mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +
+ +ToolJet - Widget - Link + +
+ +| Style | Description | +| ----------- | ----------- | +| Text Color | You can change the background color of the text by entering the Hex color code or choosing a color of your choice from the color picker. | +| Text Size | By default, the text size is set to 14. You can enter any value from 1-100 to set custom text size. | +| Underline | You can change the underline of the text in the following ways: **on-hover (default), never, always** | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/listview.md b/docs/versioned_docs/version-2.3.0/widgets/listview.md new file mode 100644 index 0000000000..41a8d42385 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/listview.md @@ -0,0 +1,140 @@ +--- +id: listview +title: List view +--- +# List view + +List view widget allows to create a list of repeatable rows of data. Just like a container widget, you can nest other widgets inside of it and control how many times they repeat. + +
+ +ToolJet - List view widget + +
+ +## How To Use List view Widget + + + +## Events + +### Row clicked + +
+ +ToolJet - List view widget + +
+ +To add an event to a button, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +**Row clicked** event is triggered when the button is clicked. Just like any other event on ToolJet, you can set multiple actions for a row clicked event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +
+ +ToolJet - List view widget + +
+ +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| List data | Enter the data that you want to display into the widget. Data in the form of an array of objects or data from a query that returns an array of objects.| `{{ [ {id: 0, name: ABC, email: abc@bla.com}, {id: 1, name: XYZ, email: xyz@bla.com} ] }}` or `{{queries.xyz.data}}` | +| Row height | Enter a numerical value to set the row height accordingly. | Any number between `1` to `100` | +| Show bottom border | This property allows you to show or hide the row bottom border. | By default its `{{true}}`, set `{{false}}` to hide the border | +| Enable pagination | Enable it to set the number of rows per page. | Pagination is disabled by default. You can programmatically set to `{{true}}` to show a particular number of rows per page. | + + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - List view widget + +
+ +## Layout + +
+ +ToolJet - List view widget + +
+ +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to display the desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display the mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +
+ +ToolJet - List view widget + +
+ +| Style | Description | +| ----------- | ----------- | +| Background Color | You can change the background color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. | +| Border Color | You can change the border color of the listview by entering the `Hex color code` or choosing a color of your choice from the color picker. | +| Visibility | This is to control the visibility of the widget. If `{{false}}` the widget will not be visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the list view. The field expects only numerical value from `1` to `100`, default is `0`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Example: Displaying data in the list view + +- Let's start by creating a new app and then dragging the List view widget onto the canvas. + +
+ +ToolJet - List view widget + +
+ +- Now lets create a query and select the REST API from the datasource dropdown. Choose the `GET` method and enter the API endpoint - `https://reqres.in/api/users?page=1`. Save this query and fire it. Inspect the query results from the left sidebar, you'll see that it resulted in the `data` object having an array of objects. + +
+ +ToolJet - List view widget + +
+ + +- Now lets edit the `List data` property of the list view widget for displaying the query data. We will use JS to get the data from the query - `{{queries.restapi1.data.data}}`. Here the last `data` is a data object that includes an array of objects, the first `data` is the data resulted from the `restapi1` query. This will automatically create the rows in the widget using the data. + +
+ +ToolJet - List view widget + +
+ + +- Finally, we will need to nest widgets into the first row of list view widget and the widget will automatically create the subsequent instances. The subsequent rows will appear the same way you'll display the data in the first row. + +
+ +ToolJet - List view widget + +
+ + +:::tip + +Use `{{listItem.key}}` to display data on the nested widgets. Example: For displaying the images we used `{{listItem.avatar}}` where **avatar** is one of the key in the objects from the query result. + +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/map.md b/docs/versioned_docs/version-2.3.0/widgets/map.md new file mode 100644 index 0000000000..2469048e68 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/map.md @@ -0,0 +1,87 @@ +--- +id: map +title: Map +--- +# Map + +The map widget can be used to pick or select locations on the Google map with the location's coordinates. + +
+ +ToolJet - Widget Reference - Map + +
+ +## Exposed variables + +Exposed variables can be used to get data from the widget. + +| variable | description | +| ----------- | ----------- | +| bounds | Viewport area of the map | +| center | It contains the locations' coordinates at the center of the bounding area | +| markers | A marker identifies a location on the map. `markers` contains the list of markers on the map | +| selectedMarker | Object with the marker selected by the user | + +## Events + +| events | description | +| ----------- | ----------- | +| On bounds change | Triggered when the bounding area is changed. This event is triggered after `bounds` variable is updated | +| On create marker | This event is triggered when a new marker is created on the map | +| On marker click | This event is triggered when any of the markers in the map is clicked | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +| properties | description | Expected value | +| ----------- | ----------- | ------------------ | +| Initial location | It is the default location's coordinates that the map should focus on. | An object containing the latitude and langitude as key value pairs. ex: `{{ {"lat": 40.7128, "lng": -73.935242} }}` | +| Default Markers | List of markers that should be shown on the map | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}] }}` | +| Add new markers | This property should be enabled to add new markers to the map on click. | `On` by default, toggle `off` to disable adding new markers on the map. Can be programmatically configured by clicking on `Fx`, accepts values `{{true}}` or `{{false}}` | +| Search for places | It can be used to show or hide auto-complete search box. | `On` by default, toggle `off` to disable search on the map. Can be programmatically configured by clicking on `Fx`, accepts values `{{true}}` or `{{false}}` | + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Map + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| `setLocation` | Set map's location. | Latitude and Longitude values as parameters. ex: `component.map1.setLocation(40.7128, -73.935242)` | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/modal.md b/docs/versioned_docs/version-2.3.0/widgets/modal.md new file mode 100644 index 0000000000..eb196123ac --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/modal.md @@ -0,0 +1,101 @@ +--- +id: modal +title: Modal +--- +# Modal + +Modal widget renders in front of a backdrop, and it blocks interaction with the rest of the application until the modal is closed. It can be used to add dialog boxes to your app for lightboxes, user notifications, forms, etc. + +
+ +ToolJet - Widget Reference - Modal + +
+ +## How To Use Modal Widget + + + +## Add widgets to Modal + +To add widgets to the Modals please refer to **[Tutorial - Adding widgets to a modal](/docs/tutorial/adding-widget#adding-widgets-to-modal)** + +## Properties + +### Title + +Title that should be shown on the header of the modal. + +### Loading State + +Loading state can be used to show a spinner on the modal content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. Enable the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}` . + +### Hide title bar + +Enabling this option hides the title bar in the modal. The value `{{true}}` or `{{false}}` can be set programmatically by clicking on the `Fx` button next to it. + +### Hide close button + +Enabling this option hides the close button in the modal. The value `{{true}}` or `{{false}}` can be set programmatically by clicking on the `Fx` button next to it. + +### Hide on escape + +Enabling this option closes the modal(opened) whenever the escape key is pressed. The value `{{true}}` or `{{false}}` can be set programmatically by clicking on the `Fx` button next to it. This property is enabled by default. + +:::info +Now hide the modal by simply clicking anywhere outside the modal (for preview or released apps). +::: + +### Modal size + +Size of the modal. Options are `medium`, `small` and `large`. The default is `small`. You can also programmatically configure the value by clicking on the `Fx` and set the value to `sm`, `md` or `lg`. + +## Options + +### Use default trigger button + +The default trigger button is enabled by default, this button can be used to show the modal. The value `{{true}}` or `{{false}}` can be set programmatically by clicking on the `Fx` button next to it. + +:::info +A modal can be triggered using the default trigger button, [action](/docs/actions/show-modal) or via [JavaScript](/docs/how-to/run-actions-from-runjs#show-modal). +::: + +### Trigger button label + +It can be used to set the label of the trigger button. + +## Events + +Modal supports the following two events: +- **On open** +- **On close** + +:::info +Just like any other event on ToolJet, you can set multiple handlers for the events supported by Modal. Check all the [actions here](/docs/category/actions-reference). +::: + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + + +| Style | Description | value | +| ----------- | ----------- | ------ | +| Header background color | Change the background color of the header in modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Header title color | Change the color of the Title in modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Body background color | Change the background color of the body in modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Visibility | Toggle on or off to control the visibility of the default trigger button that comes with modal | You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the button will not visible after the app is released. By default, it's set to `{{true}}`. | +| Disable | Toggle on to disable the default trigger button that comes with modal | You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the button will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Trigger button background color | Change the background color of the default trigger button of modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Trigger button text color | Change the color of the label in default trigger button of modal | Enter the Hex color code or choose a color of your choice from the color picker | + +:::info +Trigger Button styles are only visible when **Use default trigger button** under Options is toggled on. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/multiselect.md b/docs/versioned_docs/version-2.3.0/widgets/multiselect.md new file mode 100644 index 0000000000..cdc83f7ab9 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/multiselect.md @@ -0,0 +1,89 @@ +--- +id: multiselect +title: Multiselect +--- +# Multiselect + +Multiselect widget can be used to collect multiple user inputs from a list of options. + +
+ +ToolJet - Widget Reference - Multiselect + +
+ +## Events + +### On select + +On select event is triggered when an option is selected. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +### Label + +The text is to be used as the label for the multiselect widget. + +### Default value + +The value of the default option. This should always be an array. +### Option values + +Values for different items/options in the list of the multiselect. + +### Option labels + +Labels for different items/options in the list of the multiselect. + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Multiselect + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Border radius + +Add a border radius to the multiselect using this property. It accepts any numerical value from `0` to `100`. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| `selectOption` | Select options. | pass options as parameter. ex: `components.multiselect1.selectOption(1)` | +| `deselectOption` | Deselect options.| pass options as parameter. ex: `components.multiselect1.deselectOption(1)` | +| `clearSelections` | Clear all selection. | ex: `components.multiselect1.clearSelections()` | + + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/number-input.md b/docs/versioned_docs/version-2.3.0/widgets/number-input.md new file mode 100644 index 0000000000..f72242234c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/number-input.md @@ -0,0 +1,97 @@ +--- +id: number-input +title: Number Input +--- +# Number Input + +Number Input widget lets users enter and change numbers. + +## How To Use Number Input Widget + + + +:::tip +Numbers can be changed by using the arrow keys. +::: + +## Properties + +### Default value + +A predefined value that can be fetched from the number input widget if no changes are made in widget. + +### Minimum value + +It specifies the minimum value the number input can go to. This field accepts any numerical value. + +### Maximum value + +It specifies the maximum value the number input can go to. This field accepts any numerical value. + +### Placeholder +It specifies a hint that describes the expected value. This field accepts any numerical value. + +## Events + +
+ +Events-Number Input + +
+ +### On change +This event fires whenever the value of the number input widget is changed. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +Events-Number Input + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +### Border radius + +Add a border radius to the number input widget using this property. It accepts any numerical value from `0` to `100`. + +### Border color + +Change the border color number-input component by entering the Hex color code or choosing a color of your choice from the color picker. + +### Background color + +Change the background color of the number-input component by entering the Hex color code or choosing a color of your choice from the color picker. + +### Text color + +Change the color of the number in number-input component by entering the Hex color code or choosing a color of your choice from the color picker. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/overview.md b/docs/versioned_docs/version-2.3.0/widgets/overview.md new file mode 100644 index 0000000000..3d87e1b6b8 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/overview.md @@ -0,0 +1,85 @@ +--- +id: overview +title: Overview +--- + +# Components : Overview + +Components are used to build the UI of the applications. They can be dragged onto the canvas from the Component Library and can be modified from the Properties Panel without needing to write any code. **[Event Handlers](/docs/actions/event-handler)** in Components allow end users to trigger queries and other application events to perform the **[Actions](/docs/category/actions-reference)**. + +## Adding components + +Components can be dragged and dropped from the Component Library(from the right side on app builder) on to the canvas. Components can be moved by simply click and hold, and can be resized from edges or borders. + +
+ +Components: Overview + +
+ +### Select multiple components + +For moving the **multiple components** at once, simply **shift+click**, to select multiple components. Once grouped, the components can be moved on the canvas while maintaining their relative positions. + +
+ +Components: Overview + +
+ +You can also create a selection triangle and move multiple components together by `click and drag` + +
+ +Components: Overview + +
+ +:::tip +You can also use many other **[Keyboard Shortcuts](/docs/tutorial/keyboard-shortcuts)** in ToolJet to copy, cut, paste components to the canvas. +::: + +## Component properties + +Each Component can be modified and styled from the Properties Panel such as the **data** field, a toggle for **disabling** the component, or stylings like a **background color**. Properties can be modified directly or programmatically by using **[Bindings](#bindings)**, which enables you to write JavaScript code. + +
+ +Components: Overview + +
+ +## Component Event Handlers + +Event Handlers can be found in the Component's **Property Panel** or in the **Advanced** section of the Query. Event handlers can be used to trigger the queries, perform **[Component Specific Actions - CSA](/docs/actions/control-component)** or for setting a variable. + +:::info Actions +Check all the available Actions **[here](/docs/category/actions-reference)**. +::: + +
+ +Components: Overview + +
+ +## Bindings + +Bindings allow you to get dynamic data into the components. Anything inside of **`{{}}`** is evaluated as a JavaScript expression in ToolJet. + +Any arbitrary JavaScript code can be written inside **`{{}}`**: +```js +{{(function () { + + })() +}} +``` +or +```js +{{components.xyz.data.key === Sun ?? true : false}} +``` + +:::tip +Check out the How-to guides like **[changing color of text in table column](/docs/how-to/access-cellvalue-rowdata)**, **[Enable/Disable a component using JavaScript](/docs/how-to/access-currentuser)**, and **[more](/docs/category/how-to)**. +::: + diff --git a/docs/versioned_docs/version-2.3.0/widgets/package-lock.json b/docs/versioned_docs/version-2.3.0/widgets/package-lock.json new file mode 100644 index 0000000000..624508d7dc --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/package-lock.json @@ -0,0 +1,32216 @@ +{ + "name": "docs", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-google-gtag": "^2.0.0-alpha.73", + "@docusaurus/preset-classic": "2.0.0-alpha.73", + "@mdx-js/react": "^1.6.21", + "clsx": "^1.1.1", + "react": "^17.0.1", + "react-dom": "^17.0.1" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.2.2.tgz", + "integrity": "sha512-JOQaURze45qVa8OOFDh+ozj2a/ObSRsVyz6Zd0aiBeej+RSTqrr1hDVpGNbbXYLW26G5ujuc9QIdH+rBHn95nw==", + "dependencies": { + "@algolia/autocomplete-shared": "1.2.2" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.2.2.tgz", + "integrity": "sha512-AZkh+bAMaJDzMZTelFOXJTJqkp5VPGH8W3n0B+Ggce7DdozlMRsDLguKTCQAkZ0dJ1EbBPyFL5ztL/JImB137Q==", + "dependencies": { + "@algolia/autocomplete-shared": "1.2.2" + }, + "peerDependencies": { + "@algolia/client-search": "^4.9.1", + "algoliasearch": "^4.9.1" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.2.2.tgz", + "integrity": "sha512-mLTl7d2C1xVVazHt/bqh9EE/u2lbp5YOxLDdcjILXmUqOs5HH1D4SuySblXaQG1uf28FhTqMGp35qE5wJQnqAw==" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.5.tgz", + "integrity": "sha512-cfX2rEKOtuuljcGI5DMDHClwZHdDqd2nT2Ohsc8aHtBiz6bUxKVyIqxr2gaC6tU8AgPtrTVBzcxCA+UavXpKww==", + "dependencies": { + "@algolia/cache-common": "4.10.5" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.5.tgz", + "integrity": "sha512-1mClwdmTHll+OnHkG+yeRoFM17kSxDs4qXkjf6rNZhoZGXDvfYLy3YcZ1FX4Kyz0DJv8aroq5RYGBDsWkHj6Tw==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.10.5.tgz", + "integrity": "sha512-+ciQnfIGi5wjMk02XhEY8fmy2pzy+oY1nIIfu8LBOglaSipCRAtjk6WhHc7/KIbXPiYzIwuDbM2K1+YOwSGjwA==", + "dependencies": { + "@algolia/cache-common": "4.10.5" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.10.5.tgz", + "integrity": "sha512-I9UkSS2glXm7RBZYZIALjBMmXSQbw/fI/djPcBHxiwXIheNIlqIFl2SNPkvihpPF979BSkzjqdJNRPhE1vku3Q==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.10.5.tgz", + "integrity": "sha512-h2owwJSkovPxzc+xIsjY1pMl0gj+jdVwP9rcnGjlaTY2fqHbSLrR9yvGyyr6305LvTppxsQnfAbRdE/5Z3eFxw==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.5.tgz", + "integrity": "sha512-21FAvIai5qm8DVmZHm2Gp4LssQ/a0nWwMchAx+1hIRj1TX7OcdW6oZDPyZ8asQdvTtK7rStQrRnD8a95SCUnzA==", + "dependencies": { + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.10.5.tgz", + "integrity": "sha512-nH+IyFKBi8tCyzGOanJTbXC5t4dspSovX3+ABfmwKWUYllYzmiQNFUadpb3qo+MLA3jFx5IwBesjneN6dD5o3w==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.10.5.tgz", + "integrity": "sha512-1eQFMz9uodrc5OM+9HeT+hHcfR1E1AsgFWXwyJ9Q3xejA2c1c4eObGgOgC9ZoshuHHdptaTN1m3rexqAxXRDBg==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.5.tgz", + "integrity": "sha512-gRJo9zt1UYP4k3woEmZm4iuEBIQd/FrArIsjzsL/b+ihNoOqIxZKTSuGFU4UUZOEhvmxDReiA4gzvQXG+TMTmA==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.10.5.tgz", + "integrity": "sha512-4WfIbn4253EDU12u9UiYvz+QTvAXDv39mKNg9xSoMCjKE5szcQxfcSczw2byc6pYhahOJ9PmxPBfs1doqsdTKQ==", + "dependencies": { + "@algolia/logger-common": "4.10.5" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.5.tgz", + "integrity": "sha512-53/MURQEqtK+bGdfq4ITSPwTh5hnADU99qzvpAINGQveUFNSFGERipJxHjTJjIrjFz3vxj5kKwjtxDnU6ygO9g==", + "dependencies": { + "@algolia/requester-common": "4.10.5" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.5.tgz", + "integrity": "sha512-UkVa1Oyuj6NPiAEt5ZvrbVopEv1m/mKqjs40KLB+dvfZnNcj+9Fry4Oxnt15HMy/HLORXsx4UwcthAvBuOXE9Q==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.10.5.tgz", + "integrity": "sha512-aNEKVKXL4fiiC+bS7yJwAHdxln81ieBwY3tsMCtM4zF9f5KwCzY2OtN4WKEZa5AAADVcghSAUdyjs4AcGUlO5w==", + "dependencies": { + "@algolia/requester-common": "4.10.5" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.5.tgz", + "integrity": "sha512-F8DLkmIlvCoMwSCZA3FKHtmdjH3o5clbt0pi2ktFStVNpC6ZDmY307HcK619bKP5xW6h8sVJhcvrLB775D2cyA==", + "dependencies": { + "@algolia/cache-common": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/requester-common": "4.10.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "dependencies": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "dependencies": { + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "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-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dependencies": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "dependencies": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dependencies": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz", + "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "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-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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "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-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "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-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "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-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "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-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "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-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "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-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "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-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "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-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "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-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "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-amd/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==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "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/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==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "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/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==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "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-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "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-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "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-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "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-react-display-name": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", + "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-react-jsx": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "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-runtime": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.8.tgz", + "integrity": "sha512-+6zsde91jMzzvkzuEA3k63zCw+tm/GvuuabkpisgbDMTPQsIMHllE3XczJFFtEHLjjhKQFZmGQVRdELetlWpVw==", + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "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-spread": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz", + "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "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-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "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-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "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-typescript": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.8.tgz", + "integrity": "sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "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-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", + "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@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-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.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.15.8", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "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.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", + "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "dependencies": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "dependencies": { + "commander": "^2.15.1" + }, + "bin": { + "findup": "bin/findup.js" + } + }, + "node_modules/@choojs/findup/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/@docsearch/css": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0-alpha.40.tgz", + "integrity": "sha512-PrOTPgJMl+Iji1zOH0+J0PEDMriJ1teGxbgll7o4h8JrvJW6sJGqQw7/bLW7enWiFaxbJMK76w1yyPNLFHV7Qg==" + }, + "node_modules/@docsearch/react": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0-alpha.40.tgz", + "integrity": "sha512-aKxnu7sgpP1R7jtgOV/pZdJEHXx6Ts+jnS9U/ejSUS2BMUpwQI5SA3oLs1BA5TA9kIViJ5E+rrjh0VsbcsJ6sQ==", + "dependencies": { + "@algolia/autocomplete-core": "1.2.2", + "@algolia/autocomplete-preset-algolia": "1.2.2", + "@docsearch/css": "3.0.0-alpha.40", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 18.0.0", + "react": ">= 16.8.0 < 18.0.0", + "react-dom": ">= 16.8.0 < 18.0.0" + } + }, + "node_modules/@docusaurus/core": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-alpha.73.tgz", + "integrity": "sha512-gUF5UOcy/5XmPWFOpLdiilI+7FEEYtvunB62xnvwEp/SNRvoL9PAs9dI2mFaDkme1RmUtPMXKzPZxwlntFnA9A==", + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/generator": "^7.12.15", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.16", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/preset-react": "^7.12.13", + "@babel/preset-typescript": "^7.12.16", + "@babel/runtime": "^7.12.5", + "@babel/runtime-corejs3": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@docusaurus/cssnano-preset": "2.0.0-alpha.73", + "@docusaurus/react-loadable": "5.5.0", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@endiliey/static-site-generator-webpack-plugin": "^4.0.0", + "@svgr/webpack": "^5.5.0", + "autoprefixer": "^10.2.5", + "babel-loader": "^8.2.2", + "babel-plugin-dynamic-import-node": "2.3.0", + "boxen": "^5.0.0", + "cache-loader": "^4.1.0", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "clean-css": "^5.1.1", + "commander": "^5.1.0", + "copy-webpack-plugin": "^6.4.1", + "core-js": "^3.9.1", + "css-loader": "^5.1.1", + "del": "^6.0.0", + "detect-port": "^1.3.0", + "eta": "^1.12.1", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "globby": "^11.0.2", + "html-minifier-terser": "^5.1.1", + "html-tags": "^3.1.0", + "html-webpack-plugin": "^4.5.0", + "import-fresh": "^3.3.0", + "is-root": "^2.1.0", + "leven": "^3.1.0", + "lodash": "^4.17.20", + "mini-css-extract-plugin": "^0.8.0", + "module-alias": "^2.2.2", + "nprogress": "^0.2.0", + "null-loader": "^4.0.0", + "optimize-css-assets-webpack-plugin": "^5.0.4", + "pnp-webpack-plugin": "^1.6.4", + "postcss": "^8.2.7", + "postcss-loader": "^4.1.0", + "prompts": "^2.4.0", + "react-dev-utils": "^11.0.1", + "react-helmet": "^6.1.0", + "react-loadable": "^5.5.0", + "react-loadable-ssr-addon": "^0.3.0", + "react-router": "^5.2.0", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.2.0", + "resolve-pathname": "^3.0.0", + "rtl-detect": "^1.0.2", + "semver": "^7.3.4", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.4", + "std-env": "^2.2.1", + "terser-webpack-plugin": "^4.1.0", + "tslib": "^2.1.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^5.2.1", + "webpack": "^4.44.1", + "webpack-bundle-analyzer": "^4.4.0", + "webpack-dev-server": "^3.11.2", + "webpack-merge": "^4.2.2", + "webpackbar": "^5.0.0-3" + }, + "bin": { + "docusaurus": "bin/docusaurus.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.73.tgz", + "integrity": "sha512-8DregwCCcKl5h3WAwK/NuTQ8BpXiKUnF8owVE4XAS7OnHXSobKfxz0wpF2Jzi0G8TdVfnZzPrXelnWWDL1mc3g==", + "dependencies": { + "cssnano-preset-advanced": "^4.0.7", + "postcss": "^7.0.2", + "postcss-sort-media-queries": "^1.7.26" + } + }, + "node_modules/@docusaurus/cssnano-preset/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/@docusaurus/cssnano-preset/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@docusaurus/cssnano-preset/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/@docusaurus/mdx-loader": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.73.tgz", + "integrity": "sha512-cteoaLe8rFLULAjRy8iOyKwo9LBupu6VPEvQbjhrM23EWap15LD5b66MmfRsCS8ubTdB1i5uYTVhwg1j41Fxjw==", + "dependencies": { + "@babel/parser": "^7.12.16", + "@babel/traverse": "^7.12.13", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "loader-utils": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.1.0", + "stringify-object": "^3.3.0", + "unist-util-visit": "^2.0.2", + "url-loader": "^4.1.1", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.73.tgz", + "integrity": "sha512-1G5lV+hIhZJPS+Z1/QWEVBB26MtTpgA3V9nMXrivet88LBi97X/O4auat4gzCd1ZAAAIssBqvjJZux3iYYuTZg==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "feed": "^4.2.2", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "reading-time": "^1.3.0", + "remark-admonitions": "^1.2.1", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.73.tgz", + "integrity": "sha512-exMBKvTgJ//AazsXNYx/rSlIOt/8nMebOYNd0YMOrY1HNH3SFiTMln2nf6DhZlqDnC+e3DHxBV1mJJnZCef8xQ==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "combine-promises": "^1.1.0", + "execa": "^5.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "import-fresh": "^3.2.2", + "js-yaml": "^4.0.0", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "remark-admonitions": "^1.2.1", + "shelljs": "^0.8.4", + "tslib": "^2.1.0", + "utility-types": "^3.10.0", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs/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==" + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@docusaurus/plugin-content-docs/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/@docusaurus/plugin-content-docs/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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs/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/@docusaurus/plugin-content-pages": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.73.tgz", + "integrity": "sha512-/q9B+N3ICWlnI5mm58lMXhzWit7IP3ntY1snfy8qD98wEfWKLZwefdxnB1HI+qJXBQq5uQTWIe9lULaN/gbDzw==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "remark-admonitions": "^1.2.1", + "slash": "^3.0.0", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.73.tgz", + "integrity": "sha512-EdovLNi8oxLFZDi/7lfLwfmgbaWFR/wOZqOYuyrHJto/TlqCCIOziX4dHYqUPHItbnwV1PGGR49DUrqyNYuLBQ==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "react-json-view": "^1.21.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.73.tgz", + "integrity": "sha512-t3Noo80wT412IMI4vnapWVpfm5PBhYPQpXQxVIZap61K2CT1lAkelyi43vREWt80HwCjXh5HvoR2TxCdGwi6nA==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.73.tgz", + "integrity": "sha512-DqrmV4eW81DzlAJrqMiki+m4tTUlpPkUL7sNemVjzqVl4616tng7wa93FcNw3sZbVm1Kp69Hep3uN2OgRmEqRQ==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.73.tgz", + "integrity": "sha512-APBI/l8T5lsfEYvRZ0ipzZlUlKX/4x47w3WfIvlqS78vk7WHAXa0tEp3S8FK36TqeTjmdmCP0F4DJCY7UJZCSw==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "fs-extra": "^9.1.0", + "sitemap": "^6.3.6", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-eXgwPVMXA9K9FmGrXwOeec9Uqr0KXMdHvx3C5Ocm4E7b/mylMGwykOgR9iaSLYdVY12EKrO7T9Lm3Z37Gll7Zw==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/plugin-debug": "2.0.0-alpha.73", + "@docusaurus/plugin-google-analytics": "2.0.0-alpha.73", + "@docusaurus/plugin-google-gtag": "2.0.0-alpha.73", + "@docusaurus/plugin-sitemap": "2.0.0-alpha.73", + "@docusaurus/theme-classic": "2.0.0-alpha.73", + "@docusaurus/theme-search-algolia": "2.0.0-alpha.73" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==", + "dependencies": { + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-SVjq3xPIFQ/Uzs6WJn+8Gm1b47jLV7YBbcUXpIGd3NBKj16yZml9t7YNpos6Vt7Y5mCVhIP4IqWYJshArw6Aog==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "chalk": "^4.1.0", + "clsx": "^1.1.1", + "copy-text-to-clipboard": "^3.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "infima": "0.2.0-alpha.22", + "lodash": "^4.17.20", + "parse-numeric-range": "^1.2.0", + "postcss": "^7.0.2", + "prism-react-renderer": "^1.1.1", + "prismjs": "^1.23.0", + "prop-types": "^15.7.2", + "react-router-dom": "^5.2.0", + "rtlcss": "^2.6.2" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-classic/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/@docusaurus/theme-classic/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@docusaurus/theme-classic/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/@docusaurus/theme-common": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.73.tgz", + "integrity": "sha512-ePteJFQkQRkK+J1FKDhmczq+yiEmORTW9YJgYceQVq+9L6unr0XxeOBBNC27BxSabUI+A9YXjQbtdmOHFM8LKA==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "prism-react-renderer": "^1.1.1", + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.73.tgz", + "integrity": "sha512-SMfeGYZb85GIcuUjefMN+RunLDK+x6ETnlGuY9LU2S6bvoaZ4YTcqBPOt0iyZ1LH+XZmFuz78lFDW1gklaNmfg==", + "dependencies": { + "@docsearch/react": "^3.0.0-alpha.33", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "algoliasearch": "^4.8.4", + "algoliasearch-helper": "^3.3.4", + "clsx": "^1.1.1", + "eta": "^1.12.1", + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-alpha.73.tgz", + "integrity": "sha512-+q7q178LS2mMTGD/U5KgloLGKtG8yzpqj+NOp2QprjFVqTfkwTFcMhN33PTZTUcDunMDuUt+LOo9hi9Vz9+r5Q==", + "dependencies": { + "@types/webpack": "^4.41.0", + "commander": "^5.1.0", + "joi": "^17.4.0", + "querystring": "0.2.0", + "webpack-merge": "^4.2.2" + } + }, + "node_modules/@docusaurus/utils": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-alpha.73.tgz", + "integrity": "sha512-kUHnE1b/3yNWNAn0V8owLgCrxqyxfolkCbkPFfnRT+4m+agyn3riEcr+ZVObs7K9nxCla8oklX5RKSJGzyqWww==", + "dependencies": { + "@docusaurus/types": "2.0.0-alpha.73", + "@types/github-slugger": "^1.3.0", + "chalk": "^4.1.0", + "escape-string-regexp": "^4.0.0", + "fs-extra": "^9.1.0", + "gray-matter": "^4.0.2", + "lodash": "^4.17.20", + "resolve-pathname": "^3.0.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.73.tgz", + "integrity": "sha512-A36kKC+tCy/MGXdaK7emH2CHyHKru/+Td9zCm6fvNdNbu+dDNvEddTZ3ecjB0zNdDZM25Er4+KIo9GV3vnJ8Rg==", + "dependencies": { + "@docusaurus/utils": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "joi": "^17.4.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@docusaurus/utils/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@endiliey/static-site-generator-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng==", + "dependencies": { + "bluebird": "^3.7.1", + "cheerio": "^0.22.0", + "eval": "^0.1.4", + "url": "^0.11.0", + "webpack-sources": "^1.4.3" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + }, + "node_modules/@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/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/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "node_modules/@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/github-slugger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", + "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==" + }, + "node_modules/@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + }, + "node_modules/@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "node_modules/@types/node": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.0.tgz", + "integrity": "sha512-8MLkBIYQMuhRBQzGN9875bYsOhPnf/0rgXGo66S2FemHkhbn9qtsz9ywV1iCG+vbjigE4WUNVvw37Dx+L0qsPg==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "node_modules/@types/sax": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.3.tgz", + "integrity": "sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "node_modules/@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + }, + "node_modules/@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/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/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@types/webpack": { + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/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/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "engines": { + "node": ">= 0.12.0" + } + }, + "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/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.10.5.tgz", + "integrity": "sha512-KmH2XkiN+8FxhND4nWFbQDkIoU6g2OjfeU9kIv4Lb+EiOOs3Gpp7jvd+JnatsCisAZsnWQdjd7zVlW7I/85QvQ==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.10.5", + "@algolia/cache-common": "4.10.5", + "@algolia/cache-in-memory": "4.10.5", + "@algolia/client-account": "4.10.5", + "@algolia/client-analytics": "4.10.5", + "@algolia/client-common": "4.10.5", + "@algolia/client-personalization": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/logger-console": "4.10.5", + "@algolia/requester-browser-xhr": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/requester-node-http": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.6.0.tgz", + "integrity": "sha512-F4Smiq+Vyv/JJytuKNFuzXndPSb4pjtiHZSkEztQCcB+SORu71A8grgt2NSJhbB5VhqHW19QDtlPKbdYdcNrLg==", + "dependencies": { + "events": "^1.1.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 5" + } + }, + "node_modules/algoliasearch-helper/node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "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-escapes/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/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + }, + "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/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "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==", + "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==" + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "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/autoprefixer": { + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.7.tgz", + "integrity": "sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg==", + "dependencies": { + "browserslist": "^4.17.3", + "caniuse-lite": "^1.0.30001264", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "picocolors": "^0.2.1", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/autoprefixer/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + }, + "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/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "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/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/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==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", + "dependencies": { + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", + "escalade": "^3.1.1", + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "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-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==" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "node_modules/buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "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": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/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/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/cache-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/cache-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/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/cacheable-request/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/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "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/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001267", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz", + "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/chalk/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/chalk/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/chalk/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/chalk/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/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/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio/node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/cheerio/node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "engines": { + "node": "*" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "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/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "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==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.1.tgz", + "integrity": "sha512-ooQCa1/70oRfVdUUGjKpbHuxgMgm8BsDT5EBqBGvPxMoRoGXf4PNx5mMnkjzJ9Ptx4vvmDdha0QVh86QtYIk1g==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-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/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-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/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==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/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/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "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/concat-stream/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/concat-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/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "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==" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "dependencies": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/core-js": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.3.tgz", + "integrity": "sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz", + "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==", + "dependencies": { + "browserslist": "^4.17.3", + "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==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz", + "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-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/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "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==" + }, + "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==", + "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==", + "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-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "dependencies": { + "node-fetch": "2.6.1" + } + }, + "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/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==", + "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/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-declaration-sorter/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/css-declaration-sorter/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-declaration-sorter/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/css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.8.tgz", + "integrity": "sha512-DlZ5+XNKwB3ZnrtJ7jdj8WxT5Zgt1WIr4gdP9v1Sdn3SObqcLwbBobQaM7BqLIVHS74TE5iWn2TSYmOVSsmozQ==", + "dependencies": { + "autoprefixer": "^9.4.7", + "cssnano-preset-default": "^4.0.8", + "postcss-discard-unused": "^4.0.1", + "postcss-merge-idents": "^4.0.1", + "postcss-reduce-idents": "^4.0.2", + "postcss-zindex": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-advanced/node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/cssnano-preset-advanced/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano-preset-advanced/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-preset-advanced/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/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano-preset-default/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-preset-default/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/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano-util-raw-cache/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-raw-cache/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/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/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/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/csso/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/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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==", + "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==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "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==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "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/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/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/duplexify/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/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.870", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.870.tgz", + "integrity": "sha512-PiJMshfq6PL+i1V+nKLwhHbCKeD8eAz8rvO9Cwk/7cChOHJBtufmjajLyYLsSRHguRFiOCVx3XzJLeZsIAYfSA==" + }, + "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==", + "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==" + }, + "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/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "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/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enhanced-resolve/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/enhanced-resolve/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/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "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/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.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==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.6.tgz", + "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==", + "dependencies": { + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "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-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-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "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==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", + "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", + "dependencies": { + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "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-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", + "engines": { + "node": ">= 0.4.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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/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/flush-write-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/flux": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.2.tgz", + "integrity": "sha512-u/ucO5ezm3nBvdaSGkWpDlzCePoV+a9x3KHmy13TV/5MzOaCZDN8Mfd94jmf0nOi8ZZay+nOKbBUkOe2VNaupQ==", + "dependencies": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.0" + }, + "peerDependencies": { + "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "engines": { + "node": ">=6.11.5", + "yarn": ">=1.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/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/from2/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/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-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs-write-stream-atomic/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/fs-write-stream-atomic/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/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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/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==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/github-slugger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/global-dirs/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/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "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": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "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/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/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/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/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/hpack.js/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/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier-terser/node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-minifier-terser/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/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "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-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "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==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "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/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/infima": { + "version": "0.2.0-alpha.22", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.22.tgz", + "integrity": "sha512-wKOWp4C1lTFG/h54UWD3Uf6VEsj5qYehM3ZVio3GBzIQuY8B3cTiwG7ZRNoobg+LvdQA21p5BJTugpTLQJLIrA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-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==", + "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==" + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dependencies": { + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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/jest-worker/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/joi": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz", + "integrity": "sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.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==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "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/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dependencies": { + "minimist": "^1.2.5" + }, + "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/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dependencies": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "node_modules/lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + }, + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "node_modules/lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "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.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "node_modules/lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + }, + "node_modules/lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + }, + "node_modules/lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "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==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "dependencies": { + "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/memory-fs/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/memory-fs/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/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "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==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "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==", + "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==" + }, + "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.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "dependencies": { + "mime-db": "1.50.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", + "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==", + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "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==" + }, + "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": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/minipass": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/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/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "node_modules/nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/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/node-libs-browser/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/node-releases": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "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-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/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/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "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==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz", + "integrity": "sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==", + "dependencies": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-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-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parallel-transform/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/parallel-transform/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/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "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/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "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==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "node_modules/path-key": { + "version": "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==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "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/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/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/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", + "integrity": "sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==", + "dependencies": { + "nanoid": "^3.1.28", + "picocolors": "^0.2.1", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-calc/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-calc/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc/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/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-colormin/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-colormin/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/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-convert-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-convert-values/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/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-comments/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/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-duplicates/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-duplicates/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/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-empty/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-empty/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/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-overridden/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/postcss-discard-unused": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz", + "integrity": "sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-unused/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-unused/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-discard-unused/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/postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/postcss-merge-idents": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz", + "integrity": "sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==", + "dependencies": { + "cssnano-util-same-parent": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-merge-idents/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-idents/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-merge-idents/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/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-merge-longhand/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/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-merge-rules/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-merge-rules/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/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-font-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-font-values/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/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-gradients/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/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-params/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/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-selectors/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/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-charset/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-charset/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/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-display-values/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/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-positions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-positions/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/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-repeat-style/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/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-string/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-string/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/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-timing-functions/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/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-unicode/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/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-url/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-url/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/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-whitespace/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/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-ordered-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-ordered-values/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/postcss-reduce-idents": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz", + "integrity": "sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-reduce-idents/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-idents/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-reduce-idents/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/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-reduce-initial/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-initial/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/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-reduce-transforms/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/postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "1.31.21", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz", + "integrity": "sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg==", + "dependencies": { + "postcss": "^7.0.27", + "sort-css-media-queries": "1.5.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-sort-media-queries/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-sort-media-queries/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-sort-media-queries/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/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-svgo/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-svgo/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/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-unique-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-unique-selectors/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/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "node_modules/postcss-zindex": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-4.0.1.tgz", + "integrity": "sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-zindex/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-zindex/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-zindex/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/postcss/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz", + "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==", + "peerDependencies": { + "react": ">=0.14.9" + } + }, + "node_modules/prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "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/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "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==" + }, + "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/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "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": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "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==", + "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/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "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==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "dependencies": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "node_modules/react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "dependencies": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-dev-utils/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/react-dev-utils/node_modules/browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "dependencies": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + }, + "node_modules/react-dev-utils/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/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/react-dev-utils/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/react-dev-utils/node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/react-dev-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/react-dev-utils/node_modules/node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==" + }, + "node_modules/react-dev-utils/node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-dev-utils/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "node_modules/react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.3.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==" + }, + "node_modules/react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "dependencies": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + }, + "peerDependencies": { + "react": "^17.0.0 || ^16.3.0 || ^15.5.4", + "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", + "dependencies": { + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.3.0.tgz", + "integrity": "sha512-E+lnmDakV0k6ut6R2J77vurwCOwTKEwKlHs9S62G8ez+ujecLPcqjt3YAU8M58kIGjp2QjFlZ7F9QWkq/mr6Iw==", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=4.2.4" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1" + } + }, + "node_modules/react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/react-router/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/react-side-effect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", + "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0" + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", + "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.0.0", + "use-latest": "^1.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.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==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "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==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "node_modules/regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "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": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "dependencies": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "dependencies": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "dependencies": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-admonitions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", + "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", + "dependencies": { + "rehype-parse": "^6.0.2", + "unified": "^8.4.2", + "unist-util-visit": "^2.0.1" + } + }, + "node_modules/remark-admonitions/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/remark-admonitions/node_modules/unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "dependencies": { + "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/renderkid/node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=", + "engines": { + "node": "*" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "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==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "node_modules/rtlcss": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.6.2.tgz", + "integrity": "sha512-06LFAr+GAPo+BvaynsXRfoYTJvSaWRyOhURCQ7aeI1MKph9meM222F+Zkt3bDamyHHJuGi3VPtiRkpyswmQbGA==", + "dependencies": { + "@choojs/findup": "^0.2.1", + "chalk": "^2.4.2", + "mkdirp": "^0.5.1", + "postcss": "^6.0.23", + "strip-json-comments": "^2.0.0" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + } + }, + "node_modules/rtlcss/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/rtlcss/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/rtlcss/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/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==", + "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/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "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/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", + "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.0.4", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-handler/node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/serve-handler/node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "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==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "node_modules/shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/sitemap": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-6.4.0.tgz", + "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==", + "dependencies": { + "@types/node": "^14.14.28", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=10.3.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "14.17.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.27.tgz", + "integrity": "sha512-94+Ahf9IcaDuJTle/2b+wzvjmutxXAEXU6O81JHblYXUg2BDG+dnBy7VxIPHKAyEEDHzCMQydTJuWvrE+Aanzw==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + } + }, + "node_modules/sockjs-client/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/sort-css-media-queries": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz", + "integrity": "sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw==", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "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==", + "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-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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/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==" + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/std-env": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.1.tgz", + "integrity": "sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g==", + "dependencies": { + "ci-info": "^3.1.1" + } + }, + "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==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-browserify/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/stream-browserify/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/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-http/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/stream-http/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/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "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_decoder/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/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.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "engines": { + "node": ">=0.10.0" + } + }, + "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-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/stylehacks/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylehacks/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/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/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/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/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar/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/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dependencies": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser/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/terser/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/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/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/through2/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/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "node_modules/tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "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": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-essentials": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", + "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "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==", + "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==", + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/unified/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/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": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-parse-lax/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-composed-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", + "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", + "dependencies": { + "ts-essentials": "^2.0.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", + "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", + "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "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/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/wait-on": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", + "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "dependencies": { + "axios": "^0.21.1", + "joi": "^17.3.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^6.6.3" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "optional": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "optional": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/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==", + "optional": true, + "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/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/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==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/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/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/webpack/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/webpack/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/webpack/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/webpack/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/webpack/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/webpackbar": { + "version": "5.0.0-3", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.0-3.tgz", + "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.1.0", + "consola": "^2.15.0", + "figures": "^3.2.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "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": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "dependencies": { + "microevent.ts": "~0.1.1" + } + }, + "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": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.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": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "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/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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==" + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/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==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.2.2.tgz", + "integrity": "sha512-JOQaURze45qVa8OOFDh+ozj2a/ObSRsVyz6Zd0aiBeej+RSTqrr1hDVpGNbbXYLW26G5ujuc9QIdH+rBHn95nw==", + "requires": { + "@algolia/autocomplete-shared": "1.2.2" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.2.2.tgz", + "integrity": "sha512-AZkh+bAMaJDzMZTelFOXJTJqkp5VPGH8W3n0B+Ggce7DdozlMRsDLguKTCQAkZ0dJ1EbBPyFL5ztL/JImB137Q==", + "requires": { + "@algolia/autocomplete-shared": "1.2.2" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.2.2.tgz", + "integrity": "sha512-mLTl7d2C1xVVazHt/bqh9EE/u2lbp5YOxLDdcjILXmUqOs5HH1D4SuySblXaQG1uf28FhTqMGp35qE5wJQnqAw==" + }, + "@algolia/cache-browser-local-storage": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.5.tgz", + "integrity": "sha512-cfX2rEKOtuuljcGI5DMDHClwZHdDqd2nT2Ohsc8aHtBiz6bUxKVyIqxr2gaC6tU8AgPtrTVBzcxCA+UavXpKww==", + "requires": { + "@algolia/cache-common": "4.10.5" + } + }, + "@algolia/cache-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.5.tgz", + "integrity": "sha512-1mClwdmTHll+OnHkG+yeRoFM17kSxDs4qXkjf6rNZhoZGXDvfYLy3YcZ1FX4Kyz0DJv8aroq5RYGBDsWkHj6Tw==" + }, + "@algolia/cache-in-memory": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.10.5.tgz", + "integrity": "sha512-+ciQnfIGi5wjMk02XhEY8fmy2pzy+oY1nIIfu8LBOglaSipCRAtjk6WhHc7/KIbXPiYzIwuDbM2K1+YOwSGjwA==", + "requires": { + "@algolia/cache-common": "4.10.5" + } + }, + "@algolia/client-account": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.10.5.tgz", + "integrity": "sha512-I9UkSS2glXm7RBZYZIALjBMmXSQbw/fI/djPcBHxiwXIheNIlqIFl2SNPkvihpPF979BSkzjqdJNRPhE1vku3Q==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-analytics": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.10.5.tgz", + "integrity": "sha512-h2owwJSkovPxzc+xIsjY1pMl0gj+jdVwP9rcnGjlaTY2fqHbSLrR9yvGyyr6305LvTppxsQnfAbRdE/5Z3eFxw==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.5.tgz", + "integrity": "sha512-21FAvIai5qm8DVmZHm2Gp4LssQ/a0nWwMchAx+1hIRj1TX7OcdW6oZDPyZ8asQdvTtK7rStQrRnD8a95SCUnzA==", + "requires": { + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-personalization": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.10.5.tgz", + "integrity": "sha512-nH+IyFKBi8tCyzGOanJTbXC5t4dspSovX3+ABfmwKWUYllYzmiQNFUadpb3qo+MLA3jFx5IwBesjneN6dD5o3w==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-search": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.10.5.tgz", + "integrity": "sha512-1eQFMz9uodrc5OM+9HeT+hHcfR1E1AsgFWXwyJ9Q3xejA2c1c4eObGgOgC9ZoshuHHdptaTN1m3rexqAxXRDBg==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/logger-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.5.tgz", + "integrity": "sha512-gRJo9zt1UYP4k3woEmZm4iuEBIQd/FrArIsjzsL/b+ihNoOqIxZKTSuGFU4UUZOEhvmxDReiA4gzvQXG+TMTmA==" + }, + "@algolia/logger-console": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.10.5.tgz", + "integrity": "sha512-4WfIbn4253EDU12u9UiYvz+QTvAXDv39mKNg9xSoMCjKE5szcQxfcSczw2byc6pYhahOJ9PmxPBfs1doqsdTKQ==", + "requires": { + "@algolia/logger-common": "4.10.5" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.5.tgz", + "integrity": "sha512-53/MURQEqtK+bGdfq4ITSPwTh5hnADU99qzvpAINGQveUFNSFGERipJxHjTJjIrjFz3vxj5kKwjtxDnU6ygO9g==", + "requires": { + "@algolia/requester-common": "4.10.5" + } + }, + "@algolia/requester-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.5.tgz", + "integrity": "sha512-UkVa1Oyuj6NPiAEt5ZvrbVopEv1m/mKqjs40KLB+dvfZnNcj+9Fry4Oxnt15HMy/HLORXsx4UwcthAvBuOXE9Q==" + }, + "@algolia/requester-node-http": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.10.5.tgz", + "integrity": "sha512-aNEKVKXL4fiiC+bS7yJwAHdxln81ieBwY3tsMCtM4zF9f5KwCzY2OtN4WKEZa5AAADVcghSAUdyjs4AcGUlO5w==", + "requires": { + "@algolia/requester-common": "4.10.5" + } + }, + "@algolia/transporter": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.5.tgz", + "integrity": "sha512-F8DLkmIlvCoMwSCZA3FKHtmdjH3o5clbt0pi2ktFStVNpC6ZDmY307HcK619bKP5xW6h8sVJhcvrLB775D2cyA==", + "requires": { + "@algolia/cache-common": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/requester-common": "4.10.5" + } + }, + "@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + }, + "@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "requires": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "requires": { + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + }, + "@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "requires": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "requires": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz", + "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@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==", + "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==", + "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==", + "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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "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==", + "requires": { + "object.assign": "^4.1.0" + } + } + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "requires": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "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==", + "requires": { + "object.assign": "^4.1.0" + } + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "requires": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "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==", + "requires": { + "object.assign": "^4.1.0" + } + } + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.8.tgz", + "integrity": "sha512-+6zsde91jMzzvkzuEA3k63zCw+tm/GvuuabkpisgbDMTPQsIMHllE3XczJFFtEHLjjhKQFZmGQVRdELetlWpVw==", + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz", + "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.8.tgz", + "integrity": "sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", + "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@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-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.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.15.8", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "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.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + } + }, + "@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + } + }, + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", + "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "requires": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "requires": { + "commander": "^2.15.1" + }, + "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==" + } + } + }, + "@docsearch/css": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0-alpha.40.tgz", + "integrity": "sha512-PrOTPgJMl+Iji1zOH0+J0PEDMriJ1teGxbgll7o4h8JrvJW6sJGqQw7/bLW7enWiFaxbJMK76w1yyPNLFHV7Qg==" + }, + "@docsearch/react": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0-alpha.40.tgz", + "integrity": "sha512-aKxnu7sgpP1R7jtgOV/pZdJEHXx6Ts+jnS9U/ejSUS2BMUpwQI5SA3oLs1BA5TA9kIViJ5E+rrjh0VsbcsJ6sQ==", + "requires": { + "@algolia/autocomplete-core": "1.2.2", + "@algolia/autocomplete-preset-algolia": "1.2.2", + "@docsearch/css": "3.0.0-alpha.40", + "algoliasearch": "^4.0.0" + } + }, + "@docusaurus/core": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-alpha.73.tgz", + "integrity": "sha512-gUF5UOcy/5XmPWFOpLdiilI+7FEEYtvunB62xnvwEp/SNRvoL9PAs9dI2mFaDkme1RmUtPMXKzPZxwlntFnA9A==", + "requires": { + "@babel/core": "^7.12.16", + "@babel/generator": "^7.12.15", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.16", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/preset-react": "^7.12.13", + "@babel/preset-typescript": "^7.12.16", + "@babel/runtime": "^7.12.5", + "@babel/runtime-corejs3": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@docusaurus/cssnano-preset": "2.0.0-alpha.73", + "@docusaurus/react-loadable": "5.5.0", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@endiliey/static-site-generator-webpack-plugin": "^4.0.0", + "@svgr/webpack": "^5.5.0", + "autoprefixer": "^10.2.5", + "babel-loader": "^8.2.2", + "babel-plugin-dynamic-import-node": "2.3.0", + "boxen": "^5.0.0", + "cache-loader": "^4.1.0", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "clean-css": "^5.1.1", + "commander": "^5.1.0", + "copy-webpack-plugin": "^6.4.1", + "core-js": "^3.9.1", + "css-loader": "^5.1.1", + "del": "^6.0.0", + "detect-port": "^1.3.0", + "eta": "^1.12.1", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "globby": "^11.0.2", + "html-minifier-terser": "^5.1.1", + "html-tags": "^3.1.0", + "html-webpack-plugin": "^4.5.0", + "import-fresh": "^3.3.0", + "is-root": "^2.1.0", + "leven": "^3.1.0", + "lodash": "^4.17.20", + "mini-css-extract-plugin": "^0.8.0", + "module-alias": "^2.2.2", + "nprogress": "^0.2.0", + "null-loader": "^4.0.0", + "optimize-css-assets-webpack-plugin": "^5.0.4", + "pnp-webpack-plugin": "^1.6.4", + "postcss": "^8.2.7", + "postcss-loader": "^4.1.0", + "prompts": "^2.4.0", + "react-dev-utils": "^11.0.1", + "react-helmet": "^6.1.0", + "react-loadable": "^5.5.0", + "react-loadable-ssr-addon": "^0.3.0", + "react-router": "^5.2.0", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.2.0", + "resolve-pathname": "^3.0.0", + "rtl-detect": "^1.0.2", + "semver": "^7.3.4", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.4", + "std-env": "^2.2.1", + "terser-webpack-plugin": "^4.1.0", + "tslib": "^2.1.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^5.2.1", + "webpack": "^4.44.1", + "webpack-bundle-analyzer": "^4.4.0", + "webpack-dev-server": "^3.11.2", + "webpack-merge": "^4.2.2", + "webpackbar": "^5.0.0-3" + } + }, + "@docusaurus/cssnano-preset": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.73.tgz", + "integrity": "sha512-8DregwCCcKl5h3WAwK/NuTQ8BpXiKUnF8owVE4XAS7OnHXSobKfxz0wpF2Jzi0G8TdVfnZzPrXelnWWDL1mc3g==", + "requires": { + "cssnano-preset-advanced": "^4.0.7", + "postcss": "^7.0.2", + "postcss-sort-media-queries": "^1.7.26" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@docusaurus/mdx-loader": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.73.tgz", + "integrity": "sha512-cteoaLe8rFLULAjRy8iOyKwo9LBupu6VPEvQbjhrM23EWap15LD5b66MmfRsCS8ubTdB1i5uYTVhwg1j41Fxjw==", + "requires": { + "@babel/parser": "^7.12.16", + "@babel/traverse": "^7.12.13", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "loader-utils": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.1.0", + "stringify-object": "^3.3.0", + "unist-util-visit": "^2.0.2", + "url-loader": "^4.1.1", + "webpack": "^4.44.1" + } + }, + "@docusaurus/plugin-content-blog": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.73.tgz", + "integrity": "sha512-1G5lV+hIhZJPS+Z1/QWEVBB26MtTpgA3V9nMXrivet88LBi97X/O4auat4gzCd1ZAAAIssBqvjJZux3iYYuTZg==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "feed": "^4.2.2", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "reading-time": "^1.3.0", + "remark-admonitions": "^1.2.1", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "@docusaurus/plugin-content-docs": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.73.tgz", + "integrity": "sha512-exMBKvTgJ//AazsXNYx/rSlIOt/8nMebOYNd0YMOrY1HNH3SFiTMln2nf6DhZlqDnC+e3DHxBV1mJJnZCef8xQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "combine-promises": "^1.1.0", + "execa": "^5.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "import-fresh": "^3.2.2", + "js-yaml": "^4.0.0", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "remark-admonitions": "^1.2.1", + "shelljs": "^0.8.4", + "tslib": "^2.1.0", + "utility-types": "^3.10.0", + "webpack": "^4.44.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "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" + } + } + } + }, + "@docusaurus/plugin-content-pages": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.73.tgz", + "integrity": "sha512-/q9B+N3ICWlnI5mm58lMXhzWit7IP3ntY1snfy8qD98wEfWKLZwefdxnB1HI+qJXBQq5uQTWIe9lULaN/gbDzw==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "remark-admonitions": "^1.2.1", + "slash": "^3.0.0", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "@docusaurus/plugin-debug": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.73.tgz", + "integrity": "sha512-EdovLNi8oxLFZDi/7lfLwfmgbaWFR/wOZqOYuyrHJto/TlqCCIOziX4dHYqUPHItbnwV1PGGR49DUrqyNYuLBQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "react-json-view": "^1.21.1", + "tslib": "^2.1.0" + } + }, + "@docusaurus/plugin-google-analytics": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.73.tgz", + "integrity": "sha512-t3Noo80wT412IMI4vnapWVpfm5PBhYPQpXQxVIZap61K2CT1lAkelyi43vREWt80HwCjXh5HvoR2TxCdGwi6nA==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73" + } + }, + "@docusaurus/plugin-google-gtag": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.73.tgz", + "integrity": "sha512-DqrmV4eW81DzlAJrqMiki+m4tTUlpPkUL7sNemVjzqVl4616tng7wa93FcNw3sZbVm1Kp69Hep3uN2OgRmEqRQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73" + } + }, + "@docusaurus/plugin-sitemap": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.73.tgz", + "integrity": "sha512-APBI/l8T5lsfEYvRZ0ipzZlUlKX/4x47w3WfIvlqS78vk7WHAXa0tEp3S8FK36TqeTjmdmCP0F4DJCY7UJZCSw==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "fs-extra": "^9.1.0", + "sitemap": "^6.3.6", + "tslib": "^2.1.0" + } + }, + "@docusaurus/preset-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-eXgwPVMXA9K9FmGrXwOeec9Uqr0KXMdHvx3C5Ocm4E7b/mylMGwykOgR9iaSLYdVY12EKrO7T9Lm3Z37Gll7Zw==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/plugin-debug": "2.0.0-alpha.73", + "@docusaurus/plugin-google-analytics": "2.0.0-alpha.73", + "@docusaurus/plugin-google-gtag": "2.0.0-alpha.73", + "@docusaurus/plugin-sitemap": "2.0.0-alpha.73", + "@docusaurus/theme-classic": "2.0.0-alpha.73", + "@docusaurus/theme-search-algolia": "2.0.0-alpha.73" + } + }, + "@docusaurus/react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==", + "requires": { + "prop-types": "^15.6.2" + } + }, + "@docusaurus/theme-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-SVjq3xPIFQ/Uzs6WJn+8Gm1b47jLV7YBbcUXpIGd3NBKj16yZml9t7YNpos6Vt7Y5mCVhIP4IqWYJshArw6Aog==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "chalk": "^4.1.0", + "clsx": "^1.1.1", + "copy-text-to-clipboard": "^3.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "infima": "0.2.0-alpha.22", + "lodash": "^4.17.20", + "parse-numeric-range": "^1.2.0", + "postcss": "^7.0.2", + "prism-react-renderer": "^1.1.1", + "prismjs": "^1.23.0", + "prop-types": "^15.7.2", + "react-router-dom": "^5.2.0", + "rtlcss": "^2.6.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@docusaurus/theme-common": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.73.tgz", + "integrity": "sha512-ePteJFQkQRkK+J1FKDhmczq+yiEmORTW9YJgYceQVq+9L6unr0XxeOBBNC27BxSabUI+A9YXjQbtdmOHFM8LKA==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "tslib": "^2.1.0" + } + }, + "@docusaurus/theme-search-algolia": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.73.tgz", + "integrity": "sha512-SMfeGYZb85GIcuUjefMN+RunLDK+x6ETnlGuY9LU2S6bvoaZ4YTcqBPOt0iyZ1LH+XZmFuz78lFDW1gklaNmfg==", + "requires": { + "@docsearch/react": "^3.0.0-alpha.33", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "algoliasearch": "^4.8.4", + "algoliasearch-helper": "^3.3.4", + "clsx": "^1.1.1", + "eta": "^1.12.1", + "lodash": "^4.17.20" + } + }, + "@docusaurus/types": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-alpha.73.tgz", + "integrity": "sha512-+q7q178LS2mMTGD/U5KgloLGKtG8yzpqj+NOp2QprjFVqTfkwTFcMhN33PTZTUcDunMDuUt+LOo9hi9Vz9+r5Q==", + "requires": { + "@types/webpack": "^4.41.0", + "commander": "^5.1.0", + "joi": "^17.4.0", + "querystring": "0.2.0", + "webpack-merge": "^4.2.2" + } + }, + "@docusaurus/utils": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-alpha.73.tgz", + "integrity": "sha512-kUHnE1b/3yNWNAn0V8owLgCrxqyxfolkCbkPFfnRT+4m+agyn3riEcr+ZVObs7K9nxCla8oklX5RKSJGzyqWww==", + "requires": { + "@docusaurus/types": "2.0.0-alpha.73", + "@types/github-slugger": "^1.3.0", + "chalk": "^4.1.0", + "escape-string-regexp": "^4.0.0", + "fs-extra": "^9.1.0", + "gray-matter": "^4.0.2", + "lodash": "^4.17.20", + "resolve-pathname": "^3.0.0", + "tslib": "^2.1.0" + }, + "dependencies": { + "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==" + } + } + }, + "@docusaurus/utils-validation": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.73.tgz", + "integrity": "sha512-A36kKC+tCy/MGXdaK7emH2CHyHKru/+Td9zCm6fvNdNbu+dDNvEddTZ3ecjB0zNdDZM25Er4+KIo9GV3vnJ8Rg==", + "requires": { + "@docusaurus/utils": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "joi": "^17.4.0", + "tslib": "^2.1.0" + } + }, + "@endiliey/static-site-generator-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng==", + "requires": { + "bluebird": "^3.7.1", + "cheerio": "^0.22.0", + "eval": "^0.1.4", + "url": "^0.11.0", + "webpack-sources": "^1.4.3" + } + }, + "@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + }, + "@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "requires": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "requires": {} + }, + "@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" + }, + "@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==", + "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==" + }, + "@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==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/github-slugger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", + "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==" + }, + "@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "requires": { + "@types/unist": "*" + } + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "@types/node": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.0.tgz", + "integrity": "sha512-8MLkBIYQMuhRBQzGN9875bYsOhPnf/0rgXGo66S2FemHkhbn9qtsz9ywV1iCG+vbjigE4WUNVvw37Dx+L0qsPg==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/sax": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.3.tgz", + "integrity": "sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==", + "requires": { + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + }, + "@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "@types/webpack": { + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "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" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "requires": {} + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "algoliasearch": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.10.5.tgz", + "integrity": "sha512-KmH2XkiN+8FxhND4nWFbQDkIoU6g2OjfeU9kIv4Lb+EiOOs3Gpp7jvd+JnatsCisAZsnWQdjd7zVlW7I/85QvQ==", + "requires": { + "@algolia/cache-browser-local-storage": "4.10.5", + "@algolia/cache-common": "4.10.5", + "@algolia/cache-in-memory": "4.10.5", + "@algolia/client-account": "4.10.5", + "@algolia/client-analytics": "4.10.5", + "@algolia/client-common": "4.10.5", + "@algolia/client-personalization": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/logger-console": "4.10.5", + "@algolia/requester-browser-xhr": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/requester-node-http": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "algoliasearch-helper": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.6.0.tgz", + "integrity": "sha512-F4Smiq+Vyv/JJytuKNFuzXndPSb4pjtiHZSkEztQCcB+SORu71A8grgt2NSJhbB5VhqHW19QDtlPKbdYdcNrLg==", + "requires": { + "events": "^1.1.1" + }, + "dependencies": { + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + } + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "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" + }, + "dependencies": { + "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==" + } + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "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==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + }, + "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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "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==" + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "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": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "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==" + }, + "autoprefixer": { + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.7.tgz", + "integrity": "sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg==", + "requires": { + "browserslist": "^4.17.3", + "caniuse-lite": "^1.0.30001264", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "picocolors": "^0.2.1", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + } + } + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "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.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "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==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "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==", + "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==", + "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==", + "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==", + "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": { + "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==" + } + } + }, + "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==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", + "requires": { + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", + "escalade": "^3.1.1", + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" + } + }, + "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-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==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "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" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + } + } + }, + "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" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001267", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz", + "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==" + }, + "ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + }, + "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": { + "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==" + }, + "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" + } + } + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "dependencies": { + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "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" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "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==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.1.tgz", + "integrity": "sha512-ooQCa1/70oRfVdUUGjKpbHuxgMgm8BsDT5EBqBGvPxMoRoGXf4PNx5mMnkjzJ9Ptx4vvmDdha0QVh86QtYIk1g==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "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==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "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" + } + } + } + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==" + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" + }, + "copy-webpack-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "requires": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "core-js": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.3.tgz", + "integrity": "sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==" + }, + "core-js-compat": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz", + "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==", + "requires": { + "browserslist": "^4.17.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-js-pure": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz", + "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==" + }, + "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==" + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.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==", + "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==" + } + } + }, + "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==", + "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==", + "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-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "requires": { + "node-fetch": "2.6.1" + } + }, + "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" + } + }, + "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==", + "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" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "requires": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-preset-advanced": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.8.tgz", + "integrity": "sha512-DlZ5+XNKwB3ZnrtJ7jdj8WxT5Zgt1WIr4gdP9v1Sdn3SObqcLwbBobQaM7BqLIVHS74TE5iWn2TSYmOVSsmozQ==", + "requires": { + "autoprefixer": "^9.4.7", + "cssnano-preset-default": "^4.0.8", + "postcss-discard-unused": "^4.0.1", + "postcss-merge-idents": "^4.0.1", + "postcss-reduce-idents": "^4.0.2", + "postcss-zindex": "^4.0.1" + }, + "dependencies": { + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "requires": { + "repeat-string": "^1.5.4" + } + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "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==" + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.870", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.870.tgz", + "integrity": "sha512-PiJMshfq6PL+i1V+nKLwhHbCKeD8eAz8rvO9Cwk/7cChOHJBtufmjajLyYLsSRHguRFiOCVx3XzJLeZsIAYfSA==" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "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==" + } + } + }, + "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==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "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" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + } + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "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" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "eta": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eval": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.6.tgz", + "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==", + "requires": { + "require-like": ">= 0.1.1" + } + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "requires": { + "original": "^1.0.0" + } + }, + "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==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "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" + } + }, + "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-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "requires": { + "punycode": "^1.3.2" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "requires": { + "fbjs": "^3.0.0" + } + }, + "fbjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", + "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", + "requires": { + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "requires": { + "xml-js": "^1.6.11" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "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-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" + }, + "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==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "flux": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.2.tgz", + "integrity": "sha512-u/ucO5ezm3nBvdaSGkWpDlzCePoV+a9x3KHmy13TV/5MzOaCZDN8Mfd94jmf0nOi8ZZay+nOKbBUkOe2VNaupQ==", + "requires": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.0" + } + }, + "follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "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-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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==" + }, + "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==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "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" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "github-slugger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "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" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "requires": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "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" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "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==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "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==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "requires": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "requires": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "requires": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "requires": { + "source-map": "~0.6.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==" + }, + "html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + }, + "html-webpack-plugin": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "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-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "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" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + }, + "immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "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==" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "infima": { + "version": "0.2.0-alpha.22", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.22.tgz", + "integrity": "sha512-wKOWp4C1lTFG/h54UWD3Uf6VEsj5qYehM3ZVio3GBzIQuY8B3cTiwG7ZRNoobg+LvdQA21p5BJTugpTLQJLIrA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.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" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "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-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-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==", + "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==" + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + } + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "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-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } + } + } + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "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-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "joi": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz", + "integrity": "sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "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==" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "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" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + }, + "lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "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" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + }, + "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==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "requires": { + "unist-util-remove": "^2.0.0" + } + }, + "mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "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==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "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==" + } + } + }, + "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.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" + }, + "mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "requires": { + "mime-db": "1.50.0" + } + }, + "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==" + }, + "mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + } + }, + "mini-css-extract-plugin": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", + "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "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==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "requires": { + "lodash": "^4.17.21" + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + } + } + }, + "node-releases": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + } + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "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-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "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" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "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" + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz", + "integrity": "sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==", + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "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-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "requires": { + "retry": "^0.12.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==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "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" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "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==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "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==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "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==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "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" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.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==", + "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==", + "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==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "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" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", + "integrity": "sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==", + "requires": { + "nanoid": "^3.1.28", + "picocolors": "^0.2.1", + "source-map-js": "^0.6.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + } + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-unused": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz", + "integrity": "sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==", + "requires": { + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "postcss-merge-idents": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz", + "integrity": "sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==", + "requires": { + "cssnano-util-same-parent": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-reduce-idents": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz", + "integrity": "sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-sort-media-queries": { + "version": "1.31.21", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz", + "integrity": "sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg==", + "requires": { + "postcss": "^7.0.27", + "sort-css-media-queries": "1.5.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "postcss-zindex": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-4.0.1.tgz", + "integrity": "sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" + }, + "prism-react-renderer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz", + "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==", + "requires": {} + }, + "prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "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==" + } + } + }, + "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" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "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==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "requires": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "requires": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + } + }, + "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" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==" + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.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==" + }, + "react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "requires": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", + "requires": { + "prop-types": "^15.5.0" + } + }, + "react-loadable-ssr-addon": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.3.0.tgz", + "integrity": "sha512-E+lnmDakV0k6ut6R2J77vurwCOwTKEwKlHs9S62G8ez+ujecLPcqjt3YAU8M58kIGjp2QjFlZ7F9QWkq/mr6Iw==", + "requires": { + "@babel/runtime": "^7.10.3" + } + }, + "react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "react-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-side-effect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", + "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", + "requires": {} + }, + "react-textarea-autosize": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", + "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "requires": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.0.0", + "use-latest": "^1.0.0" + } + }, + "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" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "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==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "requires": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "requires": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + } + }, + "hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "requires": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remark-admonitions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", + "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", + "requires": { + "rehype-parse": "^6.0.2", + "unified": "^8.4.2", + "unist-util-visit": "^2.0.1" + }, + "dependencies": { + "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==" + }, + "unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + } + } + }, + "remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "requires": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + }, + "remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "requires": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "requires": { + "mdast-squeeze-paragraphs": "^4.0.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=" + }, + "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==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "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==" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "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==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "rtlcss": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.6.2.tgz", + "integrity": "sha512-06LFAr+GAPo+BvaynsXRfoYTJvSaWRyOhURCQ7aeI1MKph9meM222F+Zkt3bDamyHHJuGi3VPtiRkpyswmQbGA==", + "requires": { + "@choojs/findup": "^0.2.1", + "chalk": "^2.4.2", + "mkdirp": "^0.5.1", + "postcss": "^6.0.23", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "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==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "requires": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-handler": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", + "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "requires": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.0.4", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "requires": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "sitemap": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-6.4.0.tgz", + "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==", + "requires": { + "@types/node": "^14.14.28", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "dependencies": { + "@types/node": { + "version": "14.17.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.27.tgz", + "integrity": "sha512-94+Ahf9IcaDuJTle/2b+wzvjmutxXAEXU6O81JHblYXUg2BDG+dnBy7VxIPHKAyEEDHzCMQydTJuWvrE+Aanzw==" + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + }, + "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" + } + } + } + }, + "sort-css-media-queries": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz", + "integrity": "sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw==" + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + }, + "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-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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==" + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "std-env": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.1.tgz", + "integrity": "sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g==", + "requires": { + "ci-info": "^3.1.1" + } + }, + "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==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string_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" + }, + "dependencies": { + "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==" + } + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + } + } + }, + "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-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "supports-color": { + "version": "5.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" + } + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "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==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "requires": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "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==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "ts-essentials": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", + "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "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==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "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==" + }, + "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==", + "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==" + }, + "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==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "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==" + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + }, + "unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + }, + "unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + }, + "unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.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": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "use-composed-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", + "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", + "requires": { + "ts-essentials": "^2.0.3" + } + }, + "use-isomorphic-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", + "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", + "requires": {} + }, + "use-latest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", + "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "requires": { + "use-isomorphic-layout-effect": "^1.0.0" + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + } + } + }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "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==" + }, + "wait-on": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", + "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "requires": { + "axios": "^0.21.1", + "joi": "^17.3.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^6.6.3" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "optional": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "optional": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "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==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "requires": { + "duplexer": "^0.1.2" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + } + } + }, + "webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "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" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "webpackbar": { + "version": "5.0.0-3", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.0-3.tgz", + "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==", + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.1.0", + "consola": "^2.15.0", + "figures": "^3.2.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^7.0.0" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "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": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "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": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "requires": {} + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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==", + "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==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "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==" + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } + } +} diff --git a/docs/versioned_docs/version-2.3.0/widgets/pagination.md b/docs/versioned_docs/version-2.3.0/widgets/pagination.md new file mode 100644 index 0000000000..2ee0003cc5 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/pagination.md @@ -0,0 +1,69 @@ +--- +id: pagination +title: Pagination +--- +# Pagination + +Pagination enables the user to select a specific page from a range of pages. It is used to separate the content into discrete pages. + +:::tip +You can club pagination widget with the List View widget. +::: + +
+ +ToolJet - Widget Reference - Pagination + +
+ +## Properties + +### Number of pages + +You can use this to predefined the total number of pages. It is calculated by dividing the length of the data array that will be passed, by the data limit which is the number of posts we will show on each page. + +### Default page index +It is used to set and display the default page index when the app initially loads. You can also put a conditional logic to set its value as per your use case. + +## Event + +### On Page Change + +This event is triggered whenever the user switches to another page index. You can explore various actions associated with this event as per app logic. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Pagination + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + diff --git a/docs/versioned_docs/version-2.3.0/widgets/password-input.md b/docs/versioned_docs/version-2.3.0/widgets/password-input.md new file mode 100644 index 0000000000..019ec8fae3 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/password-input.md @@ -0,0 +1,82 @@ +--- +id: password-input +title: Password Input +--- +# Password Input + +A Password Input widget provides a way for the users to securely enter a password. The Password Input is a one-line plain text editor in which the text is obscured so that it cannot be read, by replacing each character with an asterisk ("*") symbol. + +## How To Use Password Input Widget + + + +## Properties + +### Placeholder + +It specifies a hint that describes the expected value. + +## Validation + +### Regex + +Use this field to enter a Regular Expression that will validate the password constraints. +### Min length + +Enter the number for a minimum length of password allowed. + +### Max length + +Enter the number for the maximum length of password allowed. + +### Custom validation + +If the condition is true, the validation passes, otherwise return a string that should be displayed as the error message. For example: `{{components.passwordInput1.value === 'something' ? true: 'value should be something'}}` + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Password input + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Border radius + +Add a border radius to the number input widget using this property. It accepts any numerical value from `0` to `100`. + +### Border color + +Add color to the border of the number input component using this property. Enter the hex color code or choose a color from the color picker. + +### Background color + +You can change the background color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/pdf.md b/docs/versioned_docs/version-2.3.0/widgets/pdf.md new file mode 100644 index 0000000000..bc665697fe --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/pdf.md @@ -0,0 +1,56 @@ +--- +id: pdf +title: PDF +--- + +# PDF + +PDF widget can be used to embed the PDF file either by URL or as a Base64 encoded. + +## Properties + +### File URL + +The URL of the PDF file on the web. `data:application/pdf;base64,` format is supported and the input needs to be prefixed with `data:application/pdf;base64,` + +### Scale page to width + +It can be toggled to adjust the PDF content to fit the width or height of the component + +### Show page controls + +By default, page number, previous & next button is displayed while hovering the PDF file. It can be toggled on or off. + +### Show the download + +The `Download` button on the PDF component allows you to download the pdf file. By default, Show the download button is enabled. Toggle it off to remove the `Download` button from PDF component, you can also click on the `Fx` button to set the values `{{true}}` or `{{false}}` dynamically. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - PDF + +
+ +## Layout + +| Layout | description | Expected value | +| --------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/qr-scanner.md b/docs/versioned_docs/version-2.3.0/widgets/qr-scanner.md new file mode 100644 index 0000000000..edab5ade23 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/qr-scanner.md @@ -0,0 +1,71 @@ +--- +id: qr-scanner +title: QR Scanner +--- +# QR Scanner +Scan QR codes using device camera and hold the data they carry. + +
+ +ToolJet - Widget Reference - QR Scanner + +
+ +:::note Known Issue +You might have to stick to the Safari browser in IOS as camera access is restricted for third-party browsers. +::: + +## Exposed variables +### lastDetectedValue + +This variable holds the data contained in the last QR code scanned by the widget. To fetch the data use `{{components.qrscanner1.lastDetectedValue}}`. + +## Events +### onDetect + +This event is fired whenever the widget successfully scans a QR code. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +:::caution Debugging tip + +Browser camera APIs restrict this widget to only work in either `localhost` or `https`. + +So if you're testing it out, be sure to either use `localhost` or `https`. +::: + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the +mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. +Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - QR Scanner + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. diff --git a/docs/versioned_docs/version-2.3.0/widgets/radio-button.md b/docs/versioned_docs/version-2.3.0/widgets/radio-button.md new file mode 100644 index 0000000000..9de2d08c16 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/radio-button.md @@ -0,0 +1,101 @@ +--- +id: radio-button +title: Radio Button +--- +# Radio Button + +Radio button widget can be used to select one option from a group of options. + +## How To Use Radio button Widget + + + +:::tip +Radio buttons are preferred when the list of options is less than six, and all the options can be displayed at once. +::: + +:::info +For more than six options, consider using **[Dropdown](/docs/widgets/dropdown)** widget. +::: + +## Event + +### On select + +This event is triggered when an option is clicked. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +### Label + +The text is to be used as the label for the radio button. This field expects a `String` value. + +### Default value + +The value of the default option. + +### Option values + +List of values for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.value)}}` or populate it with sample values `{{[true, false]}}` + +### Option labels + +List of labels for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.label)}}` or populate it with sample values `{{["yes", "no"]}}` + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Radio button + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Text color + +Change the color of the text in the widget by providing the `Hex color code` or by choosing the color of your choice from the color picker. + +### Active color + +Change the color of active radio button by providing the `Hex color code` or by choosing the color of your choice from the color picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +## Example + +
+ +ToolJet - Widget Reference - Radio button + +
+ +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| selectOption | Select an option from the radio buttons. | `option` eg: `component.radiobutton1.selectOption('one')` | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/range-slider.md b/docs/versioned_docs/version-2.3.0/widgets/range-slider.md new file mode 100644 index 0000000000..5c58220496 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/range-slider.md @@ -0,0 +1,76 @@ +--- +id: range-slider +title: Range Slider +--- +# Range Slider + +Range sliders are widely used across different UIs. One of the main purposes is to filter, explore all the related content and available in the control and settings options. + +:::tip +Range Sliders have "Two handles" option which allows user to select within a range. +::: + +
+ +ToolJet - Widget Reference - Range Slider + +
+ +## Properties + +### Minimum value + +Set the minimum value for the slider. This field accepts any numerical value. + +### Maximum value + +Set the maximum value for the slider. This field accepts any numerical value. + +### Value + +Set the default value when the widget loads. This can be used to pre-fill the value based on your data and requirements. + +### Two handles + +The slider will now have 2 dragging handles. It is used to define a range of values versus a single given value. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Range Slider + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Line color + +Enter the hexcode to set the default color for slider's track. +### Handle color + +Enter the hexcode to set the color for slider's handler. +### Track color + +Enter the hexcode to set the color for slider's active portion on the track. +### Visibility + +Set the visivlity of the slider programmatically. The default value is `{{true}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/rich-text-editor.md b/docs/versioned_docs/version-2.3.0/widgets/rich-text-editor.md new file mode 100644 index 0000000000..2267259807 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/rich-text-editor.md @@ -0,0 +1,56 @@ +--- +id: rich-text-editor +title: Rich Text Editor +--- +# Rich Text Editor + +Rich Text Editor can be used to enter and edit the text in HTML format. +It should be preferred for blog posts, forum posts or notes sections. The text is to be used as the label for the radio button. + +
+ +ToolJet - Widget Reference - Rich Text Editor + +
+ +## Properties + +### Placeholder + +It specifies a hint that describes the expected value. + +### Default Value + +The default value that the widget will hold when the app is loaded. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference -Rich Text Editor + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. diff --git a/docs/versioned_docs/version-2.3.0/widgets/spinner.md b/docs/versioned_docs/version-2.3.0/widgets/spinner.md new file mode 100644 index 0000000000..8557673342 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/spinner.md @@ -0,0 +1,49 @@ +--- +id: spinner +title: Spinner +--- +# Spinner + +Spinner widget can be used to provide a visual indication that an action is in progress by awaiting a change. + +
+ +ToolJet - Widget Reference - Spinner + +
+ +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Spinner + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Color + +Change the color of the Spinner by entering the `Hex color code` or choosing a color of your choice from the color-picker. + +### Size + +Change the size of the Spinner by selecting options from the dropdown. It has small and large sizes available. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/star-rating.md b/docs/versioned_docs/version-2.3.0/widgets/star-rating.md new file mode 100644 index 0000000000..d204438589 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/star-rating.md @@ -0,0 +1,85 @@ +--- +id: star-rating +title: Star rating +--- +# Star rating + +Star rating widget can be used to display as well as input ratings. The widget supports half stars, and the number of stars can be set too. + +
+ +ToolJet - Widget Reference - Star rating + +
+ +## Events + +### On Change + +This event is triggered when a star is clicked. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +### Label + +The text to be used as the label for the star rating. This field expects a `String` value. + +### Number of stars + +Initial number of stars in the list on initial load. `default: 5`. This field expects an integer value. + +### Default no of selected stars + +This property specifies the default count of stars that are selected on the initial load. `default: 5` (integer). This field expects an integer value. + +### Enable half star + +Toggle `on` to allow selection of half stars. `default: false` (bool). Click on `Fx` to programmatically define the value `{{true}}` or `{{false}}`. + +### Tooltips + +This is used for displaying informative tooltips on each star, and it is mapped to the index of the star. `default: []` (array of strings ). Ex: `{{["bad", "okay", "good", "best"]}}` + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Star rating + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Star Color + +Display color of the star. `default: #ffb400` (color hex). Change color by providing `Hex color code` or choosing one from the picker. + +### Label color + +Change the color of label in widget by providing `Hex color code` or choosing one from the picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. diff --git a/docs/versioned_docs/version-2.3.0/widgets/statistics.md b/docs/versioned_docs/version-2.3.0/widgets/statistics.md new file mode 100644 index 0000000000..b2fa668f13 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/statistics.md @@ -0,0 +1,93 @@ +--- +id: statistics +title: Statistics +--- + +# Statistics + +Statistics can be used to display different statistical information. + +
+ +ToolJet - Widget Reference - Statistics + +
+ +## Properties + +### Primary value label + +This property lets you add and remove primary value label. + +### Primary value + +This property lets you add and remove primary value,the actual amount can be represented here. + +### Hide secondary value + +This property lets you show/hide the secondary value from the statistics component. By default, this property is disabled. Toggle it on to hide the secondary value, you can also click on the `Fx` button next to it to dynamically set the value to `{{true}}` or `{{false}}`. + +### Secondary value label + +This property lets you add and remove secondary value label. + +### Secondary value + +This property lets you add and remove secondary value,the change in value can be represented here. + +### Secondary sign display + +This property lets you add and secondary sign either positive or negative,can be used to represent positive(increase) or negative(decrease) movement.Default value is positive. + +### Loading state + +Loading state can be used to show a spinner on the statistics. Loading state is commonly used with `isLoading` property of the queries to show a loading status while a query is being run. Switch the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}`. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Statistics + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Primary Label Colour + +You can change the primary label color by entering the Hex color code or choosing a color of your choice from the color picker. + +### Primary Text Colour + +You can change the primary text color of the primary label by entering the Hex color code or choosing a color of your choice from the color picker. + +### Secondary Label Colour + +You can change the secondary label color of the primary label by entering the Hex color code or choosing a color of your choice from the color picker. + +### Secondary Text Colour + +You can change the secondary text color of the primary label by entering the Hex color code or choosing a color of your choice from the color picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/steps.md b/docs/versioned_docs/version-2.3.0/widgets/steps.md new file mode 100644 index 0000000000..5c486e0ecb --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/steps.md @@ -0,0 +1,92 @@ +--- +id: steps +title: Steps +--- +# Steps + +Steps are used to guide users through complex processes, making them easier and more intuitive. + +
+ +ToolJet - Widget Reference - Steps + +
+ +## Properties + +
+ +ToolJet - Widget Reference - Steps + +
+ +### Steps + +This property lets you add and the steps. Every object represents a step. + +```json +{{ + [ + { name: 'step 1', tooltip: 'some tooltip', id: 1}, + { name: 'step 2', tooltip: 'some tooltip', id: 2}, + { name: 'step 3', tooltip: 'some tooltip', id: 3}, + { name: 'step 4', tooltip: 'some tooltip', id: 4}, + { name: 'step 5', tooltip: 'some tooltip', id: 5} + ] +}} +``` + +### Current step + +This property lets you select the current step you want to be highlighted. + +### Steps selectable + +This property when disabled will disable selection of steps. + +## Events +### On select +This event is fired whenever the user selects any step. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Steps + +
+ +## Layout +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Theme + +You can change the theme of widget by selecting available themes from dropdown. + +### Colour + +You can change the color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. + +### Text Colour + +You can change the text color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/svg-image.md b/docs/versioned_docs/version-2.3.0/widgets/svg-image.md new file mode 100644 index 0000000000..76500c1eb8 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/svg-image.md @@ -0,0 +1,59 @@ +--- +id: svg-image +title: Svg Image +--- +# SVG Image + +It is used to render vector images. We can display images, icons, texts using this widget. SVGs are vector images and therefore are usually much smaller in file-size than bitmap-based images. + +Developers prefer having SVG **(Scalable Vector Graphics)** files as they are scalable and will render pixel-perfect at any resolution whereas JPEGs, PNGs and GIFs will not. + +
+ +ToolJet - Widget Reference - SVG + +
+ +## Properties + +### SVG Data + +Enter the SVG data of the image to display it on the widget. + +:::tip +Refer to the resources where SVG files are downloaded for free. You copy-paste the below data in this field to see a new icon being rendered. +::: + +``` + +``` + + +## General + +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - SVG + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/table.md b/docs/versioned_docs/version-2.3.0/widgets/table.md new file mode 100644 index 0000000000..15b05f6fbd --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/table.md @@ -0,0 +1,329 @@ +--- +id: table +title: Table +--- +# Table + +Tables can be used for both displaying and editing data. + + + +## Table data + +
+ +ToolJet - Widget Reference - Table + +
+ +Array of objects to be displayed on the table. It is commonly used to display data from query (`{{queries.restapi1.data}}`). Table data expects an array of objects, example: + +``` +{{[{ id: 1, name: 'Sarah', email: 'sarah@example.com'}]}} +``` + +The table component will **auto-generate all the columns** as soon as the expected table data(array of objects) is provided. + +## Columns + +
+ +ToolJet - Widget Reference - Table + +
+ +### Cell data types + +You can define the cell types as per your table's data source using the following: + +- String | Default: It is used to render the data for cell types: text or textarea, +- Number: This cell type will only expect the numerical values and can be sorted in ascending or descending order +- Badge: It is a labeling component used to display data with badges for e.g status of a shipment +- Multiple badges: Similar to badge, used to display multiple data badges in the form of array of objects, +- Tags: Used to display an array of objects in the form of tags, e.g status, levels, steps +- Dropdown: When data is in the form of an array of options to be selected, e.g select priority +- Radio: Used to make a selection from a group of options, e.g select your salary-range +- Multiselect: Similar to dropdown but to collect multiple user inputs from a list of options, +- Toggle switch: Allows a user to change a setting between two states, e.g select between Yes/No, +- Date picker: Allowing users to display and select dates, e.g delivery date +- Image: This cell type expects the URL of image and will display the image in the cell. It also has the option to style the image. + +:::info +Check this **[how-to guide](/docs/how-to/access-cellvalue-rowdata)** on dynamically change the color of text in a row and column in the table. +::: + +### Displaying Data + +The data object should be an array of objects. Table columns can be added, removed, rearranged from the inspector. `key` property is the accessor key used to get data from a single element of a table data object. For example: + +If the table data is: + +```js +[ + { + "review": { + "title": "An app review" + }, + "user": { + "name": "sam", + "email": "sam@example.com" + }, + } +] +``` + +To display email column, the key for the column should be `user.email`. + + +### Saving data +Enable `editable` property of a column to make the cells editable. If a data type is not selected, `string` is selected as the data type. + +:::tip +You can programatically **enable**/**disable** the make **editable** field in the columns property by clicking on the **Fx** button. +::: + +If the data in a cell is changed, `changeSet` property of the table object will have the index of the row and the field that changed. +For example, if the name field of second row of example in the 'Displaying Data' section is changed, `changeSet` will look like this: + +```js +{ + 2: { + "name": "new name" + } +} +``` + +Along with `changeSet`, `dataUpdates` property will also be changed when the value of a cell changes. `dataUpdates` will have the whole data of the changed index from the table data. `dataUpdates` will look like this for our example: + +```js +[{ + "review": { + "title": "An app review" + }, + "user": { + "name": "new name", + "email": "sam@example.com" + }, +}] +``` + +If the data of a cell is changed, "save changes" button will be shown at the bottom of the table. This button when clicked will trigger the `Bulk update query` event. This event can be used to run a query to update the data on your data source. + +### Use dynamic column + +Enabling the **Use dynamic column** toggle will allow users to set the **Column data** where users can link the column data dynamically from a query. + +The **column data** field expects a JSON value: +```json +{ + "name":"Name", + "columnType":"string", + "key":"first_name", + "cellBackgroundColor":"#000", + "textColor":"#fff", + "isEditable":true, + "regex":"", + "maxLength":10, + "minLength":5, + "customRule":"" +} +``` + +
+ +ToolJet - Widget Reference - Table + +
+ +## Validation + +Under column properties, expand the detailed view of a column type to access a toggle button called `make editable`. You can toggle it `ON` to apply the validations for each column respectively using the following. + +### Regex + +Use this field to enter a Regular Expression that will validate the password constraints. +### Min length + +Enter the number for a minimum length of password allowed. + +### Max length + +Enter the number for the maximum length of password allowed. + +### Custom validation + +If the condition is true, the validation passes, otherwise return a string that should be displayed as the error message. For example: `{{components.passwordInput1.value === 'something' ? true: 'value should be something'}}` + +## Action buttons + +
+ +ToolJet - Widget Reference - Table + +
+ +Action buttons will be displayed as the last column of the table. The styles of these buttons can be customised and `on click` actions can be configured. when clicked, `selectedRow` property of the table will have the table data of the row. + +| Property | Description | +| -------- | ------------ | +| Button text | Set the text that you want to be displayed on the action button. | +| Button position | Set the button position to the left or right | +| Background color (Action Button) | Background color of the action button. | +| Text color (Action Button) | Color of button-text of the action button. | +| Disable Action Button | Toggle on to disable the action button. You can programmatically set its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the action button will be disabled and becomes non-functional. By default, its value is set to `{{false}}`. | + +## Options + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +### Server-side pagination + +Server-side pagination can be used to run a query whenever the page is changed. Go to events section of the inspector and change the action for `on page changed` event. Number of records per page needs to be handled in your query. If server-side pagination is enabled, `pageIndex` property will be exposed on the table object, this property will have the current page index. `pageIndex` can be used to query the next set of results when page is changed. + +When Server-side pagination is enabled, you'll be able to set three other table properties: +- **Enable previous page button**: When server-side pagination is enabled, this button is enabled by default. Toggle this off to disable the previous page button from the table. +- **Enable next page button**: When server-side pagination is enabled, this button is enabled by default. Toggle this off to disable the next page button from the table. +- **Total records server side**: Set a numerical value to display particular number of records. + +### Client-side pagination + +Client-side pagination is enabled by default. When the client-side pagination is enabled(`{{true}}`), another property **Number of rows per page** will be shown that can be used to set the number of records per page. By default, the value is set to 10 and if it is disabled(`{{false}}`) then it will show all the records in the single page. + +### Server-side search + +If server-side search is enabled, `on search` event is fired after the content of `searchText` property is changed. `searchText` can be used to run a specific query to search for the records in your data source. + +### Show download button + +Show or hide download button at the Table footer. + +### Hide/Show columns + +Table header has an option(Eye icon) to show/hide one or many columns on the table. + +### Show filter button + +Show or hide filter button at the Table header. The following filters are available: +- **contains** +- **does not contain** +- **matches** +- **does not match** +- **equals** +- **does not equal to** +- **is empty** +- **is not empty** +- **greater than** +- **greater than or equal to** +- **less than** +- **less than or equal to** + + +### Show update buttons + +It's enabled by default. Table footer will show two update buttons **Save changes** & **Discard changes** whenever a cell is edited. Toggle `off` to hide update buttons. + +### Bulk selection + +To let the user select one or more rows from the current page of a table, enable 'Bulk selection' from the inspector. The values of selected rows will be exposed as `selectedRows`. + +### Highlight selected row + +Enable this option to have the last selected(clicked on) row to be highlighted. + +### Disable sorting + +Enable this option to lock the sorting of columns when clicked on column name. + +### Server-side sort +When Server-side sort is enabled, clicking on the column headers will not automatically sort the table, instead, the `Sort applied` event will be fired and the applied sorting will be exposed as `sortApplied`. You can use this data to run any query that feeds data to the table in a manner that reflects the sorting applied. + +### Server-side filter +When Server-side filter is enabled, applying filters will not automatically filter the table, instead, the `Filter changed` event will be fired and the applied filters will be exposed as `filters`. You can use this data to run any query that feeds data to the table in a manner that reflects the filters applied. + +### Show search box + +It can be used to show or hide Table Search box. Client-side search is enabled by default and server-side search can be enabled from the events section of the inspector. Whenever the search text is changed, the `searchText` property of the table component is updated. If server-side search is enabled, `on search` event is fired after the content of `searchText` property is changed. `searchText` can be used to run a specific query to search for the records in your data source. + +If you don't wish to use the search feature altogether, you can disable it from the inspector. + +### Loading state (Boolean) + +Loading state shows a loading skeleton for the table. This property can be used to show a loading status on the table while data is being loaded. `isLoading` property of a query can be used to get the status of a query. + +## Events + +- **[Row hovered](#row-hovered)** +- **[Row clicked](#row-clicked)** +- **[Save changes](#save-changes)** +- **[Cancel changes](#cancel-changes)** +- **[Page changed](#page-changed)** +- **[Search](#search)** +- **[Sort applied](#sort-applied)** +- **[Cell value changed](#cell-value-changed)** +- **[Filter changed](#filter-changed)** + +### Row hovered + +This event is triggered when the mouse pointer is moved over a row in the table. The `hoveredRowId` exposed variable of the table will include the id of the latest hovered row and `hoveredRow` property of the table will have the data of the hovered row in the object format. + +### Row clicked + +This event is triggered when a table row is clicked. The `selectedRowId` exposed variable of the table will include the id of the selected row and the `selectedRow` property of the table object will have the table data of the selected row. + +### Save changes + +If any cell of the table is edited, the `save changes` button appears at the footer of the table. Save changes event is triggered when this button is clicked. + +### Cancel changes + +If any cell of the table is edited, the `Discard changes` button appears at the footer of the table. Cancel changes event is triggered when this button is clicked. + +### Page changed + +If server-side pagination is enabled, this event is fired when the current page is changed. This event is triggered after updating the `pageIndex` variable. + +### Search + +This event is triggered when a text is entered to the search input box of the table. `searchText` variable is updated before triggering this event. + +### Sort applied + +This event is triggered when the column name header is clicked to apply sorting in `asc` or `desc`. The `sortApplied` variable is updated with an object having `column` and `direction` values. + +### Cell value changed + +If any cell of the table is edited, the `cell value changed` event is triggered. + +### Filter changed + +This event is triggered when filter is added, removed, or updated from the filter section of the table. `filters` property of the table is updated to reflect the status of filters applied. The objects will have properties: `condition`, `value`, and `column`. + +## Exposed variables + +| variable | description | +| ----------- | ----------- | +| currentData | Data that is currently being displayed by the table ( including edits if any ) | +| currentPageData | Data that is displayed on the current page if pagination is enabled ( including edits if any ) | +| pageIndex | Index of the current page, starting from 1 +| changeSet | Object with row number as the key and object of edited fields and their values as the value | +| dataUpdates | Just like changeSet but includes the data of the entire row | +| selectedRow | The data of the row that was last clicked. `selectedRow` also changes when an action button is clicked | +| searchText | The value of the search field if server-side pagination is enabled | + +## Styles + +| Style | Description | +| ----------- | ----------- | +| Text color | Change the color of the text in table by providing `hex color code` or choosing one from the picker | +| Action button radius | This field can be used to give a radius to all action buttons. The default value is `0` | +| Table type | Select a type of table from the dropdown. | +| Cell size | This decides the size of table cells. You can choose between a `Compact` size for table cells or a `Spacious` size | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | Toggle on to lock the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the button. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/tabs.md b/docs/versioned_docs/version-2.3.0/widgets/tabs.md new file mode 100644 index 0000000000..0bfa2a8a2a --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/tabs.md @@ -0,0 +1,116 @@ +--- +id: tabs +title: Tabs +--- + +# Tabs + +A Tabs widget contains a number of defined containers that can be navigated through the tabs. Each tab acts as a [container](/docs/widgets/container/) that can have different widgets placed inside it. + +
+ +ToolJet - Widget Reference - Tabs + +
+ +## How To Use Tabs Widget + + + +## Properties + +### Tabs + +This property lets you add and remove containers from the tabs widget. Each container in the tab has its unique `id` , `title` and `disabled` for disabling individual tabs . This field expects an array of objects. + +```js +{{[ + { title: 'Home', id: '0' }, + { title: 'Profile', id: '1',disabled:'true' }, + { title: 'Settings', id: '2' } +]}} +``` + +#### Adding background color to Tabs + +You can specify the different color for each tab using the `backgroundColor` property and use hex color code or color name as the value. + +```js +{{[ + { title: 'Home', id: '0', backgroundColor: '#81D4FA' }, + { title: 'Profile', id: '1', backgroundColor: 'blue' }, + { title: 'Settings', id: '2', backgroundColor: '#ecf0f1'} + ]}} +``` + +
+ +Tabs properties + +
+ +### Default tab + +This property selects the container in the tab which matches the corresponding `id`. By default, the value is set to `0`. + +### Hide tab + +It allows you to hide all the tab titles defined in the Tabs property above. It accepts boolean values which can also be set using the toggle option or programmatically by clicking on the FX button. + +### Render only active tab + +This property is enabled by default. When enabled, only the active tab will be rendered and when disabled, all the tabs in the component will be rendered. + +## Events + +
+ +irtable record + +
+ +### On tab switch + +This event is triggered when the tab is switched. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| setTab | Set current tab. | `id` | + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Highlight Color + +You can change the highlight color of the selected tab by entering the Hex color code or choosing a color of your choice from the color picker. + +### Tab width + +Tab width can be set as **auto** or **equally split**. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/tags.md b/docs/versioned_docs/version-2.3.0/widgets/tags.md new file mode 100644 index 0000000000..ea01906c69 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/tags.md @@ -0,0 +1,60 @@ +--- +id: tags +title: Tags +--- +# Tags + +Tags widget can be used to show array of data as tags. + +
+ +ToolJet - Widget Reference - Tags + +
+ +## Properties + +### Tags + +It can be used to set array of tags. It must be an array of objects like this: + +```js +{{ + [ + { title: 'success', color: '#2fb344', textColor: '#fff' }, + { title: 'info', color: '#206bc4', textColor: '#fff' }, + { title: 'warning', color: '#f59f00', textColor: '#fff' }, + { title: 'danger', color: '#d63939', textColor: '#fff' } + ] +}} +``` + +Each object should contain a title, color code of a particular tag, and also a text color. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Tags + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/text-input.md b/docs/versioned_docs/version-2.3.0/widgets/text-input.md new file mode 100644 index 0000000000..17bf8d9003 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/text-input.md @@ -0,0 +1,111 @@ +--- +id: text-input +title: Text Input +--- +# Text Input + +Text Input widget lets users enter and edit text. + +:::tip +The Text Input should be preferred when user input is a single line of text. +::: + +## How To Use Text Input Widget + + + +## Properties + +### Default value + +The default value that the widget will hold when the app is loaded. + +### Placeholder + +It specifies a hint that describes the expected value. + +## Events + +
+ +ToolJet - Widget Reference - Text input + +
+ +### On change +This event fires whenever the user types something on the text input. + +### On Enter Pressed +This event fires whenever the user presses the enter button on keyboard after entering some text on text input component. + +### On focus +This event fires whenever the user clicks inside the text input component. + +### On blur +This event fires whenever the user clicks outside the text input component. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get detailed information about all the **Actions**. +::: + +## Validation + +### Regex + +Use this field to enter a Regular Expression that will validate the password constraints. + +### Min length + +Enter the number for a minimum length of password allowed. + +### Max length + +Enter the number for the maximum length of password allowed. + +### Custom validation + +If the condition is true, the validation passes, otherwise returns a string that should be displayed as the error message. For example: `{{components.passwordInput1.value === 'something' ? true: 'value should be something'}}`. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Text input + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Text Color +Use this property to set the color of the text inside the text input component. You can select the color from the color picker or set the value using Hex color code. + +### Border color + +Add a color to the border of the text-input component using this property. You can select the color from the color picker or set the value using Hex color code. + +### Border Radius +Use this property to modify the border radius of the widget. The field expects only numerical values from `1` to `100`, and default is `0`. + +### Visibility +It is to control the visibility of the widget. If `{{false}}` the widget will not be visible after the app gets deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Disable +This property only accepts boolean values. If set to `{{true}}`, the widget will lock and become non-functional. By default, its value is set to `{{false}}`. + +:::info +Check the **component specific actions** available for this component **[here](/docs/actions/control-component)**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/text.md b/docs/versioned_docs/version-2.3.0/widgets/text.md new file mode 100644 index 0000000000..8b526f6269 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/text.md @@ -0,0 +1,77 @@ +--- +id: text +title: Text +--- +# Text + +Text widget can be used to display text. + +:::info +Users cannot enter and edit text. +::: + +## How To Use Text Widget + + + +## Properties + +### Text + +This property sets the content/text inside the Text widget. Refer your query data with dynamic variables `{{queries.datasource.data.text}}` or populate it with sample values `Text goes here !`. + +### Show loading state + +Toggle `on` or `off` to show or hide the loading state. You can also click on the `Fx` next to it to set the value `{{true}}` and `{{false}}` dynamically. Shows a loading status if the value is `true`. This property is often used with the `isLoading` property of queries so that the table shows a spinner while the query is being run. Default value is `false`. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Text + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +| Style | Description | +| ----------- | ----------- | +| Font Weight | You can change the font weight of the text in following ways: **normal (default), bold, lighter, bolder** | +| Text Decoration | You can change the text decoration in following ways : **none(default), overline, line-through, underline, overline underline** | +| Text Transformation | You can transform the text in following ways: **none (default), uppercase, lowercase, capitalize** | +| Font Style | You can change the font style in following ways: **normal(default), italic, oblique** | +| Line Height | You can change the line height by providing number as input (example - 1.5) | +| Text Indent | You can change the text indent by providing the number as input (example - 10) | +| Letter Spacing | You can change the letter spacing by providing the number as input (example - 2) | +| Word Spacing | You can change the letter spacing by providing the number as input (example - 2) | +| Font Variant | You can change the font variant of the text in the following ways: **normal (default), small-caps, initial, inherit** | +| Text Size | By default, the text size is set to 14. You can enter any value from 1-100 to set custom text size. | +| Background Color | You can change the background color of the text component by entering the Hex color code or choosing a color of your choice from the color picker. | +| Text Color | You can change the color of the text by entering the Hex color code or choosing a color of your choice from the color picker. | +| Align Text | You can align the text inside the widget in following ways: left, right, center, justified | + + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/textarea.md b/docs/versioned_docs/version-2.3.0/widgets/textarea.md new file mode 100644 index 0000000000..8ff2513929 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/textarea.md @@ -0,0 +1,70 @@ +--- +id: textarea +title: Textarea +--- +# Textarea + +Textarea widgets let users enter and edit just text like [Text Input](/docs/widgets/text-input) widget. + +:::tip +Textarea should be preferred over [Text Input](/docs/widgets/text-input) when user input is more than one sentence. +::: + +## How To Use Textarea Widget + + + +## Properties + +### Default value + +This property is used for setting the initial value in the textarea on the initial load. This field expects a `String` value. + +### Placeholder + +It specifies a hint that describes the expected value. This field expects a `String` value. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Text area + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Border Radius + +Use this property to modify the border radius of the text area widget. The field expects only numerical value from `1` to `100`, default is `0`. +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| setText | Set the text. | `text` | +| clear | Clear the text. | | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/timeline.md b/docs/versioned_docs/version-2.3.0/widgets/timeline.md new file mode 100644 index 0000000000..f2d2bdd7e2 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/timeline.md @@ -0,0 +1,63 @@ +--- +id: timeline +title: Timeline +--- +# Timeline + +Timeline widget can be used to do a visual representation of a sequence of events + +
+ +ToolJet - Widget Reference - Timeline + +
+ +## Properties + +### Timeline data + +**Data requirements:** The data needs to be an array of objects and each object should have `title`, `subTitle`, `iconBackgroundColor` and `date` keys. + +**Example:** +```json +[ + { "title": "Product Launched", "subTitle": "First version of our product released to public", "date": "20/10/2021", "iconBackgroundColor": "#4d72fa"}, + { "title": "First Signup", "subTitle": "Congratulations! We got our first signup", "date": "22/10/2021", "iconBackgroundColor": "#4d72fa"}, + { "title": "First Payment", "subTitle": "Hurray! We got our first payment", "date": "01/11/2021", "iconBackgroundColor": "#4d72fa"} +] +``` + + +### Hide date + +Hide date can be used to hide the date time or Left Hand Side of the timeline widget + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Timeline + +
+ +## Layout + +| Layout| description| Expected value| +| ----- | --------- | ------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | +| ----------- | ----------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/timer.md b/docs/versioned_docs/version-2.3.0/widgets/timer.md new file mode 100644 index 0000000000..18ba85b865 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/timer.md @@ -0,0 +1,80 @@ +--- +id: timer +title: Timer +--- +# Timer + +Timer widget lets users to count timer both upward and downward + +
+ +ToolJet - Widget Reference - Timer + +
+ +## Properties + +### Default value + +It specifies the initial value of timer. Format is: `HH.mm.ss.SS`. + +### Timer type + +It specifies If its a upward or downward counter. Select `Count Up` or `Count Down` from the dropdown or you can click on `Fx` to programmatically define the values `countUp` or `countDown`. + +## Events + +### On start +This event is fired when user clicks on start button. + +### On resume +This event is fired when user clicks on resume button. + +### On pause +This event is fired when user clicks on pause button. + +### On count down finish +This event is fired when the count down timer reaches zero. + +### On reset +This event is fired when user clicks on reset button. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Timer + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/toggle-switch.md b/docs/versioned_docs/version-2.3.0/widgets/toggle-switch.md new file mode 100644 index 0000000000..56e2ed715d --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/toggle-switch.md @@ -0,0 +1,76 @@ +--- +id: toggle-switch +title: Toggle Switch +--- +# Toggle Switch + +The toggle switch widget allows the user to change a setting between two states. + +The Toggle switch widget should be used if we want to make a binary choice, such as turning something **on or off** or **enable or disable**. + +## How To Use Toggle Switch Widget + + + +## Properties + +### Label + +This property can be used to set a label for the switch. Default Label: **Toggle label** + +### Default status + +The property is used to set the default status (enabled or disabled) of the toggle switch component when the app is loaded. By default, the checkbox component is set to `{{false}}`/disabled. + +## Event + +### On change +This event is triggered whenever the toggle switch is clicked. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Toggle switch + +
+ +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Text color + +Change the color of the text in the widget by providig the `Hex color code` or choosing a color from the picker. + +### Toggle switch color + +Change the color of the toggle switch in the widget by providig the `Hex color code` or choosing a color from the picker. + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/widgets/tree-select.md b/docs/versioned_docs/version-2.3.0/widgets/tree-select.md new file mode 100644 index 0000000000..64b72798a1 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/tree-select.md @@ -0,0 +1,157 @@ +--- +id: tree-select +title: Tree Select +--- + +# Tree Select + +Tree Select widget is a group checkboxes in a TreeView which can be expanded or collapsed. + +
+ +ToolJet - Widget Reference - Tree Select + +
+ +## Properties + +### Title + +The text is to be used as the title for the tree select. This field expects a `String` input. + +### Structure + +**Data requirements:** The structure needs to be an array of objects and each object should have `label` and `value` keys. If you wish to have `children` under any of the checkbox, then `children` array needs to be passed with `label` and `value` keys. + +**Example:** + +```json +[ + { + "label": "Asia", + "value": "asia", + "children": [ + { + "label": "China", + "value": "china", + "children": [ + { "label": "Beijing", "value": "beijing" }, + { "label": "Shanghai", "value": "shanghai" } + ] + }, + { "label": "Japan", "value": "japan" }, + { + "label": "India", + "value": "india", + "children": [ + { "label": "Delhi", "value": "delhi" }, + { "label": "Mumbai", "value": "mumbai" }, + { "label": "Bengaluru", "value": "bengaluru" } + ] + } + ] + }, + { + "label": "Europe", + "value": "europe", + "children": [ + { "label": "France", "value": "france" }, + { "label": "Spain", "value": "spain" }, + { "label": "England", "value": "england" } + ] + }, + { "label": "Africa", "value": "africa" } +] +``` + +:::info +Note: The `value` should be unique throughout the structure array. +::: + +### Checked Values + +Checked values is an array of values passed to select the checkboxes by default. + +**Example:** + +```json +["asia", "spain"] +``` + +### Expanded Values + +Similar to checked values, expanded values is an array of values passed to expand the node by default. + +**Example:** + +```json +["asia"] +``` + +### Events + +
+ +ToolJet - Widget Reference - Tree Select + +
+ +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +#### On change + +On check event is triggered whenever the checkbox value is changed (checked or unchecked). + +#### On check + +On check event is triggered whenever the checkbox value is checked. + +#### On uncheck + +On uncheck event is triggered whenever the checkbox value is unchecked. + +### Layout + +
+ +ToolJet - Widget Reference - Tree Select + +
+ +#### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +#### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
+ +ToolJet - Widget Reference - Tree Select + +
+ +### Text color + +Change the color of the Label by entering the `Hex color code` or choosing a color of your choice from the color-picker. + +### Checkbox color + +You can change the color of the checkbox by entering the `Hex color code` or choosing a color of your choice from the color-picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.3.0/widgets/vertical-divider.md b/docs/versioned_docs/version-2.3.0/widgets/vertical-divider.md new file mode 100644 index 0000000000..8cf2894a1c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/widgets/vertical-divider.md @@ -0,0 +1,57 @@ +--- +id: vertical-divider +title: Vertical Divider +--- +# Vertical Divider + +Vertical Divider widget is used to add vertical separator between components. + +
+ +ToolJet - Widget Reference - Vertical divider + +
+ +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
+ +ToolJet - Widget Reference - Vertical divider + +
+ +## Layout + +
+ +ToolJet - Widget Reference - Vertical divider + +
+ +| properties | description | +| ----------- | ----------- | +| Show on Desktop | This property have toggle switch. If enabled, the divider will display in the desktop view else it will not appear. | +| Show on Mobile | This property have toggle switch. If enabled, the divider will display in the mobile view else it will not appear. | + +## Styles + +
+ +ToolJet - Widget Reference - Vertical divider + +
+ +| properties | description | +| ----------- | ----------- | +| Divider Color | It is used to set the color of the divider. Use hex code to set the background color. | +| Visibility | This property is used to set the visibility of the divider. The property accepts Boolean value. | + + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_sidebars/version-2.3.0-sidebars.json b/docs/versioned_sidebars/version-2.3.0-sidebars.json new file mode 100644 index 0000000000..5ef0e3a678 --- /dev/null +++ b/docs/versioned_sidebars/version-2.3.0-sidebars.json @@ -0,0 +1,369 @@ +{ + "docs": [ + "getting-started", + { + "type": "category", + "label": "Setup", + "link": { + "type": "doc", + "id": "setup/index" + }, + "items": [ + "setup/try-tooljet", + "setup/digitalocean", + "setup/docker", + "setup/heroku", + "setup/ec2", + "setup/ecs", + "setup/openshift", + "setup/kubernetes", + "setup/kubernetes-gke", + "setup/kubernetes-aks", + "setup/google-cloud-run", + "setup/client", + "setup/env-vars", + "setup/http-proxy", + "setup/tooljet-subpath", + "setup/v2-migration-guide" + ] + }, + "tooljet-database", + { + "type": "category", + "label": "Datasource Catalog", + "items": [ + "data-sources/overview", + { + "type": "category", + "label": "Datasources library", + "items": [ + "data-sources/airtable", + "data-sources/s3", + "data-sources/amazonses", + "data-sources/appwrite", + "data-sources/athena", + "data-sources/baserow", + "data-sources/bigquery", + "data-sources/firestore", + "data-sources/clickhouse", + "data-sources/cosmosdb", + "data-sources/couchdb", + "data-sources/dynamodb", + "data-sources/elasticsearch", + "data-sources/gcs", + "data-sources/google.sheets", + "data-sources/graphql", + "data-sources/influxdb", + "data-sources/mailgun", + "data-sources/mariadb", + "data-sources/minio", + "data-sources/mongodb", + "data-sources/mssql", + "data-sources/mysql", + "data-sources/n8n", + "data-sources/notion", + "data-sources/openapi", + "data-sources/oracledb", + "data-sources/postgresql", + "data-sources/redis", + "data-sources/restapi", + "data-sources/rethinkdb", + "data-sources/run-js", + "data-sources/run-py", + "data-sources/saphana", + "data-sources/sendgrid", + "data-sources/slack", + "data-sources/smtp", + "data-sources/snowflake", + "data-sources/stripe", + "data-sources/twilio", + "data-sources/typesense", + "data-sources/woocommerce", + "data-sources/zendesk" + ] + }, + "tutorial/transformations" + ] + }, + { + "type": "category", + "label": "Components Catalog", + "items": [ + "widgets/overview", + { + "type": "category", + "label": "Components library", + "items": [ + "widgets/bounded-box", + "widgets/button", + "widgets/button-group", + "widgets/calendar", + "widgets/chart", + "widgets/checkbox", + "widgets/circular-progress-bar", + "widgets/code-editor", + "widgets/color-picker", + "widgets/container", + "widgets/custom-component", + "widgets/date-range-picker", + "widgets/datepicker", + "widgets/divider", + "widgets/dropdown", + "widgets/file-picker", + "widgets/form", + "widgets/html", + "widgets/icon", + "widgets/iframe", + "widgets/image", + "widgets/kanban", + "widgets/link", + "widgets/listview", + "widgets/map", + "widgets/modal", + "widgets/multiselect", + "widgets/number-input", + "widgets/password-input", + "widgets/pdf", + "widgets/pagination", + "widgets/qr-scanner", + "widgets/radio-button", + "widgets/range-slider", + "widgets/rich-text-editor", + "widgets/spinner", + "widgets/star-rating", + "widgets/statistics", + "widgets/steps", + "widgets/svg-image", + "widgets/table", + "widgets/tabs", + "widgets/tags", + "widgets/text-input", + "widgets/text", + "widgets/textarea", + "widgets/timeline", + "widgets/timer", + "widgets/toggle-switch", + "widgets/tree-select", + "widgets/vertical-divider" + ] + }, + { + "type": "category", + "label": "Actions Reference", + "link": { + "type": "generated-index", + "title": "Actions Reference", + "description": "All the actions that can be performed through event handlers", + "keywords": [ + "actions", + "events" + ] + }, + "items": [ + "actions/show-alert", + "actions/logout", + "actions/run-query", + "actions/open-webpage", + "actions/go-to-app", + "actions/show-modal", + "actions/close-modal", + "actions/copy-to-clipboard", + "actions/set-localstorage", + "actions/generate-file", + "actions/set-table-page", + "actions/set-variable", + "actions/unset-variable", + "actions/switch-page", + "actions/set-page-variable", + "actions/unset-page-variable", + "actions/control-component" + ] + } + ] + }, + { + "type": "category", + "label": "App Builder", + "items": [ + "app-builder/overview", + "app-builder/toolbar", + "app-builder/canvas", + "app-builder/left-sidebar", + "app-builder/components-library", + "app-builder/query-panel", + "tutorial/pages", + "tutorial/keyboard-shortcuts" + ] + }, + { + "type": "category", + "label": "Org Management", + "items": [ + { + "type": "category", + "label": "User Authentication", + "link": { + "type": "generated-index", + "title": "User Authentication", + "description": "Guides for setting up User Authentication and managing Single Sign-On", + "keywords": [ + "SSO", + "authentication" + ] + }, + "collapsed": true, + "items": [ + "user-authentication/user-lifecycle", + "user-authentication/general-settings", + "user-authentication/password-login", + { + "type": "category", + "label": "SSO", + "items": [ + "user-authentication/sso/github", + "user-authentication/sso/google", + { + "type": "category", + "label": "OpenId Connect", + "link": { + "type": "generated-index", + "title": "OpenId Connect", + "description": " ", + "keywords": [ + "okta", + "openid", + "azureAD" + ] + }, + "collapsed": false, + "items": [ + "user-authentication/sso/openid/setup", + "user-authentication/sso/openid/azuread", + "user-authentication/sso/openid/okta", + "user-authentication/sso/openid/google-openid" + ] + } + ] + } + ] + }, + { + "type": "category", + "label": "Workspaces", + "items": [ + "tutorial/multiworkspace", + "tutorial/workspace-environment-variables" + ] + }, + "org-management/permissions", + "tutorial/manage-users-groups", + "Enterprise/audit_logs", + "Enterprise/white-label", + "Enterprise/superadmin" + ] + }, + { + "type": "category", + "label": "Release Management", + "items": [ + "release-management/multi-environment", + "tutorial/versioning-and-release" + ] + }, + "marketplace", + { + "type": "category", + "label": "How To", + "link": { + "type": "generated-index", + "title": "How To Guides", + "description": "How To Guides for all the things ToolJet", + "keywords": [ + "how to" + ] + }, + "items": [ + "how-to/build-plugin-for-marketplace", + "how-to/use-inspector", + "how-to/use-form-component", + "how-to/access-cellvalue-rowdata", + "how-to/bulk-update-multiple-rows", + "how-to/access-currentuser", + "how-to/use-axios-in-runjs", + "how-to/import-external-libraries-using-runpy", + "how-to/run-actions-from-runjs", + "how-to/run-query-at-specified-intervals", + "how-to/access-users-location", + "how-to/s3-custom-endpoints", + "how-to/oauth2-authorization", + "how-to/upload-files-aws", + "how-to/upload-files-gcs", + "how-to/loading-image-pdf-from-db" + ] + }, + { + "type": "category", + "label": "Contributing Guide", + "link": { + "type": "generated-index", + "title": "Contributing Guide", + "description": "Guides for contributing to ToolJet", + "keywords": [ + "contribute", + "contributing" + ] + }, + "collapsed": false, + "items": [ + "contributing-guide/setup/architecture", + { + "type": "category", + "label": "Setup", + "items": [ + "contributing-guide/setup/macos", + "contributing-guide/setup/docker", + "contributing-guide/setup/ubuntu" + ] + }, + { + "type": "category", + "label": "Tutorials", + "items": [ + "contributing-guide/tutorials/creating-widget", + "contributing-guide/tutorials/creating-a-plugin" + ] + }, + "contributing-guide/testing", + "contributing-guide/l10n", + { + "type": "category", + "label": "Troubleshooting", + "items": [ + "contributing-guide/troubleshooting/eslint" + ] + }, + "contributing-guide/code-of-conduct", + "contributing-guide/slackcoc" + ] + }, + "security", + "tracking", + { + "type": "category", + "label": "Project Overview", + "collapsed": false, + "items": [ + { + "type": "link", + "label": "Releases", + "href": "https://github.com/ToolJet/ToolJet/releases" + }, + { + "type": "link", + "label": "Roadmap", + "href": "https://github.com/ToolJet/ToolJet/projects/2?query=is%3Aopen+sort%3Aupdated-desc" + } + ] + } + ] +} diff --git a/docs/versions.json b/docs/versions.json index aed6ac1809..8d51b523ee 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1,4 +1,5 @@ [ + "2.3.0", "2.2.0", "2.1.0", "2.0.0", From a728762c304b0df32dd702738bd4483d0d5baeac Mon Sep 17 00:00:00 2001 From: Shubhendra Singh Chauhan Date: Tue, 4 Apr 2023 12:32:10 +0530 Subject: [PATCH 06/23] [docs] how-to:run multiple actions using runjs (#5919) --- docs/docs/how-to/run-action-from-runjs.md | 17 ++++++++++++++--- .../how-to/run-query-at-specified-intervals.md | 9 +++++++++ .../how-to/run-action-from-runjs.md | 16 ++++++++++++++-- .../how-to/run-query-at-specified-intervals.md | 10 ++++++++++ .../how-to/run-action-from-runjs.md | 15 ++++++++++++++- .../how-to/run-query-at-specified-intervals.md | 10 ++++++++++ .../how-to/run-action-from-runjs.md | 15 ++++++++++++++- .../how-to/run-query-at-specified-intervals.md | 10 ++++++++++ .../how-to/run-action-from-runjs.md | 15 ++++++++++++++- .../how-to/run-query-at-specified-intervals.md | 10 ++++++++++ 10 files changed, 119 insertions(+), 8 deletions(-) diff --git a/docs/docs/how-to/run-action-from-runjs.md b/docs/docs/how-to/run-action-from-runjs.md index c9b776fd28..db444ab2a6 100644 --- a/docs/docs/how-to/run-action-from-runjs.md +++ b/docs/docs/how-to/run-action-from-runjs.md @@ -185,9 +185,20 @@ actions.showAlert('error' , 'This is an error' ) - - - +## Run multiple actions from runjs query + +To run multiple actions from a runjs query, you'll have to use async-await in the function. + +Here is an sample code for running the queries and showing alert after specific intervals. Check the complete guide on running queries at specified intervals **[here](/docs/next/how-to/run-query-at-specified-intervals)**. + +```js +actions.setVariable('interval',setInterval(countdown, 5000)); +async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') +} +``` diff --git a/docs/docs/how-to/run-query-at-specified-intervals.md b/docs/docs/how-to/run-query-at-specified-intervals.md index 89b2a87428..50ff8b5f3f 100644 --- a/docs/docs/how-to/run-query-at-specified-intervals.md +++ b/docs/docs/how-to/run-query-at-specified-intervals.md @@ -28,6 +28,15 @@ In this how-to guide, we will learn how to make a query trigger at the specific queries.post.run() } ``` + - Or use **async**-**await** in the function, if you're triggering multiple actions: + ```js + actions.setVariable('interval',setInterval(countdown, 5000)); + async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') + } + ``` - Go to the **Advanced** tab of the query, enable `Run query on page load?` this will trigger this RunJS query when the app is loaded. Name the query as `set` and **Save** it. Note that you will have to save the query and not `Save and Run` because doing it will trigger the query and you won't be able to stop the query unless you reload the page or go back to dashboard.
diff --git a/docs/versioned_docs/version-1.x.x/how-to/run-action-from-runjs.md b/docs/versioned_docs/version-1.x.x/how-to/run-action-from-runjs.md index f2cef05935..fe7ca8ce70 100644 --- a/docs/versioned_docs/version-1.x.x/how-to/run-action-from-runjs.md +++ b/docs/versioned_docs/version-1.x.x/how-to/run-action-from-runjs.md @@ -182,8 +182,20 @@ actions.showAlert(alert type , message ) // alert types are info, success, warni
- - +## Run multiple actions from runjs query + +To run multiple actions from a runjs query, you'll have to use async-await in the function. + +Here is an sample code for running the queries and showing alert after specific intervals. Check the complete guide on running queries at specified intervals **[here](/docs/next/how-to/run-query-at-specified-intervals)**. + +```js +actions.setVariable('interval',setInterval(countdown, 5000)); +async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') +} +``` diff --git a/docs/versioned_docs/version-1.x.x/how-to/run-query-at-specified-intervals.md b/docs/versioned_docs/version-1.x.x/how-to/run-query-at-specified-intervals.md index 89b2a87428..c8f058f0ea 100644 --- a/docs/versioned_docs/version-1.x.x/how-to/run-query-at-specified-intervals.md +++ b/docs/versioned_docs/version-1.x.x/how-to/run-query-at-specified-intervals.md @@ -28,6 +28,16 @@ In this how-to guide, we will learn how to make a query trigger at the specific queries.post.run() } ``` + - Or use **async**-**await** in the function, if you're triggering multiple actions: + ```js + actions.setVariable('interval',setInterval(countdown, 5000)); + async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') + } + ``` + - Go to the **Advanced** tab of the query, enable `Run query on page load?` this will trigger this RunJS query when the app is loaded. Name the query as `set` and **Save** it. Note that you will have to save the query and not `Save and Run` because doing it will trigger the query and you won't be able to stop the query unless you reload the page or go back to dashboard.
diff --git a/docs/versioned_docs/version-2.0.0/how-to/run-action-from-runjs.md b/docs/versioned_docs/version-2.0.0/how-to/run-action-from-runjs.md index f2cef05935..75d18e36be 100644 --- a/docs/versioned_docs/version-2.0.0/how-to/run-action-from-runjs.md +++ b/docs/versioned_docs/version-2.0.0/how-to/run-action-from-runjs.md @@ -182,7 +182,20 @@ actions.showAlert(alert type , message ) // alert types are info, success, warni
- +## Run multiple actions from runjs query + +To run multiple actions from a runjs query, you'll have to use async-await in the function. + +Here is an sample code for running the queries and showing alert after specific intervals. Check the complete guide on running queries at specified intervals **[here](/docs/next/how-to/run-query-at-specified-intervals)**. + +```js +actions.setVariable('interval',setInterval(countdown, 5000)); +async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') +} +``` diff --git a/docs/versioned_docs/version-2.0.0/how-to/run-query-at-specified-intervals.md b/docs/versioned_docs/version-2.0.0/how-to/run-query-at-specified-intervals.md index 89b2a87428..c8f058f0ea 100644 --- a/docs/versioned_docs/version-2.0.0/how-to/run-query-at-specified-intervals.md +++ b/docs/versioned_docs/version-2.0.0/how-to/run-query-at-specified-intervals.md @@ -28,6 +28,16 @@ In this how-to guide, we will learn how to make a query trigger at the specific queries.post.run() } ``` + - Or use **async**-**await** in the function, if you're triggering multiple actions: + ```js + actions.setVariable('interval',setInterval(countdown, 5000)); + async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') + } + ``` + - Go to the **Advanced** tab of the query, enable `Run query on page load?` this will trigger this RunJS query when the app is loaded. Name the query as `set` and **Save** it. Note that you will have to save the query and not `Save and Run` because doing it will trigger the query and you won't be able to stop the query unless you reload the page or go back to dashboard.
diff --git a/docs/versioned_docs/version-2.1.0/how-to/run-action-from-runjs.md b/docs/versioned_docs/version-2.1.0/how-to/run-action-from-runjs.md index f2cef05935..75d18e36be 100644 --- a/docs/versioned_docs/version-2.1.0/how-to/run-action-from-runjs.md +++ b/docs/versioned_docs/version-2.1.0/how-to/run-action-from-runjs.md @@ -182,7 +182,20 @@ actions.showAlert(alert type , message ) // alert types are info, success, warni
- +## Run multiple actions from runjs query + +To run multiple actions from a runjs query, you'll have to use async-await in the function. + +Here is an sample code for running the queries and showing alert after specific intervals. Check the complete guide on running queries at specified intervals **[here](/docs/next/how-to/run-query-at-specified-intervals)**. + +```js +actions.setVariable('interval',setInterval(countdown, 5000)); +async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') +} +``` diff --git a/docs/versioned_docs/version-2.1.0/how-to/run-query-at-specified-intervals.md b/docs/versioned_docs/version-2.1.0/how-to/run-query-at-specified-intervals.md index 89b2a87428..c8f058f0ea 100644 --- a/docs/versioned_docs/version-2.1.0/how-to/run-query-at-specified-intervals.md +++ b/docs/versioned_docs/version-2.1.0/how-to/run-query-at-specified-intervals.md @@ -28,6 +28,16 @@ In this how-to guide, we will learn how to make a query trigger at the specific queries.post.run() } ``` + - Or use **async**-**await** in the function, if you're triggering multiple actions: + ```js + actions.setVariable('interval',setInterval(countdown, 5000)); + async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') + } + ``` + - Go to the **Advanced** tab of the query, enable `Run query on page load?` this will trigger this RunJS query when the app is loaded. Name the query as `set` and **Save** it. Note that you will have to save the query and not `Save and Run` because doing it will trigger the query and you won't be able to stop the query unless you reload the page or go back to dashboard.
diff --git a/docs/versioned_docs/version-2.2.0/how-to/run-action-from-runjs.md b/docs/versioned_docs/version-2.2.0/how-to/run-action-from-runjs.md index f2cef05935..75d18e36be 100644 --- a/docs/versioned_docs/version-2.2.0/how-to/run-action-from-runjs.md +++ b/docs/versioned_docs/version-2.2.0/how-to/run-action-from-runjs.md @@ -182,7 +182,20 @@ actions.showAlert(alert type , message ) // alert types are info, success, warni
- +## Run multiple actions from runjs query + +To run multiple actions from a runjs query, you'll have to use async-await in the function. + +Here is an sample code for running the queries and showing alert after specific intervals. Check the complete guide on running queries at specified intervals **[here](/docs/next/how-to/run-query-at-specified-intervals)**. + +```js +actions.setVariable('interval',setInterval(countdown, 5000)); +async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') +} +``` diff --git a/docs/versioned_docs/version-2.2.0/how-to/run-query-at-specified-intervals.md b/docs/versioned_docs/version-2.2.0/how-to/run-query-at-specified-intervals.md index 89b2a87428..c8f058f0ea 100644 --- a/docs/versioned_docs/version-2.2.0/how-to/run-query-at-specified-intervals.md +++ b/docs/versioned_docs/version-2.2.0/how-to/run-query-at-specified-intervals.md @@ -28,6 +28,16 @@ In this how-to guide, we will learn how to make a query trigger at the specific queries.post.run() } ``` + - Or use **async**-**await** in the function, if you're triggering multiple actions: + ```js + actions.setVariable('interval',setInterval(countdown, 5000)); + async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') + } + ``` + - Go to the **Advanced** tab of the query, enable `Run query on page load?` this will trigger this RunJS query when the app is loaded. Name the query as `set` and **Save** it. Note that you will have to save the query and not `Save and Run` because doing it will trigger the query and you won't be able to stop the query unless you reload the page or go back to dashboard.
From c98270f7aafae63283e3f0566bd8a9bc54a90ffd Mon Sep 17 00:00:00 2001 From: Shubhendra Singh Chauhan Date: Tue, 4 Apr 2023 19:02:10 +0530 Subject: [PATCH 07/23] [docs] updated how-tos in 2.3 (#5927) --- docs/docs/how-to/run-action-from-runjs.md | 4 +- .../how-to/import-external-lib-js.md | 96 +++++++++++++++++++ .../how-to/run-action-from-runjs.md | 15 ++- .../run-query-at-specified-intervals.md | 10 ++ .../version-2.3.0-sidebars.json | 3 +- 5 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 docs/versioned_docs/version-2.3.0/how-to/import-external-lib-js.md diff --git a/docs/docs/how-to/run-action-from-runjs.md b/docs/docs/how-to/run-action-from-runjs.md index db444ab2a6..6e70d38c1f 100644 --- a/docs/docs/how-to/run-action-from-runjs.md +++ b/docs/docs/how-to/run-action-from-runjs.md @@ -187,9 +187,9 @@ actions.showAlert('error' , 'This is an error' ) ## Run multiple actions from runjs query -To run multiple actions from a runjs query, you'll have to use async-await in the function. +To run multiple actions from a runjs query, you'll have to use **async-await** in the function. -Here is an sample code for running the queries and showing alert after specific intervals. Check the complete guide on running queries at specified intervals **[here](/docs/next/how-to/run-query-at-specified-intervals)**. +Here is a example code snippet for running the queries and showing alert after specific intervals. Check the complete guide on running queries at specified intervals **[here](/docs/next/how-to/run-query-at-specified-intervals)**. ```js actions.setVariable('interval',setInterval(countdown, 5000)); diff --git a/docs/versioned_docs/version-2.3.0/how-to/import-external-lib-js.md b/docs/versioned_docs/version-2.3.0/how-to/import-external-lib-js.md new file mode 100644 index 0000000000..27b6b49c97 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/how-to/import-external-lib-js.md @@ -0,0 +1,96 @@ +--- +id: import-external-libraries-using-runjs +title: Import external libraries using RunJS +--- + +ToolJet allows you to utilize external libraries in your app by importing them using the [RunJS query](/docs/data-sources/run-js). + +In this how-to guide, we will import a few JavaScript libraries and use it in the application. + +:::tip +You can import any of the available libraries using their **CDN**. Find free CDN of the open source projects at **[jsDelivr](https://www.jsdelivr.com/)** +::: + +- Create a new application and then create a new RunPy query from the query panel. +
+ + Import external libraries using RunJS + +
+ +- Let's write some code for importing libraries. We will first create a function `addScript` that returns a `Promise`, the `Promise` creates a script tag -> sets an attribute -> and eventListener `resolves` if its loaded and `rejects` if there is an error, and then body is appended at the end. +- We are going to import two libraries using their CDNs: **MathJS** and **Flatten**, and display an alert when the libraries are loaded successfully. + ```js + function addScript(src) { + return new Promise((resolve, reject) => { + const s = document.createElement('script'); + s.setAttribute('src', src); + s.addEventListener('load', resolve); + s.addEventListener('error', reject); + document.body.appendChild(s); + }); + } + + try { + await addScript('https://cdn.jsdelivr.net/npm/mathjs@11.7.0'); + await addScript('https://cdn.jsdelivr.net/npm/flattenjs@2.1.3/lib/flatten.min.js'); + + await actions.showAlert("success", 'Mathjs and Flatten imported') + + + } catch (e) { + console.log(e); + } + ``` + +- Now, when you hit **create** and then **run** the query, the script will be injected into the DOM. An alert should pop-up with the message **Mathjs and Flatten imported**. + +
+ + Import external libraries using RunJS + +
+ +:::tip +Enable the **Run this query on application load?** option to make the libraries available throughout the application as soon as the app is laoded. +::: + +## Examples + +### Flatten the JSON objects using FlattenJS + +- Let's create a new **RunJS** query that will use **Flatten** library(imported in the above section) and the query will flatten the JSON object. + ```js + return flatten({ + key1: { + keyA: 'valueI' + }, + key2: { + keyB: 'valueII' + }, + key3: { a: { b: { c: 2 } } } + }) + ``` +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
+ + Import external libraries using RunJS + +
+ +### Computation using MathJS + +- Let's create a new **RunJS** query that will return the result of calculation performed by [atan2](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2) method and then divided by [pi](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/PI). +```js +return math.atan2(3, -3) / math.pi +``` + +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
+ + Import external libraries using RunJS + +
+ \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/how-to/run-action-from-runjs.md b/docs/versioned_docs/version-2.3.0/how-to/run-action-from-runjs.md index c9b776fd28..cd884f453a 100644 --- a/docs/versioned_docs/version-2.3.0/how-to/run-action-from-runjs.md +++ b/docs/versioned_docs/version-2.3.0/how-to/run-action-from-runjs.md @@ -185,7 +185,20 @@ actions.showAlert('error' , 'This is an error' )
- +## Run multiple actions from runjs query + +To run multiple actions from a runjs query, you'll have to use **async-await** in the function. + +Here is a example code snippet for running the queries and showing alert after specific intervals. Check the complete guide on running queries at specified intervals **[here](/docs/next/how-to/run-query-at-specified-intervals)**. + +```js +actions.setVariable('interval',setInterval(countdown, 5000)); +async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') +} +``` diff --git a/docs/versioned_docs/version-2.3.0/how-to/run-query-at-specified-intervals.md b/docs/versioned_docs/version-2.3.0/how-to/run-query-at-specified-intervals.md index 89b2a87428..4f4686626c 100644 --- a/docs/versioned_docs/version-2.3.0/how-to/run-query-at-specified-intervals.md +++ b/docs/versioned_docs/version-2.3.0/how-to/run-query-at-specified-intervals.md @@ -28,6 +28,16 @@ In this how-to guide, we will learn how to make a query trigger at the specific queries.post.run() } ``` + - Or use **async**-**await** in the function, if you're triggering multiple actions: + ```js + actions.setVariable('interval',setInterval(countdown, 5000)); + async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') + } + ``` + - Go to the **Advanced** tab of the query, enable `Run query on page load?` this will trigger this RunJS query when the app is loaded. Name the query as `set` and **Save** it. Note that you will have to save the query and not `Save and Run` because doing it will trigger the query and you won't be able to stop the query unless you reload the page or go back to dashboard.
diff --git a/docs/versioned_sidebars/version-2.3.0-sidebars.json b/docs/versioned_sidebars/version-2.3.0-sidebars.json index 5ef0e3a678..1342f28433 100644 --- a/docs/versioned_sidebars/version-2.3.0-sidebars.json +++ b/docs/versioned_sidebars/version-2.3.0-sidebars.json @@ -291,6 +291,7 @@ "how-to/access-currentuser", "how-to/use-axios-in-runjs", "how-to/import-external-libraries-using-runpy", + "how-to/import-external-libraries-using-runjs", "how-to/run-actions-from-runjs", "how-to/run-query-at-specified-intervals", "how-to/access-users-location", @@ -366,4 +367,4 @@ ] } ] -} +} \ No newline at end of file From 9ad68c1fdfd085cb4c121ca170563cb897d53458 Mon Sep 17 00:00:00 2001 From: Shubhendra Singh Chauhan Date: Wed, 5 Apr 2023 18:09:41 +0530 Subject: [PATCH 08/23] Update slack url in the entire docs (#5938) --- docs/docs/contributing-guide/setup/docker.md | 2 +- docs/docs/data-sources/custom-js.md | 2 +- docs/docs/setup/index.md | 2 +- docs/docs/setup/v2-migration.md | 2 +- docs/docs/tooljet_database.md | 2 +- docs/docusaurus.config.js | 4 ++-- .../version-1.x.x/contributing-guide/setup/docker.md | 2 +- docs/versioned_docs/version-1.x.x/data-sources/custom-js.md | 2 +- docs/versioned_docs/version-1.x.x/intro.md | 2 +- docs/versioned_docs/version-1.x.x/setup/index.md | 2 +- .../version-2.0.0/contributing-guide/setup/docker.md | 2 +- docs/versioned_docs/version-2.0.0/data-sources/custom-js.md | 2 +- docs/versioned_docs/version-2.0.0/setup/docker.md | 2 +- docs/versioned_docs/version-2.0.0/setup/index.md | 2 +- docs/versioned_docs/version-2.0.0/setup/v2-migration.md | 2 +- docs/versioned_docs/version-2.0.0/tooljet_database.md | 2 +- .../version-2.1.0/contributing-guide/setup/docker.md | 2 +- docs/versioned_docs/version-2.1.0/data-sources/custom-js.md | 2 +- docs/versioned_docs/version-2.1.0/setup/docker.md | 2 +- docs/versioned_docs/version-2.1.0/setup/index.md | 2 +- docs/versioned_docs/version-2.1.0/setup/v2-migration.md | 2 +- docs/versioned_docs/version-2.1.0/tooljet_database.md | 2 +- .../version-2.2.0/contributing-guide/setup/docker.md | 2 +- docs/versioned_docs/version-2.2.0/data-sources/custom-js.md | 2 +- docs/versioned_docs/version-2.2.0/setup/docker.md | 2 +- docs/versioned_docs/version-2.2.0/setup/index.md | 2 +- docs/versioned_docs/version-2.2.0/setup/v2-migration.md | 2 +- docs/versioned_docs/version-2.2.0/tooljet_database.md | 2 +- docs/versioned_docs/version-2.3.0/contributing-guide/l10n.md | 2 +- .../version-2.3.0/contributing-guide/setup/docker.md | 2 +- docs/versioned_docs/version-2.3.0/data-sources/custom-js.md | 2 +- docs/versioned_docs/version-2.3.0/setup/docker.md | 2 +- docs/versioned_docs/version-2.3.0/setup/index.md | 2 +- docs/versioned_docs/version-2.3.0/setup/v2-migration.md | 2 +- docs/versioned_docs/version-2.3.0/tooljet_database.md | 2 +- 35 files changed, 36 insertions(+), 36 deletions(-) diff --git a/docs/docs/contributing-guide/setup/docker.md b/docs/docs/contributing-guide/setup/docker.md index 899918f4eb..f2f2c7bdde 100644 --- a/docs/docs/contributing-guide/setup/docker.md +++ b/docs/docs/contributing-guide/setup/docker.md @@ -179,4 +179,4 @@ docker-compose run --rm server npm --prefix server run test ## Troubleshooting -Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our Slack channel (https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) if you encounter any issues when trying to run ToolJet locally. +Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our [Slack Community](https://tooljet.com/slack) if you encounter any issues when trying to run ToolJet locally. diff --git a/docs/docs/data-sources/custom-js.md b/docs/docs/data-sources/custom-js.md index 6655a6efdf..694d2cbbe3 100644 --- a/docs/docs/data-sources/custom-js.md +++ b/docs/docs/data-sources/custom-js.md @@ -52,5 +52,5 @@ ToolJet allows you to internally utilize these libraries: | Axios | [https://axios-http.com/docs/intro](https://axios-http.com/docs/intro) | :::info -Issues with writing custom JavaScript code? Ask in our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg). +Issues with writing custom JavaScript code? Ask in our [Slack Community](https://tooljet.com/slack). ::: \ No newline at end of file diff --git a/docs/docs/setup/index.md b/docs/docs/setup/index.md index fb519a44b3..098fe269f7 100644 --- a/docs/docs/setup/index.md +++ b/docs/docs/setup/index.md @@ -9,4 +9,4 @@ import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` -If you have any questions feel free to join our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) or send us an email at hello@tooljet.com. \ No newline at end of file +If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. \ No newline at end of file diff --git a/docs/docs/setup/v2-migration.md b/docs/docs/setup/v2-migration.md index f8ded40f23..c44bacd808 100644 --- a/docs/docs/setup/v2-migration.md +++ b/docs/docs/setup/v2-migration.md @@ -29,5 +29,5 @@ Server may take some time to be ready to handle the HTTP request as v2 changes r - Docker compose deployments with [auto SSL](/docs/1.x.x/setup/docker) is deprecated ## Help and Support -- Feel free to join our highly active **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg)** or you can also e-mail us at **hello@tooljet.com**. +- Feel free to join our highly active **[Slack Community](https://tooljet.com/slack)** or you can also e-mail us at **hello@tooljet.com**. - If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. diff --git a/docs/docs/tooljet_database.md b/docs/docs/tooljet_database.md index 92549ffec2..9c03d20ba1 100644 --- a/docs/docs/tooljet_database.md +++ b/docs/docs/tooljet_database.md @@ -298,5 +298,5 @@ This operation deletes a record from the table - **Filter**: Add a condition by choosing a column, an operation, and the value for deleting a particular record. :::info -If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com)** +If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com/slack)** ::: diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index f7b4717b6e..9b5861745d 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -56,7 +56,7 @@ module.exports = { 'aria-label': 'GitHub repository', }, { - href: 'https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg', + href: 'https://tooljet.com/slack', position: 'right', className: 'navbar-social-link navbar-slack-logo', 'aria-label': 'Slack workspace', @@ -86,7 +86,7 @@ module.exports = { items: [ { label: 'Slack', - href: 'https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg', + href: 'https://tooljet.com/slack', }, ], }, diff --git a/docs/versioned_docs/version-1.x.x/contributing-guide/setup/docker.md b/docs/versioned_docs/version-1.x.x/contributing-guide/setup/docker.md index cbb6c95e31..37090aa488 100644 --- a/docs/versioned_docs/version-1.x.x/contributing-guide/setup/docker.md +++ b/docs/versioned_docs/version-1.x.x/contributing-guide/setup/docker.md @@ -190,4 +190,4 @@ docker-compose run --rm server npm --prefix server run test ## Troubleshooting -Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our Slack channel (https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) if you encounter any issues when trying to run ToolJet locally. +Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our [Slack Community](https://tooljet.com/slack) if you encounter any issues when trying to run ToolJet locally. diff --git a/docs/versioned_docs/version-1.x.x/data-sources/custom-js.md b/docs/versioned_docs/version-1.x.x/data-sources/custom-js.md index baf52c465e..444ce83348 100644 --- a/docs/versioned_docs/version-1.x.x/data-sources/custom-js.md +++ b/docs/versioned_docs/version-1.x.x/data-sources/custom-js.md @@ -48,6 +48,6 @@ ToolJet allows you to internally utilize these libraries: :::danger -Issues with writing custom JavaScript code? Ask in our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg). +Issues with writing custom JavaScript code? Ask in our [Slack Community](https://tooljet.com/slack). ::: \ No newline at end of file diff --git a/docs/versioned_docs/version-1.x.x/intro.md b/docs/versioned_docs/version-1.x.x/intro.md index a50ff181ae..e21c781ce4 100644 --- a/docs/versioned_docs/version-1.x.x/intro.md +++ b/docs/versioned_docs/version-1.x.x/intro.md @@ -50,4 +50,4 @@ The references for data sources and widgets: - We have extensively documented the features of ToolJet, but in case you are stuck, please feel free to e-mail us at **hello@tooljet.com** - If you are using ToolJet cloud, click on the chat icon at the bottom-left corner for instant help. - If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. -- Feel free to join our highly active **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg)**. +- Feel free to join our highly active **[Slack Community](https://tooljet.com/slack)**. diff --git a/docs/versioned_docs/version-1.x.x/setup/index.md b/docs/versioned_docs/version-1.x.x/setup/index.md index 6b09b765f9..21acee6f3a 100644 --- a/docs/versioned_docs/version-1.x.x/setup/index.md +++ b/docs/versioned_docs/version-1.x.x/setup/index.md @@ -9,4 +9,4 @@ import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` -If you have any questions feel free to join our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) or send us an email at hello@tooljet.com. \ No newline at end of file +If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.0.0/contributing-guide/setup/docker.md b/docs/versioned_docs/version-2.0.0/contributing-guide/setup/docker.md index 899918f4eb..178182c79e 100644 --- a/docs/versioned_docs/version-2.0.0/contributing-guide/setup/docker.md +++ b/docs/versioned_docs/version-2.0.0/contributing-guide/setup/docker.md @@ -179,4 +179,4 @@ docker-compose run --rm server npm --prefix server run test ## Troubleshooting -Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our Slack channel (https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) if you encounter any issues when trying to run ToolJet locally. +SlackPlease open a new issue at https://github.com/ToolJet/ToolJet/issues or join our [Slack Community](https://tooljet.com/slack) if you encounter any issues when trying to run ToolJet locally. diff --git a/docs/versioned_docs/version-2.0.0/data-sources/custom-js.md b/docs/versioned_docs/version-2.0.0/data-sources/custom-js.md index 6655a6efdf..694d2cbbe3 100644 --- a/docs/versioned_docs/version-2.0.0/data-sources/custom-js.md +++ b/docs/versioned_docs/version-2.0.0/data-sources/custom-js.md @@ -52,5 +52,5 @@ ToolJet allows you to internally utilize these libraries: | Axios | [https://axios-http.com/docs/intro](https://axios-http.com/docs/intro) | :::info -Issues with writing custom JavaScript code? Ask in our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg). +Issues with writing custom JavaScript code? Ask in our [Slack Community](https://tooljet.com/slack). ::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.0.0/setup/docker.md b/docs/versioned_docs/version-2.0.0/setup/docker.md index c23a52343d..41d775b22f 100644 --- a/docs/versioned_docs/version-2.0.0/setup/docker.md +++ b/docs/versioned_docs/version-2.0.0/setup/docker.md @@ -24,7 +24,7 @@ There are two options to deploy ToolJet using Docker Compose: 1. **Using an external PostgreSQL database**. This setup is recommended if you want to use a managed PostgreSQL service such as AWS RDS or Google Cloud SQL. 2. **Using in-built PostgreSQL database**. This setup uses the official Docker image of PostgreSQL. -Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack. +Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack :::info We recommend using the managed PostgreSQL service on production for ease of administration, security, and management (backups, monitoring, etc). diff --git a/docs/versioned_docs/version-2.0.0/setup/index.md b/docs/versioned_docs/version-2.0.0/setup/index.md index 4e6274d6cb..f376d508bc 100644 --- a/docs/versioned_docs/version-2.0.0/setup/index.md +++ b/docs/versioned_docs/version-2.0.0/setup/index.md @@ -9,4 +9,4 @@ import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` -If you have any questions feel free to join our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) or send us an email at hello@tooljet.com. \ No newline at end of file +If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.0.0/setup/v2-migration.md b/docs/versioned_docs/version-2.0.0/setup/v2-migration.md index f8ded40f23..c44bacd808 100644 --- a/docs/versioned_docs/version-2.0.0/setup/v2-migration.md +++ b/docs/versioned_docs/version-2.0.0/setup/v2-migration.md @@ -29,5 +29,5 @@ Server may take some time to be ready to handle the HTTP request as v2 changes r - Docker compose deployments with [auto SSL](/docs/1.x.x/setup/docker) is deprecated ## Help and Support -- Feel free to join our highly active **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg)** or you can also e-mail us at **hello@tooljet.com**. +- Feel free to join our highly active **[Slack Community](https://tooljet.com/slack)** or you can also e-mail us at **hello@tooljet.com**. - If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. diff --git a/docs/versioned_docs/version-2.0.0/tooljet_database.md b/docs/versioned_docs/version-2.0.0/tooljet_database.md index ede8e33b25..4f492767b6 100644 --- a/docs/versioned_docs/version-2.0.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.0.0/tooljet_database.md @@ -288,5 +288,5 @@ This operation deletes a record from the table - **Filter**: Add a condition by choosing a column, an operation, and the value for deleting a particular record. :::info -If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com)** +If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com/slack)** ::: diff --git a/docs/versioned_docs/version-2.1.0/contributing-guide/setup/docker.md b/docs/versioned_docs/version-2.1.0/contributing-guide/setup/docker.md index 899918f4eb..f2f2c7bdde 100644 --- a/docs/versioned_docs/version-2.1.0/contributing-guide/setup/docker.md +++ b/docs/versioned_docs/version-2.1.0/contributing-guide/setup/docker.md @@ -179,4 +179,4 @@ docker-compose run --rm server npm --prefix server run test ## Troubleshooting -Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our Slack channel (https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) if you encounter any issues when trying to run ToolJet locally. +Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our [Slack Community](https://tooljet.com/slack) if you encounter any issues when trying to run ToolJet locally. diff --git a/docs/versioned_docs/version-2.1.0/data-sources/custom-js.md b/docs/versioned_docs/version-2.1.0/data-sources/custom-js.md index 6655a6efdf..694d2cbbe3 100644 --- a/docs/versioned_docs/version-2.1.0/data-sources/custom-js.md +++ b/docs/versioned_docs/version-2.1.0/data-sources/custom-js.md @@ -52,5 +52,5 @@ ToolJet allows you to internally utilize these libraries: | Axios | [https://axios-http.com/docs/intro](https://axios-http.com/docs/intro) | :::info -Issues with writing custom JavaScript code? Ask in our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg). +Issues with writing custom JavaScript code? Ask in our [Slack Community](https://tooljet.com/slack). ::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.1.0/setup/docker.md b/docs/versioned_docs/version-2.1.0/setup/docker.md index c23a52343d..41d775b22f 100644 --- a/docs/versioned_docs/version-2.1.0/setup/docker.md +++ b/docs/versioned_docs/version-2.1.0/setup/docker.md @@ -24,7 +24,7 @@ There are two options to deploy ToolJet using Docker Compose: 1. **Using an external PostgreSQL database**. This setup is recommended if you want to use a managed PostgreSQL service such as AWS RDS or Google Cloud SQL. 2. **Using in-built PostgreSQL database**. This setup uses the official Docker image of PostgreSQL. -Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack. +Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack :::info We recommend using the managed PostgreSQL service on production for ease of administration, security, and management (backups, monitoring, etc). diff --git a/docs/versioned_docs/version-2.1.0/setup/index.md b/docs/versioned_docs/version-2.1.0/setup/index.md index 4e6274d6cb..f376d508bc 100644 --- a/docs/versioned_docs/version-2.1.0/setup/index.md +++ b/docs/versioned_docs/version-2.1.0/setup/index.md @@ -9,4 +9,4 @@ import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` -If you have any questions feel free to join our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) or send us an email at hello@tooljet.com. \ No newline at end of file +If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.1.0/setup/v2-migration.md b/docs/versioned_docs/version-2.1.0/setup/v2-migration.md index f8ded40f23..c44bacd808 100644 --- a/docs/versioned_docs/version-2.1.0/setup/v2-migration.md +++ b/docs/versioned_docs/version-2.1.0/setup/v2-migration.md @@ -29,5 +29,5 @@ Server may take some time to be ready to handle the HTTP request as v2 changes r - Docker compose deployments with [auto SSL](/docs/1.x.x/setup/docker) is deprecated ## Help and Support -- Feel free to join our highly active **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg)** or you can also e-mail us at **hello@tooljet.com**. +- Feel free to join our highly active **[Slack Community](https://tooljet.com/slack)** or you can also e-mail us at **hello@tooljet.com**. - If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. diff --git a/docs/versioned_docs/version-2.1.0/tooljet_database.md b/docs/versioned_docs/version-2.1.0/tooljet_database.md index ede8e33b25..4f492767b6 100644 --- a/docs/versioned_docs/version-2.1.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.1.0/tooljet_database.md @@ -288,5 +288,5 @@ This operation deletes a record from the table - **Filter**: Add a condition by choosing a column, an operation, and the value for deleting a particular record. :::info -If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com)** +If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com/slack)** ::: diff --git a/docs/versioned_docs/version-2.2.0/contributing-guide/setup/docker.md b/docs/versioned_docs/version-2.2.0/contributing-guide/setup/docker.md index 899918f4eb..f2f2c7bdde 100644 --- a/docs/versioned_docs/version-2.2.0/contributing-guide/setup/docker.md +++ b/docs/versioned_docs/version-2.2.0/contributing-guide/setup/docker.md @@ -179,4 +179,4 @@ docker-compose run --rm server npm --prefix server run test ## Troubleshooting -Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our Slack channel (https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) if you encounter any issues when trying to run ToolJet locally. +Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our [Slack Community](https://tooljet.com/slack) if you encounter any issues when trying to run ToolJet locally. diff --git a/docs/versioned_docs/version-2.2.0/data-sources/custom-js.md b/docs/versioned_docs/version-2.2.0/data-sources/custom-js.md index 6655a6efdf..694d2cbbe3 100644 --- a/docs/versioned_docs/version-2.2.0/data-sources/custom-js.md +++ b/docs/versioned_docs/version-2.2.0/data-sources/custom-js.md @@ -52,5 +52,5 @@ ToolJet allows you to internally utilize these libraries: | Axios | [https://axios-http.com/docs/intro](https://axios-http.com/docs/intro) | :::info -Issues with writing custom JavaScript code? Ask in our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg). +Issues with writing custom JavaScript code? Ask in our [Slack Community](https://tooljet.com/slack). ::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.2.0/setup/docker.md b/docs/versioned_docs/version-2.2.0/setup/docker.md index c23a52343d..41d775b22f 100644 --- a/docs/versioned_docs/version-2.2.0/setup/docker.md +++ b/docs/versioned_docs/version-2.2.0/setup/docker.md @@ -24,7 +24,7 @@ There are two options to deploy ToolJet using Docker Compose: 1. **Using an external PostgreSQL database**. This setup is recommended if you want to use a managed PostgreSQL service such as AWS RDS or Google Cloud SQL. 2. **Using in-built PostgreSQL database**. This setup uses the official Docker image of PostgreSQL. -Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack. +Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack :::info We recommend using the managed PostgreSQL service on production for ease of administration, security, and management (backups, monitoring, etc). diff --git a/docs/versioned_docs/version-2.2.0/setup/index.md b/docs/versioned_docs/version-2.2.0/setup/index.md index 4e6274d6cb..f376d508bc 100644 --- a/docs/versioned_docs/version-2.2.0/setup/index.md +++ b/docs/versioned_docs/version-2.2.0/setup/index.md @@ -9,4 +9,4 @@ import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` -If you have any questions feel free to join our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) or send us an email at hello@tooljet.com. \ No newline at end of file +If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.2.0/setup/v2-migration.md b/docs/versioned_docs/version-2.2.0/setup/v2-migration.md index f8ded40f23..c44bacd808 100644 --- a/docs/versioned_docs/version-2.2.0/setup/v2-migration.md +++ b/docs/versioned_docs/version-2.2.0/setup/v2-migration.md @@ -29,5 +29,5 @@ Server may take some time to be ready to handle the HTTP request as v2 changes r - Docker compose deployments with [auto SSL](/docs/1.x.x/setup/docker) is deprecated ## Help and Support -- Feel free to join our highly active **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg)** or you can also e-mail us at **hello@tooljet.com**. +- Feel free to join our highly active **[Slack Community](https://tooljet.com/slack)** or you can also e-mail us at **hello@tooljet.com**. - If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. diff --git a/docs/versioned_docs/version-2.2.0/tooljet_database.md b/docs/versioned_docs/version-2.2.0/tooljet_database.md index 92549ffec2..9c03d20ba1 100644 --- a/docs/versioned_docs/version-2.2.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.2.0/tooljet_database.md @@ -298,5 +298,5 @@ This operation deletes a record from the table - **Filter**: Add a condition by choosing a column, an operation, and the value for deleting a particular record. :::info -If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com)** +If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com/slack)** ::: diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/l10n.md b/docs/versioned_docs/version-2.3.0/contributing-guide/l10n.md index 196a10aba2..77bba79537 100644 --- a/docs/versioned_docs/version-2.3.0/contributing-guide/l10n.md +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/l10n.md @@ -65,5 +65,5 @@ ToolJet will automatically detect your browser's default language and will switc --> :::note -Feel free to reach us on [Slack](https://tooljet.com/slack) for any help related to Localization. +Feel free to reach us on [Slack Community](https://tooljet.com/slack) for any help related to Localization. ::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/contributing-guide/setup/docker.md b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/docker.md index 899918f4eb..f2f2c7bdde 100644 --- a/docs/versioned_docs/version-2.3.0/contributing-guide/setup/docker.md +++ b/docs/versioned_docs/version-2.3.0/contributing-guide/setup/docker.md @@ -179,4 +179,4 @@ docker-compose run --rm server npm --prefix server run test ## Troubleshooting -Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our Slack channel (https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) if you encounter any issues when trying to run ToolJet locally. +Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our [Slack Community](https://tooljet.com/slack) if you encounter any issues when trying to run ToolJet locally. diff --git a/docs/versioned_docs/version-2.3.0/data-sources/custom-js.md b/docs/versioned_docs/version-2.3.0/data-sources/custom-js.md index 6655a6efdf..694d2cbbe3 100644 --- a/docs/versioned_docs/version-2.3.0/data-sources/custom-js.md +++ b/docs/versioned_docs/version-2.3.0/data-sources/custom-js.md @@ -52,5 +52,5 @@ ToolJet allows you to internally utilize these libraries: | Axios | [https://axios-http.com/docs/intro](https://axios-http.com/docs/intro) | :::info -Issues with writing custom JavaScript code? Ask in our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg). +Issues with writing custom JavaScript code? Ask in our [Slack Community](https://tooljet.com/slack). ::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/setup/docker.md b/docs/versioned_docs/version-2.3.0/setup/docker.md index c23a52343d..41d775b22f 100644 --- a/docs/versioned_docs/version-2.3.0/setup/docker.md +++ b/docs/versioned_docs/version-2.3.0/setup/docker.md @@ -24,7 +24,7 @@ There are two options to deploy ToolJet using Docker Compose: 1. **Using an external PostgreSQL database**. This setup is recommended if you want to use a managed PostgreSQL service such as AWS RDS or Google Cloud SQL. 2. **Using in-built PostgreSQL database**. This setup uses the official Docker image of PostgreSQL. -Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack. +Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack :::info We recommend using the managed PostgreSQL service on production for ease of administration, security, and management (backups, monitoring, etc). diff --git a/docs/versioned_docs/version-2.3.0/setup/index.md b/docs/versioned_docs/version-2.3.0/setup/index.md index 4e6274d6cb..f376d508bc 100644 --- a/docs/versioned_docs/version-2.3.0/setup/index.md +++ b/docs/versioned_docs/version-2.3.0/setup/index.md @@ -9,4 +9,4 @@ import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` -If you have any questions feel free to join our [Slack community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) or send us an email at hello@tooljet.com. \ No newline at end of file +If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/setup/v2-migration.md b/docs/versioned_docs/version-2.3.0/setup/v2-migration.md index f8ded40f23..c44bacd808 100644 --- a/docs/versioned_docs/version-2.3.0/setup/v2-migration.md +++ b/docs/versioned_docs/version-2.3.0/setup/v2-migration.md @@ -29,5 +29,5 @@ Server may take some time to be ready to handle the HTTP request as v2 changes r - Docker compose deployments with [auto SSL](/docs/1.x.x/setup/docker) is deprecated ## Help and Support -- Feel free to join our highly active **[Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg)** or you can also e-mail us at **hello@tooljet.com**. +- Feel free to join our highly active **[Slack Community](https://tooljet.com/slack)** or you can also e-mail us at **hello@tooljet.com**. - If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. diff --git a/docs/versioned_docs/version-2.3.0/tooljet_database.md b/docs/versioned_docs/version-2.3.0/tooljet_database.md index 92549ffec2..9c03d20ba1 100644 --- a/docs/versioned_docs/version-2.3.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.3.0/tooljet_database.md @@ -298,5 +298,5 @@ This operation deletes a record from the table - **Filter**: Add a condition by choosing a column, an operation, and the value for deleting a particular record. :::info -If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com)** +If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com/slack)** ::: From 6b2e42dc4ab2db7ecc27b57c3717cff0ef5c115c Mon Sep 17 00:00:00 2001 From: Shubhendra Singh Chauhan Date: Wed, 5 Apr 2023 18:10:11 +0530 Subject: [PATCH 09/23] [README] updated Slack Community URL (#5937) * updated tooljet slack community url * update tooljet slack community url on readme * Update CONTRIBUTING.md * Update config.yml * Update 03_documentation_report.yml --- .github/ISSUE_TEMPLATE/03_documentation_report.yml | 2 +- .github/ISSUE_TEMPLATE/config.yml | 4 ++-- CONTRIBUTING.md | 2 +- README.md | 2 +- docs/README.md | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/03_documentation_report.yml b/.github/ISSUE_TEMPLATE/03_documentation_report.yml index 7060699054..ebe21af06a 100644 --- a/.github/ISSUE_TEMPLATE/03_documentation_report.yml +++ b/.github/ISSUE_TEMPLATE/03_documentation_report.yml @@ -14,7 +14,7 @@ body: ⚠ Verify first that your issue is not [already reported on GitHub][issue search]. **Tip:** If you are seeking community support, please consider [joining Slack community][Slack community]. - [Slack community]: https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg + [Slack community]: https://tooljet.com/slack [issue search]: ../search?q=is%3Aissue&type=issues diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 49d7642182..cb41f671b3 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - name: ❓ Get Support from Slack Community - url: https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg - about: Please ask and answer questions here. 🏥 \ No newline at end of file + url: https://tooljet.com/slack + about: Please ask and answer questions here. 🏥 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fed6261750..786388589d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,4 +52,4 @@ We use GitHub issues to track public bugs. Report a bug by [opening a new issue] By contributing, you agree that your contributions will be licensed under its AGPL v3 License. ## Questions? -Contact us on [Slack](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) or mail us at [hello@tooljet.io](mailto:hello@tooljet.io). +Contact us on [Slack](https://tooljet.com/slack) or mail us at [hello@tooljet.io](mailto:hello@tooljet.io). diff --git a/README.md b/README.md index 181abee7fc..3253ef78f0 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ You can use ToolJet cloud for a fully managed solution. If you want to self-host ## Community support For general help using ToolJet, please refer to the official [documentation](https://docs.tooljet.com/docs/). For additional help, you can use one of these channels to ask a question: -- [Slack](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) - Discussions with the community and the team. +- [Slack](https://tooljet.com/slack) - Discussions with the community and the team. - [GitHub](https://github.com/ToolJet/ToolJet/issues) - For bug reports and feature requests. - [Twitter](https://twitter.com/ToolJet) - Get the product updates easily. diff --git a/docs/README.md b/docs/README.md index 78e7c54fa9..546283b446 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,7 +15,7 @@ This repository contains the ToolJet documentation website code and Markdown sou - [Local setup](#local-setup) ## Feedback -If you want to give documentation feedback, please join our [Slack Community](https://join.slack.com/t/tooljet/shared_invite/zt-r2neyfcw-KD1COL6t2kgVTlTtAV5rtg) and drop us a message. +If you want to give documentation feedback, please join our [Slack Community](https://tooljet.com/slack) and drop us a message. ## Documentation Issues To enter documentation bugs or submit any feature request for documentation, please create a new [GitHub issue](https://github.com/ToolJet/ToolJet/issues/new?assignees=&labels=documentation&template=03_documentation_report.yml&title=%5Bdocs%5D%3A+). Please check if there is an existing issue first. From 32740743e1e2420f0e5bbd32fe54610cc242d59d Mon Sep 17 00:00:00 2001 From: Muhsin Shah C P Date: Thu, 6 Apr 2023 16:42:58 +0530 Subject: [PATCH 10/23] [Improvement] URLs scoped with workspace id (#5487) * add: new URL prefix * fix: working on home page * add: profile path * playing with rxjs * removed context part * working on path changes * changing routes - TODO: replace the workspaceId with actual id * redo: public apps path * initial commit * added authorize API * remove privileges from auth response * fixed some api issue - added subscriptions * fix: redirect url workspace-id null issue * fix: switch workspace * fix: organization list mapping - menu item paths * fix: preview url - editor, viewer permission mapping * jwt fix * fix: some url issue - permission mappings - workspace login * fixed some issues - user invite workspace-id - org settings menu item default selected item issue * app viewer fixes * fixing workspace login issues * fix * fixing issues - tooljet db - path issues - refatoring the code * fix: workspace vars permissions * fix: multi-page handle * fix: create app from template * fix: bulk user upload * fix: import app - clone app - upload profile image * fix: onboarding * fix: log out * fixed multi-workspace logout issue * fix: launch btn * fix: oauth2 * fixes * fix: sso login * fix: workspace sso login * fixing sso issues * fix: moved list of orgs to rxjs - fixed switching issues * reverting some changes * fixed some minor bugs * fixing sso redirect url issues * fix: switching network timing issues * fix: back to workspace-id * fix: tj-database - refactored the code - removed org id from some pages - will get the org id from the service file only * fix: multi-pages * fix: infinite loop issue * fixing workspace switching issue * fixes - comment link - logout & private route redirect url * fix: wrong uuid error * fixing subpath - fixed most of the places - need to test & fix workspace login, sso, new account * fix: subpath workspace login * fix: rxjs handle bug * Revert "fix: tj-database" This reverts commit 9632ec2ff0707c9d7b1777f64afbe15679203ca1. * fix: reverted tj-db changes * fix: subpath sso * typo fix * fix: existing session issues * new: switch workspace page * fix: modal dark-mode * added default sso support * fixes - subpath workspace switching - handle wrong routes * fix: manager user button - refactored the code * removed SINGLE Workspace feature * rebase * add: change modal text * fix: added validation * fixed private app 401 issue * initial commit * fix: logged out session multi-tab issue * refactoring the code * fix: redirect url issue * added auth-token in cookies * Fix: failing e2e specs * added session API * fix: backend session guard * fix: removing user details from local storage * fix: null wid * undo and redo * fix: login page * fix: viewer login redirection * fix: login page redirection * fix: public apps logout issue * added session storage and scheduler * added profile api * fix: sso login - switch workspace - login page - setup admin * working on fixes * fix: socket issue * fix: setup admin api * connected profile & logout apis * fix: malfunctioned auth token case * fix: realtime avatar * fix: profile avatar * fix: Realtime cursors avatar * setting max age for auth token cookie * add: Go to login page if logout api returns 401 * fix: subpath login * fix * fix: app logout [viewer] * fix: authorize page * remove expiry from jwt * fix: integrations route - session api * small fix * fix: updated profile * fix: workspace login [logged user] * fix: oauth and another workspace page issue * fixed app preview logout issue * subpath fix * fix: subpath app id * fix: selected state didnt change for apps page [subpath] * fix * add cookie parser to test app * specs added * increased user session expiry time * test: session & new apis * working on test cases * fix: onboarding issue * fixing specs * fix: test cases * fix: removing profile api calls * some fixes * fixing rebase issues * fix: global ds issues * fix: app is crashing * fix: back to text * fix: oauth test cases * fix: test-helper * fix: onboarding test cases * fix: tests again * refactoring the code * latest develop merging precautions - fixed a minor null issue * fix: typo * fix :menu issues due to the merging * fix: - clicking on tooljet logo didnt redirect to login page for public apps - private app preview doesnt load after login * subpath fixes * fixed back to issue * PR changes * fix: spec fixes for EE * doc: URL scoped for workspace --------- Co-authored-by: gsmithun4 Co-authored-by: Shubhendra --- .do/deploy.template.yaml | 3 - .env.example | 5 +- app.json | 4 - docs/docs/Enterprise/superadmin.md | 6 +- docs/docs/setup/env-vars.md | 10 +- ...nt-variables.md => workspace-variables.md} | 2 +- ...ultiworkspace.md => workspace_overview.md} | 21 +- docs/docs/user-authentication/sso/github.md | 8 +- docs/docs/user-authentication/sso/google.md | 8 +- .../user-authentication/user-lifecycle.md | 87 +- docs/sidebars.js | 4 +- frontend/src/App/App.jsx | 226 ++++- frontend/src/AppLoader/AppLoader.jsx | 9 +- .../OrganizationInvitationPage.jsx | 381 +++------ frontend/src/Editor/Comment/CommentBody.jsx | 5 +- frontend/src/Editor/Comment/index.jsx | 12 +- .../DataSourceManager/DataSourceManager.jsx | 1 - frontend/src/Editor/Editor.jsx | 64 +- frontend/src/Editor/Header/index.js | 21 +- .../Editor/LeftSidebar/SidebarDatasources.jsx | 2 +- frontend/src/Editor/ManageAppUsers.jsx | 7 +- .../TooljetDatabase/ToolJetDbOperations.jsx | 5 +- frontend/src/Editor/RealtimeCursors.jsx | 14 +- frontend/src/Editor/RealtimeEditor.jsx | 13 +- frontend/src/Editor/Viewer.jsx | 73 +- frontend/src/GlobalDatasources/index.jsx | 6 +- frontend/src/HomePage/AppCard.jsx | 7 +- frontend/src/HomePage/BlankPage.jsx | 3 +- frontend/src/HomePage/HomePage.jsx | 29 +- .../HomePage/SwitchWorkspacePage/index.jsx | 102 +++ .../TemplateLibraryModal.jsx | 10 +- frontend/src/LoginPage/LoginPage.jsx | 83 +- .../ManageGroupPermissions.jsx | 1 - .../src/ManageOrgUsers/ManageOrgUsers.jsx | 8 +- frontend/src/ManageOrgVars/ManageOrgVars.jsx | 17 +- frontend/src/ManageSSO/GeneralSettings.jsx | 53 +- frontend/src/Oauth/Authorize.jsx | 23 +- frontend/src/Oauth2/Authorize.jsx | 4 +- .../src/OnBoardingForm/OnBoardingForm.jsx | 11 +- .../src/OnBoardingForm/OnbboardingFromSH.jsx | 9 +- .../src/OrganizationSettingsPage/index.jsx | 14 +- frontend/src/SettingsPage/SettingsPage.jsx | 26 +- frontend/src/SignupPage/SignupPage.jsx | 7 +- .../SuccessInfoScreen/SignupInfoScreen.jsx | 21 +- .../VerificationSuccessInfoScreen.jsx | 64 +- frontend/src/TooljetDatabase/index.jsx | 6 +- .../NotificationCenter/Notification.jsx | 10 +- frontend/src/_components/Organization.jsx | 412 ---------- .../CreateOrganization.jsx | 8 +- .../OrganizationManager/CustomSelect.jsx | 55 +- .../OrganizationManager/EditOrganization.jsx | 1 - .../_components/OrganizationManager/List.jsx | 53 +- frontend/src/_components/PrivateRoute.jsx | 137 +++- frontend/src/_components/Profile.jsx | 44 +- frontend/src/_helpers/appUtils.js | 21 +- frontend/src/_helpers/auth-header.js | 27 +- frontend/src/_helpers/http-client.js | 15 +- frontend/src/_helpers/routes.js | 32 + frontend/src/_helpers/utils.js | 90 ++ frontend/src/_helpers/websocketConnection.js | 3 +- frontend/src/_services/app.service.js | 53 +- frontend/src/_services/appVersion.service.js | 7 +- .../src/_services/authentication.service.js | 119 ++- frontend/src/_services/dataquery.service.js | 12 +- frontend/src/_services/datasource.service.js | 26 +- frontend/src/_services/folder.service.js | 7 +- .../src/_services/globalDatasource.service.js | 10 +- .../src/_services/groupPermission.service.js | 10 + frontend/src/_services/library-app.service.js | 4 +- .../org_environment_variable.service.js | 8 +- .../src/_services/organization.service.js | 31 +- .../_services/organization_user.service.js | 12 +- frontend/src/_services/tooljet.service.js | 3 + frontend/src/_services/user.service.js | 19 +- frontend/src/_styles/theme.scss | 173 +++- frontend/src/_ui/Breadcrumbs/index.jsx | 2 +- frontend/src/_ui/Layout/index.jsx | 46 +- server/ee/controllers/oauth.controller.ts | 27 +- server/ee/services/oauth/oauth.service.ts | 49 +- .../1678261179234-addUserSession.ts | 57 ++ server/package-lock.json | 231 +++++- server/package.json | 8 +- server/src/app.module.ts | 4 + server/src/controllers/app.controller.ts | 86 +- server/src/controllers/apps.controller.ts | 1 - .../controllers/organizations.controller.ts | 28 +- server/src/decorators/app.decorator.ts | 2 +- server/src/entities/user.entity.ts | 2 + server/src/entities/user_sessions.entity.ts | 24 + .../src/interceptors/valid.app.interceptor.ts | 4 +- server/src/main.ts | 7 +- .../middlewares/request-context.middleware.ts | 10 + server/src/models/request-context.model.ts | 12 + server/src/modules/auth/app-auth.guard.ts | 17 +- server/src/modules/auth/auth.module.ts | 9 +- .../modules/auth/authorize-workspace-guard.ts | 34 + server/src/modules/auth/jwt.strategy.ts | 84 +- .../modules/auth/multi-organization.guard.ts | 11 - .../modules/auth/organization-auth.guard.ts | 20 + server/src/modules/auth/session-auth-guard.ts | 20 + .../is-public.guard.ts | 2 +- .../organizations/organizations.module.ts | 5 +- .../request_context/request-context.module.ts | 12 + server/src/schedulers/session.scheduler.ts | 20 + server/src/services/app_config.service.ts | 1 - server/src/services/auth.service.ts | 215 ++--- .../services/organization_users.service.ts | 5 - server/src/services/organizations.service.ts | 34 +- server/src/services/session.service.ts | 83 ++ server/src/services/users.service.ts | 5 + server/test/controllers/app.e2e-spec.ts | 393 +-------- server/test/controllers/app_users.e2e-spec.ts | 29 +- server/test/controllers/apps.e2e-spec.ts | 524 ++++++++++-- server/test/controllers/comment.e2e-spec.ts | 14 +- .../test/controllers/data_queries.e2e-spec.ts | 98 ++- .../test/controllers/data_sources.e2e-spec.ts | 86 +- server/test/controllers/files.e2e-spec.ts | 11 +- .../test/controllers/folder_apps.e2e-spec.ts | 25 +- server/test/controllers/folders.e2e-spec.ts | 66 +- .../controllers/group_permissions.e2e-spec.ts | 220 +++-- .../test/controllers/library_apps.e2e-spec.ts | 26 +- .../oauth/oauth-git-instance.e2e-spec.ts | 234 +----- .../controllers/oauth/oauth-git.e2e-spec.ts | 771 +----------------- .../oauth/oauth-google-instance.e2e-spec.ts | 183 +---- .../oauth/oauth-google.e2e-spec.ts | 374 +-------- .../onboarding/form-auth.e2e-spec.ts | 38 +- .../onboarding/git-sso-auth.e2e-spec.ts | 25 +- .../onboarding/google-sso-auth.e2e-spec.ts | 25 +- .../org_environment_variables.e2e-spec.ts | 71 +- .../organization_users.e2e-spec.ts | 77 +- .../controllers/organizations.e2e-spec.ts | 195 ++--- server/test/controllers/session.e2e-spec.ts | 106 +++ server/test/controllers/thread.e2e-spec.ts | 8 +- .../test/controllers/tooljet_db.e2e-spec.ts | 9 + server/test/controllers/users.e2e-spec.ts | 26 +- server/test/services/session.service.spec.ts | 61 ++ server/test/test.helper.ts | 58 +- 137 files changed, 4041 insertions(+), 3786 deletions(-) rename docs/docs/tutorial/{workspace-environment-variables.md => workspace-variables.md} (98%) rename docs/docs/tutorial/{multiworkspace.md => workspace_overview.md} (76%) create mode 100644 frontend/src/HomePage/SwitchWorkspacePage/index.jsx delete mode 100644 frontend/src/_components/Organization.jsx create mode 100644 frontend/src/_helpers/routes.js create mode 100644 server/migrations/1678261179234-addUserSession.ts create mode 100644 server/src/entities/user_sessions.entity.ts create mode 100644 server/src/middlewares/request-context.middleware.ts create mode 100644 server/src/models/request-context.model.ts create mode 100644 server/src/modules/auth/authorize-workspace-guard.ts delete mode 100644 server/src/modules/auth/multi-organization.guard.ts create mode 100644 server/src/modules/auth/organization-auth.guard.ts create mode 100644 server/src/modules/auth/session-auth-guard.ts create mode 100644 server/src/modules/request_context/request-context.module.ts create mode 100644 server/src/schedulers/session.scheduler.ts create mode 100644 server/src/services/session.service.ts create mode 100644 server/test/controllers/session.e2e-spec.ts create mode 100644 server/test/services/session.service.spec.ts diff --git a/.do/deploy.template.yaml b/.do/deploy.template.yaml index 0bc7001832..d70ec6f20a 100644 --- a/.do/deploy.template.yaml +++ b/.do/deploy.template.yaml @@ -26,9 +26,6 @@ spec: - key: DISABLE_SIGNUPS value: "false" scope: RUN_TIME - - key: DISABLE_MULTI_WORKSPACE - value: "false" - scope: RUN_TIME - key: DEPLOYMENT_PLATFORM value: "digitalocean" - key: DATABASE_URL diff --git a/.env.example b/.env.example index d96c522b39..087f4d2596 100644 --- a/.env.example +++ b/.env.example @@ -52,8 +52,6 @@ SMTP_PORT= # DISABLE USER SIGNUPS (true or false). only applicable if Multi-Workspace feature is enabled DISABLE_SIGNUPS= -# Disable Multi-Workspace features (true or false) -DISABLE_MULTI_WORKSPACE= # OBSERVABILITY APM_VENDOR= @@ -76,3 +74,6 @@ SSO_DISABLE_SIGNUPS= #ONBOARDING ENABLE_ONBOARDING_QUESTIONS_FOR_ALL_SIGN_UPS= + +#session expiry in minutes +USER_SESSION_EXPIRY=2880 diff --git a/app.json b/app.json index 0939df9004..754f2c799c 100644 --- a/app.json +++ b/app.json @@ -37,10 +37,6 @@ "description": "Disable sign up in login page only applicable if Multi-Workspace feature is turned on", "value": "false" }, - "DISABLE_MULTI_WORKSPACE": { - "description": "Disables Multi-Workspace feature", - "value": "false" - }, "ENABLE_TOOLJET_DB": { "description": "To enable Tooljet Database feature", "value": "false" diff --git a/docs/docs/Enterprise/superadmin.md b/docs/docs/Enterprise/superadmin.md index 10ebe5551b..63262b98e9 100644 --- a/docs/docs/Enterprise/superadmin.md +++ b/docs/docs/Enterprise/superadmin.md @@ -23,7 +23,7 @@ The user details entered while setting up ToolJet will have Super Admin privileg | [Manage any workspace's setting (Groups/SSO/Workspace Variables)](#manage-workspace-setting-groupsssoworkspace-variables) | ❌ | ✅ | | [Manage all users from all the workspaces in the instance](#checking-all-the-users-in-the-instance) | ❌ | ✅ | | [Make any user Super Admin](#make-the-user-super-admin) | ❌ | ✅ | -| [Restrict personal workspace of invited users](#allow-users-to-create-personal-workspace) | ❌ | ✅ | +| [Restrict creation of personal workspace of users](#restrict-creation-of-personal-workspace-of-users) | ❌ | ✅ |
@@ -117,11 +117,11 @@ The user will become Super Admin and the Type column will update from **`workspa
-### Allow users to create personal workspace +### Restrict creation of personal workspace of users When a user joins a workspace, they are provided with their own personal workspace and option to create new workspaces. -Super Admins can control this behavior from the Manage Instance Settings page, they can **toggle off** the option to **Allow personal workspace**. Now whenever a user joins a workspace they won't be provided a personal workspace nor they will be able to create a new workspace in the instance. +Super Admins can **control** this behavior from the Manage Instance Settings page, they can **toggle off** the option to **Allow personal workspace**. Now whenever a user joins a workspace they won't be provided a personal workspace nor they will be able to create a new workspace in the instance.
diff --git a/docs/docs/setup/env-vars.md b/docs/docs/setup/env-vars.md index 3569378507..ee546a8cbb 100644 --- a/docs/docs/setup/env-vars.md +++ b/docs/docs/setup/env-vars.md @@ -116,17 +116,13 @@ You can specify a different server for backend if it is hosted on another server | ----------- | ------------------------------------------------------------------------------------------------- | | SERVER_HOST | Configure a hostname for the server as a proxy pass. If no value is set, it defaults to `server`. | -#### Disable Multi-Workspace ( optional ) - -If you want to disable Multi-Workspace feature, set the environment variable `DISABLE_MULTI_WORKSPACE` to `true`. - ### Hide account setup link -If you want to hide account setup link from admin in manage user page, set the environment variable `HIDE_ACCOUNT_SETUP_LINK` to `true`, please make sure you have configured SMTP to receive welcome mail for users. Valid only if `DISABLE_MULTI_WORKSPACE` is not `true`. +If you want to hide account setup link from admin in manage user page, set the environment variable `HIDE_ACCOUNT_SETUP_LINK` to `true`, please make sure you have configured SMTP to receive welcome mail for users. #### Disabling signups ( optional ) -Sign up is enabled only if Multi-Workspace is enabled. If you want to restrict the signups and allow new users only by invitations, set the environment variable `DISABLE_SIGNUPS` to `true`. +If you want to restrict the signups and allow new users only by invitations, set the environment variable `DISABLE_SIGNUPS` to `true`. :::tip You will still be able to see the signup page but won't be able to successfully submit the form. @@ -237,7 +233,7 @@ The maximum retry limit of login password for a user is by default set to 5, acc #### SSO Configurations (Optional) -Configurations for instance level SSO. Valid only if `DISABLE_MULTI_WORKSPACE` is not `true`. +Configurations for instance level SSO. | variable | description | | ---------------------------- | -------------------------------------------------------------- | diff --git a/docs/docs/tutorial/workspace-environment-variables.md b/docs/docs/tutorial/workspace-variables.md similarity index 98% rename from docs/docs/tutorial/workspace-environment-variables.md rename to docs/docs/tutorial/workspace-variables.md index b7675e4f01..675103c526 100644 --- a/docs/docs/tutorial/workspace-environment-variables.md +++ b/docs/docs/tutorial/workspace-variables.md @@ -1,5 +1,5 @@ --- -id: workspace-environment-variables +id: workspace-variables title: Workspace Variables --- diff --git a/docs/docs/tutorial/multiworkspace.md b/docs/docs/tutorial/workspace_overview.md similarity index 76% rename from docs/docs/tutorial/multiworkspace.md rename to docs/docs/tutorial/workspace_overview.md index 84719881ea..d731054ea1 100644 --- a/docs/docs/tutorial/multiworkspace.md +++ b/docs/docs/tutorial/workspace_overview.md @@ -1,9 +1,9 @@ --- -id: multiworkspace -title: Multi-Workspace +id: workspace_overview +title: 'Workspace: Overview' --- -# Multi-Workspace +# Workspace: Overview User can create their own workspaces, user who created workspace will be having admin privileges for the workspace. @@ -29,21 +29,14 @@ Please check the detailed doc on **[Permissions](/docs/org-management/permission - The administrator can manage [users and groups](/docs/tutorial/manage-users-groups) of each workspace - Applications and settings can not be shared between workspaces -- A user authorised to login to Tooljet will not have access to all workspaces, Usesr should be invited or signed up to a workspace to log-in to it. - -## Enabling Multi-Workspace - -Set environment variable **DISABLE_MULTI_WORKSPACE** value to **false** to enable the feature, and **true** to disable it. - -### When enabled - +- A user authorised to login to ToolJet will not have access to all workspaces, Users should be invited or signed up to a workspace to log-in to it. - When Multi-Workspace feature is enabled, user should login with username and password to log in to Tooljet. - Administrator can configure authentication methods for their workspaces. - If password login is enabled, switching to the workspace will happen without any other authorization since the user is already authorized with password login. - User logged in to Toojet and trying to switch to a workspace where SSO is enabled and password login is disabled, will be redirected to workspace login page and enabled SSO options will be shown - User can directly login to a workspace using workspace login URL, Administrator can view the URL **Manage SSO -> General Settings -> Login URL**. -### When disabled - -- If Multi-Workspace is disabled, Create workspace feature won’t be available. +### When disabled (Super Admin) +- Only **[Super Admins](/docs/Enterprise/superadmin#allow-users-to-create-personal-workspace)** can disable the option for creating personal workspaces for a user. +- If creating personal workspaces is disabled, Create workspace feature won’t be available. - No separate login page for workspace and SSO configured for the workspace will be reflected to the main login page/login. \ No newline at end of file diff --git a/docs/docs/user-authentication/sso/github.md b/docs/docs/user-authentication/sso/github.md index 6b48c66975..2333addaed 100644 --- a/docs/docs/user-authentication/sso/github.md +++ b/docs/docs/user-authentication/sso/github.md @@ -49,14 +49,14 @@ title: GitHub Lastly, enter **Client Id** and **Client Secret** in GitHub manage SSO page and save. -The GitHub sign-in button will now be available in your ToolJet login screen if you have not enabled Multi-Workspace. +The GitHub sign-in button will now be available in your ToolJet login screen. :::info Should configure `Host Name` if you are using GitHub Enterprise self hosted. Host name should be a URL and should not ends with `/`, example: `https://github.tooljet.com` ::: -## Multi-Workspace -If you have enabled Multi-Workspace you can configure GitHub SSO as mentioned above, for setting default SSO for the instance use environment variable. +## Setting default SSO +To set GitHub as default SSO for the instance use environment variable. | variable | description | | ------------------------------------- | ----------------------------------------------------------- | @@ -64,4 +64,4 @@ If you have enabled Multi-Workspace you can configure GitHub SSO as mentioned ab | SSO_GIT_OAUTH2_CLIENT_SECRET | GitHub OAuth client secret | | SSO_GIT_OAUTH2_HOST | GitHub OAuth host name if GitHub is self hosted | -Redirect URL should be `/sso/git` \ No newline at end of file +**Redirect URL should be `/sso/git`** \ No newline at end of file diff --git a/docs/docs/user-authentication/sso/google.md b/docs/docs/user-authentication/sso/google.md index 384c93bc62..ed5f8f7b41 100644 --- a/docs/docs/user-authentication/sso/google.md +++ b/docs/docs/user-authentication/sso/google.md @@ -73,13 +73,13 @@ user who is signing in Lastly, set the `client id` in google manage SSO page. This value will be available from your [Google cloud console credentials page](https://console.cloud.google.com/apis/credentials) -The Google sign-in button will now be available in your ToolJet login screen, if you are not enabled Multi-Workspace. +The Google sign-in button will now be available in your ToolJet login screen. -## Multi-Workspace -If you have enabled Multi-Workspace you can configure Google SSO as mentioned above, for setting default SSO for the instance use environment variable. +## Setting default SSO +To set Google as default SSO for the instance use environment variable. | variable | description | | ------------------------------------- | ----------------------------------------------------------- | | SSO_GOOGLE_OAUTH2_CLIENT_ID | Google OAuth client id | -Redirect URL should be `/sso/google` +**Redirect URL should be `/sso/google`** diff --git a/docs/docs/user-authentication/user-lifecycle.md b/docs/docs/user-authentication/user-lifecycle.md index ab9deaa571..48f536b873 100644 --- a/docs/docs/user-authentication/user-lifecycle.md +++ b/docs/docs/user-authentication/user-lifecycle.md @@ -5,75 +5,8 @@ title: User Lifecycle # User Lifecycle -## Single-Workspace - -### User onboarding -- If no user is present in the system, there will be `Sign-up` option in the login page. User can sign up by entering their email address. Tooljet will be sending a welcome email with activation URL to the email address. User can follow the activation URL and onboard to ToolJet. - -
- - ![ToolJet - Single-Workspace sign up](/img/user-lifecycle/single-ws-signup.png) - -
- -- User with admin privileges can invite members - -
- - ![ToolJet - Single-Workspace invite user](/img/user-lifecycle/user-invite-sw.png) - -
- -- Invited user will receive welcome email with activation URL, unregistered user can follow the link and setup Tooljet account - -
- - ![ToolJet - Single-Workspace accept invite](/img/user-lifecycle/accept-invite-sw.png) - -
- -- Invited user can onboard through SSO login, without using an invitation link - -
- - ![ToolJet - Single-Workspace accept invite](/img/user-lifecycle/sso-onboard-sw.png) - -
- -- If `enable signup` option in enabled in SSO general settings, user can setup account through SSO login without an invite - -
- - ![ToolJet - Single-Workspace sign up using SSO](/img/user-lifecycle/sso-enable-signup-sw.png) - -
- -### Archive user - - User can be archived by workspace admin from using `Manage User` page - -
- - ![ToolJet - Single-Workspace Archive user](/img/user-lifecycle/archive-user.png) - -
- -### Unarchive user - - User can be unArchived by workspace admin from using `Manage User` page - -
- - ![ToolJet - Single-Workspace Unarchive user](/img/user-lifecycle/unarchive-sw.png) - -
- - :::info - Archive or unarchive will affect user login, user won't be able to login using email id and password unless user is in active state - ::: - -## Multi-Workspace - :::info -Check Multi-workspace docs [here](/docs/tutorial/multiworkspace). +Check Workspace docs [here](/docs/tutorial/workspace_overview). ::: ### User onboarding @@ -82,7 +15,7 @@ Check Multi-workspace docs [here](/docs/tutorial/multiworkspace).
- ![ToolJet - Multi-Workspace sign up](/img/user-lifecycle/signup-mw.png) + ![ToolJet - Workspace sign up](/img/user-lifecycle/signup-mw.png)
@@ -90,7 +23,7 @@ Check Multi-workspace docs [here](/docs/tutorial/multiworkspace).
- ![ToolJet - Multi-Workspace sign up](/img/user-lifecycle/user-mw.png) + ![ToolJet - Workspace sign up](/img/user-lifecycle/user-mw.png)
@@ -98,7 +31,7 @@ Check Multi-workspace docs [here](/docs/tutorial/multiworkspace).
- ![ToolJet - Multi-Workspace sign up](/img/user-lifecycle/invite-link-mw.png) + ![ToolJet - Workspace sign up](/img/user-lifecycle/invite-link-mw.png)
@@ -106,7 +39,7 @@ Check Multi-workspace docs [here](/docs/tutorial/multiworkspace).
- ![ToolJet - Single-Workspace accept invite](/img/user-lifecycle/sso-onboard-sw.png) + ![ToolJet - Workspace accept invite](/img/user-lifecycle/sso-onboard-sw.png)
@@ -114,7 +47,7 @@ Check Multi-workspace docs [here](/docs/tutorial/multiworkspace).
- ![ToolJet - Single-Workspace sign up using SSO](/img/user-lifecycle/sso-enable-signup-sw.png) + ![ToolJet - Workspace sign up using SSO](/img/user-lifecycle/sso-enable-signup-sw.png)
@@ -123,7 +56,7 @@ Check Multi-workspace docs [here](/docs/tutorial/multiworkspace).
- ![ToolJet - Single-Workspace Archive user](/img/user-lifecycle/archive-user.png) + ![ToolJet -Workspace Archive user](/img/user-lifecycle/archive-user.png)
@@ -144,7 +77,7 @@ Check Multi-workspace docs [here](/docs/tutorial/multiworkspace).
- ![ToolJet - Single-Workspace sign up using SSO](/img/user-lifecycle/switch.png) + ![ToolJet - Workspace sign up using SSO](/img/user-lifecycle/switch.png)
@@ -157,11 +90,11 @@ Check Multi-workspace docs [here](/docs/tutorial/multiworkspace). | invited | No (Yes with SSO)| Login through SSO or invitation link | | archived | No | Not able to activate. Invite from `Manage Users` page, status will be changed to invited | -## Multi-Workspace SSO flow +## Workspace SSO flow - Diagram shows how SSO configurations are chosen in common login page and workspace login page. Instance level SSO is configured in environment variables and Workspace level SSO is configured in respective `Manage SSO` page.
- ![ToolJet - SSO Flow](/img/user-lifecycle/sso-flow.png) + ![ToolJet - SSO Flow](/img/user-lifecycle/sso-flow.png)
diff --git a/docs/sidebars.js b/docs/sidebars.js index 8f9a6c800f..7f2ae33f30 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -261,8 +261,8 @@ const sidebars = { 'type': 'category', 'label': 'Workspaces', 'items': [ - 'tutorial/multiworkspace', - 'tutorial/workspace-environment-variables', + 'tutorial/workspace_overview', + 'tutorial/workspace-variables', ], }, 'org-management/permissions', diff --git a/frontend/src/App/App.jsx b/frontend/src/App/App.jsx index 85f1db418d..aa2ab3f571 100644 --- a/frontend/src/App/App.jsx +++ b/frontend/src/App/App.jsx @@ -1,9 +1,16 @@ import React, { Suspense } from 'react'; // eslint-disable-next-line no-unused-vars import config from 'config'; -import { Route, Routes, BrowserRouter } from 'react-router-dom'; +import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'; +import { + getWorkspaceIdFromURL, + appendWorkspaceId, + stripTrailingSlash, + getSubpath, + pathnameWithoutSubpath, +} from '@/_helpers/utils'; +import { authenticationService, tooljetService, organizationService } from '@/_services'; import { withRouter } from '@/_hoc/withRouter'; -import { authenticationService, tooljetService } from '@/_services'; import { PrivateRoute, AdminRoute } from '@/_components'; import { HomePage } from '@/HomePage'; import { LoginPage } from '@/LoginPage'; @@ -18,6 +25,7 @@ import { SettingsPage } from '../SettingsPage/SettingsPage'; import { ForgotPassword } from '@/ForgotPassword'; import { ResetPassword } from '@/ResetPassword'; import { MarketplacePage } from '@/MarketplacePage'; +import SwitchWorkspacePage from '@/HomePage/SwitchWorkspacePage'; import { GlobalDatasources } from '@/GlobalDatasources'; import { lt } from 'semver'; import Toast from '@/_ui/Toast'; @@ -49,23 +57,150 @@ class AppComponent extends React.Component { } fetchMetadata = () => { - if (this.state.currentUser) { - tooljetService.fetchMetaData().then((data) => { - localStorage.setItem('currentVersion', data.installed_version); - if (data.latest_version && lt(data.installed_version, data.latest_version) && data.version_ignored === false) { - this.setState({ updateAvailable: true }); - } - }); - } + tooljetService.fetchMetaData().then((data) => { + localStorage.setItem('currentVersion', data.installed_version); + if (data.latest_version && lt(data.installed_version, data.latest_version) && data.version_ignored === false) { + this.setState({ updateAvailable: true }); + } + }); + }; + + isThisExistedRoute = () => { + const existedPaths = [ + 'forgot-password', + 'reset-password', + 'invitations', + 'organization-invitations', + 'setup', + 'confirm', + 'confirm-invite', + ]; + return existedPaths.find((path) => window.location.pathname.includes(path)); }; componentDidMount() { - authenticationService.currentUser.subscribe((x) => { - this.setState({ currentUser: x }, this.fetchMetadata); - setInterval(this.fetchMetadata, 1000 * 60 * 60 * 1); - }); + if (!this.isThisExistedRoute()) { + const workspaceId = getWorkspaceIdFromURL(); + if (workspaceId) { + this.authorizeUserAndHandleErrors(workspaceId); + } else { + const isApplicationsPath = window.location.pathname.includes('/applications/'); + const appId = isApplicationsPath ? pathnameWithoutSubpath(window.location.pathname).split('/')[2] : null; + authenticationService + .validateSession(appId) + .then(({ current_organization_id }) => { + //check if the page is not switch-workspace, if then redirect to the page + if (window.location.pathname !== `${getSubpath() ?? ''}/switch-workspace`) { + this.authorizeUserAndHandleErrors(current_organization_id); + } else { + this.updateCurrentSession({ + current_organization_id, + }); + } + }) + .catch(() => { + if (!this.isThisWorkspaceLoginPage(true) && !isApplicationsPath) { + this.updateCurrentSession({ + authentication_status: false, + }); + } else if (isApplicationsPath) { + this.updateCurrentSession({ + authentication_failed: true, + }); + } + }); + } + } + + this.fetchMetadata(); + setInterval(this.fetchMetadata, 1000 * 60 * 60 * 1); } + isThisWorkspaceLoginPage = (justLoginPage = false) => { + const subpath = window?.public_config?.SUB_PATH ? stripTrailingSlash(window?.public_config?.SUB_PATH) : null; + const pathname = location.pathname.replace(subpath, ''); + const pathnames = pathname.split('/').filter((path) => path !== ''); + return (justLoginPage && pathnames.includes('login')) || (pathnames.length === 2 && pathnames.includes('login')); + }; + + authorizeUserAndHandleErrors = (workspaceId) => { + const subpath = getSubpath(); + this.updateCurrentSession({ + current_organization_id: workspaceId, + }); + authenticationService + .authorize() + .then((data) => { + organizationService.getOrganizations().then((response) => { + const current_organization_name = response.organizations.find((org) => org.id === workspaceId)?.name; + // this will add the other details like permission and user previlliage details to the subject + this.updateCurrentSession({ + ...data, + current_organization_name, + organizations: response.organizations, + }); + + // if user is trying to load the workspace login page, then redirect to the dashboard + if (this.isThisWorkspaceLoginPage()) + return (window.location = appendWorkspaceId(workspaceId, '/:workspaceId')); + }); + }) + .catch((error) => { + // if the auth token didn't contain workspace-id, try switch workspace fn + if (error && error?.data?.statusCode === 401) { + //get current session workspace id + authenticationService + .validateSession() + .then(({ current_organization_id }) => { + // change invalid or not authorized org id to previous one + this.updateCurrentSession({ + current_organization_id, + }); + + organizationService + .switchOrganization(workspaceId) + .then((data) => { + this.updateCurrentSession(data); + if (this.isThisWorkspaceLoginPage()) + return (window.location = appendWorkspaceId(workspaceId, '/:workspaceId')); + this.authorizeUserAndHandleErrors(workspaceId); + }) + .catch(() => { + organizationService.getOrganizations().then((response) => { + const current_organization_name = response.organizations.find( + (org) => org.id === current_organization_id + )?.name; + + this.updateCurrentSession({ + current_organization_name, + }); + + if (!this.isThisWorkspaceLoginPage()) + return (window.location = `${subpath ?? ''}/login/${workspaceId}`); + }); + }); + }) + .catch(() => this.logout()); + } else if ((error && error?.data?.statusCode == 422) || error?.data?.statusCode == 404) { + window.location = subpath ? `${subpath}${'/switch-workspace'}` : '/switch-workspace'; + } else { + if (!this.isThisWorkspaceLoginPage() && !this.isThisWorkspaceLoginPage(true)) + this.updateCurrentSession({ + authentication_status: false, + }); + } + }); + }; + + updateCurrentSession = (newSession) => { + const currentSession = authenticationService.currentSessionValue; + authenticationService.updateCurrentSession({ ...currentSession, ...newSession }); + }; + + logout = () => { + authenticationService.logout(); + }; + switchDarkMode = (newMode) => { this.setState({ darkMode: newMode }); localStorage.setItem('darkMode', newMode); @@ -120,15 +255,6 @@ class AppComponent extends React.Component {
)} - - - - } - /> } /> } /> } /> @@ -154,7 +280,7 @@ class AppComponent extends React.Component { /> @@ -190,7 +316,7 @@ class AppComponent extends React.Component { /> @@ -199,17 +325,26 @@ class AppComponent extends React.Component { /> } /> + + + + } + /> {window.public_config?.ENABLE_TOOLJET_DB == 'true' && ( @@ -217,15 +352,6 @@ class AppComponent extends React.Component { } /> )} - - - - } - /> {window.public_config?.ENABLE_MARKETPLACE_FEATURE === 'true' && ( )} + } /> + + + + } + /> + + + + } + /> + { + if (authenticationService?.currentSessionValue?.current_organization_id) { + return ; + } + return ; + }} + />
diff --git a/frontend/src/AppLoader/AppLoader.jsx b/frontend/src/AppLoader/AppLoader.jsx index 445cb2e9da..e1a534ddbc 100644 --- a/frontend/src/AppLoader/AppLoader.jsx +++ b/frontend/src/AppLoader/AppLoader.jsx @@ -13,7 +13,6 @@ const AppLoaderComponent = (props) => { const router = useRouter(); const params = useParams(); const appId = params.id; - const currentUser = authenticationService.currentUserValue; // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(() => loadAppDetails(), []); @@ -28,8 +27,7 @@ const AppLoaderComponent = (props) => { const path = `/apps/${appId}`; const sub_path = window?.public_config?.SUB_PATH ? stripTrailingSlash(window?.public_config?.SUB_PATH) : ''; organizationService.switchOrganization(orgId).then( - (data) => { - authenticationService.updateCurrentUserDetails(data); + () => { window.location.href = `${sub_path}${path}`; }, () => { @@ -44,7 +42,10 @@ const AppLoaderComponent = (props) => { const statusCode = error.data?.statusCode; if (statusCode === 403) { const errorObj = safelyParseJSON(error.data?.message); - if (errorObj?.organizationId && currentUser.organization_id !== errorObj?.organizationId) { + if ( + errorObj?.organizationId && + authenticationService.currentSessionValue.current_organization_id !== errorObj?.organizationId + ) { switchOrganization(errorObj?.organizationId); return; } diff --git a/frontend/src/ConfirmationPage/OrganizationInvitationPage.jsx b/frontend/src/ConfirmationPage/OrganizationInvitationPage.jsx index 652601e26d..2eb5e3a8e1 100644 --- a/frontend/src/ConfirmationPage/OrganizationInvitationPage.jsx +++ b/frontend/src/ConfirmationPage/OrganizationInvitationPage.jsx @@ -1,8 +1,6 @@ import React from 'react'; import { appService, authenticationService } from '@/_services'; import { toast } from 'react-hot-toast'; -import GoogleSSOLoginButton from '@ee/components/LoginPage/GoogleSSOLoginButton'; -import GitSSOLoginButton from '@ee/components/LoginPage/GitSSOLoginButton'; import { ShowLoading } from '@/_components'; import { withTranslation } from 'react-i18next'; import OnboardingNavbar from '@/_components/OnboardingNavbar'; @@ -35,30 +33,19 @@ class OrganizationInvitationPageComponent extends React.Component { componentDidMount() { authenticationService.deleteLoginOrganizationId(); - if (!this.single_organization) { - if (this.organizationId) { - authenticationService.saveLoginOrganizationId(this.organizationId); - this.organizationId && - authenticationService.getOrganizationConfigs(this.organizationId).then( - (configs) => { - this.setState({ isGettingConfigs: false, configs }); - }, - () => { - this.setState({ isGettingConfigs: false }); - } - ); - } else { - this.setState({ isGettingConfigs: false }); - } + if (this.organizationId) { + authenticationService.saveLoginOrganizationId(this.organizationId); + this.organizationId && + authenticationService.getOrganizationConfigs(this.organizationId).then( + (configs) => { + this.setState({ isGettingConfigs: false, configs }); + }, + () => { + this.setState({ isGettingConfigs: false }); + } + ); } else { - authenticationService.getOrganizationConfigs().then( - (configs) => { - this.setState({ isGettingConfigs: false, configs }); - }, - () => { - this.setState({ isGettingConfigs: false }); - } - ); + this.setState({ isGettingConfigs: false }); } authenticationService @@ -112,14 +99,7 @@ class OrganizationInvitationPageComponent extends React.Component { } if (response.status == 201) { toast.success(`Added to the workspace${isSetPassword ? ' and password has been set ' : ' '}successfully.`); - if (this.single_organization) { - const json = response?.json(); - json.then((res) => { - authenticationService.updateUser(res?.user); - authenticationService.deleteLoginOrganizationId(); - this.props.navigate('/login'); - }); - } else this.props.navigate('/login'); + this.props.navigate('/login'); } }) .catch(() => { @@ -140,262 +120,109 @@ class OrganizationInvitationPageComponent extends React.Component { ) : (
- {!this.single_organization ? ( -
-
- -
-
- {isGettingConfigs ? ( - - ) : ( -
-

- Join {this.state?.configs?.name ? this.state?.configs?.name : 'ToolJet'} -

+
+
+ +
+ + {isGettingConfigs ? ( + + ) : ( +
+

+ Join {this.state?.configs?.name ? this.state?.configs?.name : 'ToolJet'} +

-
- {`You are invited to ${ - this.state?.configs?.name - ? `a workspace ${this.state?.configs?.name}. Accept the invite to join the workspace.` - : 'ToolJet.' - }`} -
- -
- -

{userDetails?.name}

-
- -
- -

{userDetails?.email}

-
- - {userDetails?.onboarding_details?.password && ( -
- -
- - -
- {this.state?.showPassword ? ( - - ) : ( - - )} -
- - - {this.props.t( - 'loginSignupPage.passwordCharacter', - 'Password must be at least 5 characters' - )} - -
-
- )} -
- this.acceptInvite(e)} - disabled={ - userDetails?.onboarding_details?.password && - (isLoading || !this.state?.password || this.state?.password?.length < 5) - } - data-cy="accept-invite-button" - > - {isLoading ? ( -
- -
- ) : ( - <> - {this.props.t('confirmationPage.acceptInvite', 'Accept invite')} - - - )} -
-
-

- By signing up you are agreeing to the -
- - Terms of Service & - Privacy Policy - -

+
+ {`You are invited to ${ + this.state?.configs?.name + ? `a workspace ${this.state?.configs?.name}. Accept the invite to join the workspace.` + : 'ToolJet.' + }`}
- )} - -
-
-
- ) : ( - <> -
-
- -
-
- {isGettingConfigs ? ( - - ) : ( -
-

- Join {this.state?.configs?.name ? this.state?.configs?.name : 'ToolJet'} -

-
- {`You are invited to ${ - this.state?.configs?.name - ? `a workspace ${this.state?.configs?.name}. Accept the invite to join the workspace.` - : 'ToolJet.' - }`} -
- {this.source !== 'sso' && - (this.state?.configs?.google?.enabled || this.state?.configs?.git?.enabled) && ( -
- {this.state?.configs?.google?.enabled && ( -
- -
- )} - {this.state?.configs?.git?.enabled && ( -
- -
- )} -
-
-

- {this.props.t('confirmationPage.or', 'OR')} -

-
-
-
- )} +
+ +

{userDetails?.name}

+
-
- -

- {userDetails?.name} -

-
+
+ +

{userDetails?.email}

+
-
- -

- {userDetails?.email} -

-
+ {userDetails?.onboarding_details?.password && ( +
+ +
+ - {userDetails?.onboarding_details?.password && ( -
- -
- - -
- {this.state.showPassword ? ( - - ) : ( - - )} -
- - {this.props.t( - 'loginSignupPage.passwordCharacter', - 'Password must be at least 5 characters' - )} - -
-
- )} - -
- this.acceptInvite(e)} - disabled={ - isLoading || - (userDetails?.onboarding_details?.password && - (!this.state?.password || this.state?.password?.length < 5)) - } - data-cy="accept-invite-button" - > - {isLoading ? ( -
- -
+
+ {this.state?.showPassword ? ( + ) : ( - <> - {this.props.t('confirmationPage.acceptInvite', 'Accept invite')} - - + + )} +
+ + + {this.props.t( + 'loginSignupPage.passwordCharacter', + 'Password must be at least 5 characters' )} -
-
-

- By signing up you are agreeing to the -
- - - Terms of Service{' '} - - & - - {' '} - Privacy Policy - -

+
)} - -
-
+
+ this.acceptInvite(e)} + disabled={ + userDetails?.onboarding_details?.password && + (isLoading || !this.state?.password || this.state?.password?.length < 5) + } + data-cy="accept-invite-button" + > + {isLoading ? ( +
+ +
+ ) : ( + <> + {this.props.t('confirmationPage.acceptInvite', 'Accept invite')} + + + )} +
+
+

+ By signing up you are agreeing to the +
+ + Terms of Service & + Privacy Policy + +

+
+ )} +
- - )} +
+
)}
diff --git a/frontend/src/Editor/Comment/CommentBody.jsx b/frontend/src/Editor/Comment/CommentBody.jsx index e1d14fe898..7938d34f72 100644 --- a/frontend/src/Editor/Comment/CommentBody.jsx +++ b/frontend/src/Editor/Comment/CommentBody.jsx @@ -14,7 +14,7 @@ moment.updateLocale('en', { }, }); -const CommentBody = ({ socket, thread, isLoading, setEditComment, setEditCommentId, fetchComments }) => { +const CommentBody = ({ socket, thread, isLoading, setEditComment, setEditCommentId, fetchComments, currentUser }) => { const bottomRef = React.useRef(); const { t } = useTranslation(); @@ -39,7 +39,6 @@ const CommentBody = ({ socket, thread, isLoading, setEditComment, setEditComment
{t('leftSidebar.Comments.commentBody', 'There are no comments to display')}
); - const currentUser = JSON.parse(localStorage.getItem('currentUser')); return (
{thread.map(({ id, comment, createdAt, user = {} }) => { @@ -52,7 +51,7 @@ const CommentBody = ({ socket, thread, isLoading, setEditComment, setEditComment fetchComments={fetchComments} comment={comment} commentId={id} - isCommentOwner={currentUser.id === user.id} + isCommentOwner={currentUser?.id === user.id} setEditComment={setEditComment} setEditCommentId={setEditCommentId} /> diff --git a/frontend/src/Editor/Comment/index.jsx b/frontend/src/Editor/Comment/index.jsx index 920033ee46..7c126a3d54 100644 --- a/frontend/src/Editor/Comment/index.jsx +++ b/frontend/src/Editor/Comment/index.jsx @@ -7,7 +7,7 @@ import CommentHeader from '@/Editor/Comment/CommentHeader'; import CommentBody from '@/Editor/Comment/CommentBody'; import CommentFooter from '@/Editor/Comment/CommentFooter'; import usePopover from '@/_hooks/use-popover'; -import { commentsService, organizationService } from '@/_services'; +import { commentsService, organizationService, authenticationService } from '@/_services'; import useRouter from '@/_hooks/use-router'; import DOMPurify from 'dompurify'; import { capitalize } from 'lodash'; @@ -25,10 +25,15 @@ const Comment = ({ socket, x, y, threadId, user = {}, isResolved, fetchThreads, item: { threadId, name: 'comment' }, })); const router = useRouter(); + const [currentUser, setCurrentUser] = React.useState(); React.useEffect(() => { // Listen for messages // TODO: add check if user is the initiator of this event, don't fetch data + const currentSession = authenticationService.currentSessionValue; + const currentUser = currentSession?.current_user; + setCurrentUser(currentUser); + socket?.addEventListener('message', function (event) { if (event.data === threadId) fetchData(); }); @@ -100,8 +105,6 @@ const Comment = ({ socket, x, y, threadId, user = {}, isResolved, fetchThreads, ); }; - const currentUser = JSON.parse(localStorage.getItem('currentUser')); - const searchUser = (query, callback) => { if (!query) { return; @@ -163,7 +166,7 @@ const Comment = ({ socket, x, y, threadId, user = {}, isResolved, fetchThreads, socket={socket} threadId={threadId} fetchThreads={fetchThreads} - isThreadOwner={currentUser.id === user.id} + isThreadOwner={currentUser?.id === user.id} isResolved={isResolved} /> group.group), - }; - } const defaultPageId = uuid(); + this.subscription = null; + this.defaultDefinition = { showViewerNavigation: true, homePageId: defaultPageId, @@ -115,7 +106,7 @@ class EditorComponent extends React.Component { this.selectionDragRef = React.createRef(); this.queryManagerPreferences = JSON.parse(localStorage.getItem('queryManagerPreferences')) ?? {}; this.state = { - currentUser: authenticationService.currentUserValue, + currentUser: {}, app: {}, allComponentTypes: componentTypes, isLoading: true, @@ -135,7 +126,6 @@ class EditorComponent extends React.Component { queries: {}, components: {}, globals: { - currentUser: userVars, theme: { name: props.darkMode ? 'dark' : 'light' }, urlparams: JSON.parse(JSON.stringify(queryString.parse(props.location.search))), }, @@ -175,7 +165,40 @@ class EditorComponent extends React.Component { document.title = name ? `${name} - Tooljet` : `Untitled App - Tooljet`; } + getCurrentOrganizationDetails() { + const currentSession = authenticationService.currentSessionValue; + const currentUser = currentSession?.current_user; + this.subscription = authenticationService.currentSession.subscribe((currentSession) => { + if (currentUser && currentSession?.group_permissions) { + const userVars = { + email: currentUser.email, + firstName: currentUser.first_name, + lastName: currentUser.last_name, + groups: currentSession.group_permissions?.map((group) => group.group), + }; + + this.setState({ + currentUser, + currentState: { + ...this.state.currentState, + globals: { + ...this.state.currentState.globals, + userVars: { + email: currentUser.email, + firstName: currentUser.first_name, + lastName: currentUser.last_name, + groups: currentSession.group_permissions?.map((group) => group.group) || [], + }, + }, + }, + userVars, + }); + } + }); + } + componentDidMount() { + this.getCurrentOrganizationDetails(); this.autoSave(); this.fetchApps(0); this.fetchApp(this.props.params.pageHandle); @@ -251,15 +274,17 @@ class EditorComponent extends React.Component { initEventListeners() { this.socket?.addEventListener('message', (event) => { - if (event.data === 'versionReleased') this.fetchApp(); - else if (event.data === 'dataQueriesChanged') this.fetchDataQueries(); - else if (event.data === 'dataSourcesChanged') this.fetchDataSources(); + const data = event.data.replace(/^"(.+(?="$))"$/, '$1'); + if (data === 'versionReleased') this.fetchApp(); + else if (data === 'dataQueriesChanged') this.fetchDataQueries(); + else if (data === 'dataSourcesChanged') this.fetchDataSources(); }); } componentWillUnmount() { document.title = 'Tooljet - Dashboard'; this.socket && this.socket?.close(); + this.subscription && this.subscription.unsubscribe(); if (config.ENABLE_MULTIPLAYER_EDITING) this.props?.provider?.disconnect(); } @@ -298,7 +323,7 @@ class EditorComponent extends React.Component { loadingGlobalDataSources: true, }, () => { - const { organization_id: organizationId } = this.state.currentUser; + const { current_organization_id: organizationId } = this.state.currentUser; globalDatasourceService.getAll(organizationId).then((data) => this.setState({ globalDataSources: data.data_sources, @@ -1657,7 +1682,7 @@ class EditorComponent extends React.Component { const queryParamsString = queryParams.map(([key, value]) => `${key}=${value}`).join('&'); - this.props.navigate(`/apps/${this.state.appId}/${handle}?${queryParamsString}`); + this.props.navigate(`/${getWorkspaceId()}/apps/${this.state.appId}/${handle}?${queryParamsString}`); const { globals: existingGlobals } = this.state.currentState; @@ -1850,6 +1875,7 @@ class EditorComponent extends React.Component { handleSlugChange={this.handleSlugChange} onVersionRelease={this.onVersionRelease} saveEditingVersion={this.saveEditingVersion} + currentUser={this.state.currentUser} />
diff --git a/frontend/src/Editor/Header/index.js b/frontend/src/Editor/Header/index.js index c194505444..4f29f96e79 100644 --- a/frontend/src/Editor/Header/index.js +++ b/frontend/src/Editor/Header/index.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { Link } from 'react-router-dom'; import AppLogo from '@/_components/AppLogo'; import { GlobalSettings } from './GlobalSettings'; @@ -10,6 +10,8 @@ import { ManageAppUsers } from '../ManageAppUsers'; import { ReleaseVersionButton } from '../ReleaseVersionButton'; import cx from 'classnames'; import config from 'config'; +// eslint-disable-next-line import/no-unresolved +import { useUpdatePresence } from '@y-presence/react'; export default function EditorHeader({ darkMode, @@ -38,9 +40,26 @@ export default function EditorHeader({ handleSlugChange, onVersionRelease, saveEditingVersion, + currentUser, }) { const { is_maintenance_on } = app; + const updatePresence = useUpdatePresence(); + useEffect(() => { + const initialPresence = { + firstName: currentUser?.first_name ?? '', + lastName: currentUser?.last_name ?? '', + email: currentUser?.email ?? '', + image: '', + editingVersionId: '', + x: 0, + y: 0, + color: '', + }; + updatePresence(initialPresence); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentUser]); + return (
diff --git a/frontend/src/Editor/LeftSidebar/SidebarDatasources.jsx b/frontend/src/Editor/LeftSidebar/SidebarDatasources.jsx index e9ed63c19c..b8b154646c 100644 --- a/frontend/src/Editor/LeftSidebar/SidebarDatasources.jsx +++ b/frontend/src/Editor/LeftSidebar/SidebarDatasources.jsx @@ -35,7 +35,7 @@ export const LeftSidebarDataSources = ({ const [isDeleteModalVisible, setDeleteModalVisibility] = React.useState(false); const [isDeletingDatasource, setDeletingDatasource] = React.useState(false); - const { admin } = authenticationService.currentUserValue; + const { admin } = authenticationService.currentSessionValue; const deleteDataSource = (selectedSource) => { setSelectedDataSource(selectedSource); diff --git a/frontend/src/Editor/ManageAppUsers.jsx b/frontend/src/Editor/ManageAppUsers.jsx index 08a9a300a8..4fdd965aca 100644 --- a/frontend/src/Editor/ManageAppUsers.jsx +++ b/frontend/src/Editor/ManageAppUsers.jsx @@ -8,11 +8,12 @@ import { debounce } from 'lodash'; import Textarea from '@/_ui/Textarea'; import { withTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; +import { getPrivateRoute } from '@/_helpers/routes'; class ManageAppUsersComponent extends React.Component { constructor(props) { super(props); - this.currentUser = authenticationService.currentUserValue; + this.isUserAdmin = authenticationService.currentSessionValue?.admin; this.state = { showModal: false, @@ -258,8 +259,8 @@ class ManageAppUsersComponent extends React.Component { - {this.currentUser?.admin && ( - + {this.isUserAdmin && ( + Manage users )} diff --git a/frontend/src/Editor/QueryManager/QueryEditors/TooljetDatabase/ToolJetDbOperations.jsx b/frontend/src/Editor/QueryManager/QueryEditors/TooljetDatabase/ToolJetDbOperations.jsx index f38f0a8f92..0f51bdb6d1 100644 --- a/frontend/src/Editor/QueryManager/QueryEditors/TooljetDatabase/ToolJetDbOperations.jsx +++ b/frontend/src/Editor/QueryManager/QueryEditors/TooljetDatabase/ToolJetDbOperations.jsx @@ -1,5 +1,5 @@ import React, { useState, useEffect, useMemo } from 'react'; -import { tooljetDatabaseService } from '@/_services'; +import { tooljetDatabaseService, authenticationService } from '@/_services'; import { TooljetDatabaseContext } from '@/TooljetDatabase/index'; import { ListRows } from './ListRows'; import { CreateRow } from './CreateRow'; @@ -14,8 +14,9 @@ const ToolJetDbOperations = ({ currentState, optionchanged, options, darkMode }) const computeSelectStyles = (darkMode, width) => { return queryManagerSelectComponentStyle(darkMode, width); }; + + const { current_organization_id: organizationId } = authenticationService.currentSessionValue; const mounted = useMounted(); - const { organization_id: organizationId } = JSON.parse(localStorage.getItem('currentUser')) || {}; const [operation, setOperation] = useState(options['operation'] || ''); const [columns, setColumns] = useState([]); const [tables, setTables] = useState([]); diff --git a/frontend/src/Editor/RealtimeCursors.jsx b/frontend/src/Editor/RealtimeCursors.jsx index 845c767858..cecbffac76 100644 --- a/frontend/src/Editor/RealtimeCursors.jsx +++ b/frontend/src/Editor/RealtimeCursors.jsx @@ -5,10 +5,9 @@ import { useEventListener } from '@/_hooks/use-event-listener'; import { xorWith, isEqual } from 'lodash'; import { Cursor } from './Cursor'; import { USER_COLORS } from '@/_helpers/constants'; -import { userService } from '@/_services'; +import { userService, authenticationService } from '@/_services'; const RealtimeCursors = ({ editingVersionId, editingPageId }) => { - const currentUser = JSON.parse(localStorage.getItem('currentUser')); const others = useOthers(); const unavailableColors = others.map((other) => other?.presence?.color); @@ -28,17 +27,20 @@ const RealtimeCursors = ({ editingVersionId, editingPageId }) => { }, [editingVersionId, editingPageId]); React.useEffect(() => { - async function fetchAvatar() { - const blob = await userService.getAvatar(currentUser.avatar_id); + async function fetchAvatar(avatarId) { + const blob = await userService.getAvatar(avatarId); const fileReader = new FileReader(); fileReader.onload = (e) => { updatePresence({ image: e.target.result }); }; fileReader.readAsDataURL(blob); } - if (currentUser.avatar_id) fetchAvatar(); + const currentSession = authenticationService.currentSessionValue; + const currentUser = currentSession?.current_user; + if (currentUser.avatar_id) fetchAvatar(currentUser.avatar_id); + // eslint-disable-next-line react-hooks/exhaustive-deps - }, [currentUser.avatar_id]); + }, []); const othersOnSameVersionAndPage = others.filter( (other) => diff --git a/frontend/src/Editor/RealtimeEditor.jsx b/frontend/src/Editor/RealtimeEditor.jsx index 217fc09bfa..605af7ba7f 100644 --- a/frontend/src/Editor/RealtimeEditor.jsx +++ b/frontend/src/Editor/RealtimeEditor.jsx @@ -34,11 +34,8 @@ export const RealtimeEditor = (props) => { const router = useRouter(); React.useEffect(() => { - const currentUser = JSON.parse(localStorage.getItem('currentUser')); const domain = psl.parse(window.location.host).domain; - document.cookie = domain - ? `auth_token=${currentUser?.auth_token}; domain=.${domain}; path=/` - : `auth_token=${currentUser?.auth_token}; path=/`; + document.cookie = domain ? `domain=.${domain}; path=/` : `path=/`; document.cookie = domain ? `app_id=${router.query.id}; domain=.${domain}; path=/` : `app_id=${router.query.id}; path=/`; @@ -60,12 +57,10 @@ export const RealtimeEditor = (props) => { if (!provider) return ; - const currentUser = JSON.parse(localStorage.getItem('currentUser')); - const initialPresence = { - firstName: currentUser?.first_name ?? '', - lastName: currentUser?.last_name ?? '', - email: currentUser?.email ?? '', + firstName: '', + lastName: '', + email: '', image: '', editingVersionId: '', x: 0, diff --git a/frontend/src/Editor/Viewer.jsx b/frontend/src/Editor/Viewer.jsx index 276de4b0fc..5eabbb1fe1 100644 --- a/frontend/src/Editor/Viewer.jsx +++ b/frontend/src/Editor/Viewer.jsx @@ -17,7 +17,13 @@ import { import queryString from 'query-string'; import ViewerLogoIcon from './Icons/viewer-logo.svg'; import { DataSourceTypes } from './DataSourceManager/SourceComponents'; -import { resolveReferences, safelyParseJSON, stripTrailingSlash } from '@/_helpers/utils'; +import { + resolveReferences, + safelyParseJSON, + stripTrailingSlash, + getSubpath, + excludeWorkspaceIdFromURL, +} from '@/_helpers/utils'; import { withTranslation } from 'react-i18next'; import _ from 'lodash'; import { Navigate } from 'react-router-dom'; @@ -38,13 +44,15 @@ class ViewerComponent extends React.Component { const appId = this.props.params.id; const versionId = this.props.params.versionId; + this.subscription = null; + this.state = { slug, appId, versionId, deviceWindowWidth, currentLayout: isMobileDevice ? 'mobile' : 'desktop', - currentUser: authenticationService.currentUserValue, + currentUser: null, isLoading: true, users: null, appDefinition: { pages: {} }, @@ -89,7 +97,7 @@ class ViewerComponent extends React.Component { }; setStateForContainer = async (data) => { - const currentUser = authenticationService.currentUserValue; + const currentUser = this.state.currentUser; let userVars = {}; if (currentUser) { @@ -97,7 +105,7 @@ class ViewerComponent extends React.Component { email: currentUser.email, firstName: currentUser.first_name, lastName: currentUser.last_name, - groups: currentUser?.group_permissions.map((group) => group.group), + groups: authenticationService.currentSessionValue?.group_permissions.map((group) => group.group), }; } @@ -135,6 +143,7 @@ class ViewerComponent extends React.Component { this.setState( { + currentUser, currentSidebarTab: 2, currentLayout: mobileLayoutHasWidgets ? 'mobile' : 'desktop', canvasWidth: @@ -248,8 +257,7 @@ class ViewerComponent extends React.Component { const sub_path = window?.public_config?.SUB_PATH ? stripTrailingSlash(window?.public_config?.SUB_PATH) : ''; organizationService.switchOrganization(orgId).then( - (data) => { - authenticationService.updateCurrentUserDetails(data); + () => { window.location.href = `${sub_path}${path}`; }, () => { @@ -264,17 +272,18 @@ class ViewerComponent extends React.Component { const statusCode = errorDetails.data?.statusCode; if (statusCode === 403) { const errorObj = safelyParseJSON(errorDetails.data?.message); + const currentSessionValue = authenticationService.currentSessionValue; if ( errorObj?.organizationId && this.state.currentUser && - this.state.currentUser.organization_id !== errorObj?.organizationId + currentSessionValue.current_organization_id !== errorObj?.organizationId ) { this.switchOrganization(errorObj?.organizationId, appId, versionId); return; } return ; } else if (statusCode === 401) { - return ; + window.location = `${getSubpath() ?? ''}/login?redirectTo=${this.props.location.pathname}`; } else if (statusCode === 404) { toast.error(errorDetails?.error ?? 'App not found', { position: 'top-center', @@ -287,13 +296,51 @@ class ViewerComponent extends React.Component { } }; - componentDidMount() { + setupViewer() { const slug = this.props.params.slug; const appId = this.props.params.id; const versionId = this.props.params.versionId; - this.setState({ isLoading: false }); - slug ? this.loadApplicationBySlug(slug) : this.loadApplicationByVersion(appId, versionId); + this.subscription = authenticationService.currentSession.subscribe((currentSession) => { + if (currentSession?.group_permissions) { + const currentUser = currentSession.current_user; + const userVars = { + email: currentUser.email, + firstName: currentUser.first_name, + lastName: currentUser.last_name, + groups: currentSession?.group_permissions?.map((group) => group.group), + }; + + this.setState({ + currentUser, + currentState: { + ...this.state.currentState, + globals: { + ...this.state.currentState.globals, + userVars: { + email: currentUser.email, + firstName: currentUser.first_name, + lastName: currentUser.last_name, + groups: currentSession?.group_permissions?.map((group) => group.group) || [], + }, + }, + }, + userVars, + }); + slug ? this.loadApplicationBySlug(slug) : this.loadApplicationByVersion(appId, versionId); + } else if (currentSession?.authentication_failed && !slug) { + const loginPath = (window.public_config?.SUB_PATH || '/') + 'login'; + const pathname = getSubpath() ? window.location.pathname.replace(getSubpath(), '') : window.location.pathname; + window.location.href = loginPath + `?redirectTo=${excludeWorkspaceIdFromURL(pathname)}`; + } else { + slug && this.loadApplicationBySlug(slug); + } + this.setState({ isLoading: false }); + }); + } + + componentDidMount() { + this.setupViewer(); } componentDidUpdate(prevProps) { @@ -429,6 +476,10 @@ class ViewerComponent extends React.Component { return computedCanvasMaxWidth; }; + componentWillUnmount() { + this.subscription && this.subscription.unsubscribe(); + } + render() { const { appDefinition, diff --git a/frontend/src/GlobalDatasources/index.jsx b/frontend/src/GlobalDatasources/index.jsx index 014c01db07..55d4919207 100644 --- a/frontend/src/GlobalDatasources/index.jsx +++ b/frontend/src/GlobalDatasources/index.jsx @@ -1,7 +1,7 @@ import React, { createContext, useMemo, useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import Layout from '@/_ui/Layout'; -import { globalDatasourceService } from '@/_services'; +import { globalDatasourceService, authenticationService } from '@/_services'; import { GlobalDataSourcesPage } from './GlobalDataSourcesPage'; export const GlobalDataSourcesContext = createContext({ @@ -12,8 +12,8 @@ export const GlobalDataSourcesContext = createContext({ }); export const GlobalDatasources = (props) => { - const { organization_id, admin } = JSON.parse(localStorage.getItem('currentUser')) || {}; - const [organizationId, setOrganizationId] = useState(organization_id); + const { current_organization_id, admin } = authenticationService.currentSessionValue; + const [organizationId, setOrganizationId] = useState(current_organization_id); const [selectedDataSource, setSelectedDataSource] = useState(null); const [dataSources, setDataSources] = useState([]); const [showDataSourceManagerModal, toggleDataSourceManagerModal] = useState(false); diff --git a/frontend/src/HomePage/AppCard.jsx b/frontend/src/HomePage/AppCard.jsx index e3c7eb72b0..827c54e94e 100644 --- a/frontend/src/HomePage/AppCard.jsx +++ b/frontend/src/HomePage/AppCard.jsx @@ -9,6 +9,7 @@ import configs from './Configs/AppIcon.json'; import { Link, useNavigate } from 'react-router-dom'; import urlJoin from 'url-join'; import { useTranslation } from 'react-i18next'; +import { getPrivateRoute } from '@/_helpers/routes'; const { defaultIcon } = configs; export default function AppCard({ @@ -117,7 +118,11 @@ export default function AppCard({ {canUpdate && (
- + + + + ); +} + +export default function SwitchWorkspacePage({ darkMode }) { + const [organizations, setOrganizations] = React.useState([]); + + const fetchOrganizations = () => { + organizationService.getOrganizations().then((response) => setOrganizations(response.organizations)); + }; + + const switchOrganization = (orgId) => { + if (orgId) { + const newPath = appendWorkspaceId(orgId, location.pathname, true); + window.history.replaceState(null, null, newPath); + window.location.reload(); + } + }; + + useEffect(() => { + fetchOrganizations(); + }, []); + + return ( +
+ +
+ ); +} diff --git a/frontend/src/HomePage/TemplateLibraryModal/TemplateLibraryModal.jsx b/frontend/src/HomePage/TemplateLibraryModal/TemplateLibraryModal.jsx index 9ac9eb2cfb..3715401ae2 100644 --- a/frontend/src/HomePage/TemplateLibraryModal/TemplateLibraryModal.jsx +++ b/frontend/src/HomePage/TemplateLibraryModal/TemplateLibraryModal.jsx @@ -8,6 +8,7 @@ import _ from 'lodash'; import TemplateDisplay from './TemplateDisplay'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; +import { getWorkspaceId } from '../../_helpers/utils'; const identifyUniqueCategories = (templates) => ['all', ...new Set(_.map(templates, 'category'))].map((categoryId) => ({ @@ -49,7 +50,8 @@ export default function TemplateLibraryModal(props) { const [deploying, setDeploying] = useState(false); - function deployApp() { + function deployApp(event) { + event.preventDefault(); const id = selectedApp.id; setDeploying(true); libraryAppService @@ -60,7 +62,7 @@ export default function TemplateLibraryModal(props) { toast.success('App created.', { position: 'top-center', }); - navigate(`/apps/${data.id}`); + navigate(`/${getWorkspaceId()}/apps/${data.id}`); }) .catch((e) => { toast.error(e.error, { @@ -113,9 +115,7 @@ export default function TemplateLibraryModal(props) { { - deployApp(); - }} + onClick={deployApp} > {t('homePage.templateLibraryModal.createAppfromTemplate', 'Create application from template')} diff --git a/frontend/src/LoginPage/LoginPage.jsx b/frontend/src/LoginPage/LoginPage.jsx index ac6d25fc4c..3a4e6e49fe 100644 --- a/frontend/src/LoginPage/LoginPage.jsx +++ b/frontend/src/LoginPage/LoginPage.jsx @@ -5,7 +5,7 @@ import { Link, Navigate } from 'react-router-dom'; import queryString from 'query-string'; import GoogleSSOLoginButton from '@ee/components/LoginPage/GoogleSSOLoginButton'; import GitSSOLoginButton from '@ee/components/LoginPage/GitSSOLoginButton'; -import { validateEmail } from '../_helpers/utils'; +import { getSubpath, getWorkspaceId, validateEmail } from '../_helpers/utils'; import { ShowLoading } from '@/_components'; import { withTranslation } from 'react-i18next'; import OnboardingNavbar from '@/_components/OnboardingNavbar'; @@ -26,39 +26,74 @@ class LoginPageComponent extends React.Component { configs: undefined, emailError: false, navigateToLogin: false, + current_organization_name: null, }; - this.single_organization = window.public_config?.DISABLE_MULTI_WORKSPACE === 'true'; this.organizationId = props.params.organizationId; } darkMode = localStorage.getItem('darkMode') === 'true'; + returnWorkspaceIdIfNeed = (path) => { + if (path) { + return !path.includes('applications') && !path.includes('integrations') ? `/${getWorkspaceId()}` : ''; + } + return `/${getWorkspaceId()}`; + }; + componentDidMount() { this.setRedirectUrlToCookie(); authenticationService.deleteLoginOrganizationId(); - if ( - (!this.organizationId && authenticationService.currentUserValue) || - (this.organizationId && authenticationService?.currentUserValue?.organization_id === this.organizationId) - ) { - return this.setState({ navigateToLogin: true }); - } - if (this.organizationId || this.single_organization) + this.currentSessionObservable = authenticationService.currentSession.subscribe((newSession) => { + if (newSession?.current_organization_name) + this.setState({ current_organization_name: newSession.current_organization_name }); + if (newSession?.group_permissions || newSession?.id) { + if ( + (!this.organizationId && newSession?.current_organization_id) || + (this.organizationId && newSession?.current_organization_id === this.organizationId) + ) { + // redirect to home if already logged in + // set redirect path for sso login + const path = this.eraseRedirectUrl(); + const redirectPath = `${this.returnWorkspaceIdIfNeed(path)}${path && path !== '/' ? path : ''}`; + window.location = getSubpath() ? `${getSubpath()}${redirectPath}` : redirectPath; + } + } + }); + + if (this.organizationId) { authenticationService.saveLoginOrganizationId(this.organizationId); + } authenticationService.getOrganizationConfigs(this.organizationId).then( (configs) => { this.setState({ isGettingConfigs: false, configs }); }, (response) => { - if (response.data.statusCode !== 404) { + if (response.data.statusCode !== 404 && response.data.statusCode !== 422) { return this.props.navigate({ pathname: '/', state: { errorMessage: 'Error while login, please try again' }, }); } + // If there is no organization found for single organization setup // show form to sign up // redirected here for self hosted version - this.props.navigate('/setup'); + response.data.statusCode !== 422 && this.props.navigate('/setup'); + + // if wrong workspace id then show workspace-switching page + if (response.data.statusCode === 422) { + authenticationService + .validateSession() + .then(({ current_organization_id }) => { + authenticationService.updateCurrentSession({ + current_organization_id, + }); + this.props.history.push('/switch-workspace'); + }) + .catch(() => { + window.location = '/login'; + }); + } this.setState({ isGettingConfigs: false, @@ -79,6 +114,10 @@ class LoginPageComponent extends React.Component { }); } + componentWillUnmount() { + this.currentSessionObservable && this.currentSessionObservable.unsubscribe(); + } + eraseRedirectUrl() { const redirectPath = getCookie('redirectPath'); redirectPath && eraseCookie('redirectPath'); @@ -129,10 +168,13 @@ class LoginPageComponent extends React.Component { authenticationService.deleteLoginOrganizationId(); const params = queryString.parse(this.props.location.search); const { from } = params.redirectTo ? { from: { pathname: params.redirectTo } } : { from: { pathname: '/' } }; - const redirectPath = from.pathname === '/confirm' ? '/' : from; - this.props.navigate(redirectPath); + if (from.pathname !== '/confirm') + // appending workspace-id to avoid 401 error. App.jsx will take the workspace id from URL + from.pathname = `${this.returnWorkspaceIdIfNeed(from.pathname)}${from.pathname !== '/' ? from.pathname : ''}`; + const redirectPath = from.pathname === '/confirm' ? '/' : from.pathname; this.setState({ isLoading: false }); this.eraseRedirectUrl(); + window.location = getSubpath() ? `${getSubpath()}${redirectPath}` : redirectPath; }; authFailureHandler = (res) => { @@ -354,14 +396,23 @@ class LoginPageComponent extends React.Component { )} )} - {authenticationService?.currentUserValue?.organization && this.organizationId && ( + {this.state.current_organization_name && this.organizationId && (
- back to  {authenticationService?.currentUserValue?.organization} + back to {' '} + + (window.location = `${getSubpath() ? getSubpath() : ''}/${ + authenticationService.currentSessionValue?.current_organization_id + }`) + } + > + {this.state.current_organization_name} +
)}
diff --git a/frontend/src/ManageGroupPermissions/ManageGroupPermissions.jsx b/frontend/src/ManageGroupPermissions/ManageGroupPermissions.jsx index 9e5094c3ad..beb832064b 100644 --- a/frontend/src/ManageGroupPermissions/ManageGroupPermissions.jsx +++ b/frontend/src/ManageGroupPermissions/ManageGroupPermissions.jsx @@ -12,7 +12,6 @@ class ManageGroupPermissionsComponent extends React.Component { super(props); this.state = { - currentUser: authenticationService.currentUserValue, isLoading: true, groups: [], creatingGroup: false, diff --git a/frontend/src/ManageOrgUsers/ManageOrgUsers.jsx b/frontend/src/ManageOrgUsers/ManageOrgUsers.jsx index a9df567948..23ce5e8de4 100644 --- a/frontend/src/ManageOrgUsers/ManageOrgUsers.jsx +++ b/frontend/src/ManageOrgUsers/ManageOrgUsers.jsx @@ -13,7 +13,6 @@ class ManageOrgUsersComponent extends React.Component { super(props); this.state = { - currentUser: authenticationService.currentUserValue, isLoading: true, showNewUserForm: false, showUploadUserForm: false, @@ -132,7 +131,6 @@ class ManageOrgUsersComponent extends React.Component { inviteBulkUsers = (event) => { event.preventDefault(); if (this.handleFileValidation()) { - const token = this.state.currentUser.auth_token; const formData = new FormData(); this.setState({ uploadingUsers: true, @@ -140,7 +138,7 @@ class ManageOrgUsersComponent extends React.Component { formData.append('file', this.state.file); organizationUserService - .inviteBulkUsers(formData, token) + .inviteBulkUsers(formData) .then((res) => { toast.success(res.message, { position: 'top-center', @@ -210,12 +208,12 @@ class ManageOrgUsersComponent extends React.Component { if (user.account_setup_token) { return urlJoin( window.public_config?.TOOLJET_HOST, - `/invitations/${user.account_setup_token}/workspaces/${user.invitation_token}?oid=${this.state.currentUser.organization_id}` + `/invitations/${user.account_setup_token}/workspaces/${user.invitation_token}?oid=${authenticationService?.currentSessionValue.current_organization_id}` ); } return urlJoin( window.public_config?.TOOLJET_HOST, - `/organization-invitations/${user.invitation_token}?oid=${this.state.currentUser.organization_id}` + `/organization-invitations/${user.invitation_token}?oid=${authenticationService?.currentSessionValue.current_organization_id}` ); }; diff --git a/frontend/src/ManageOrgVars/ManageOrgVars.jsx b/frontend/src/ManageOrgVars/ManageOrgVars.jsx index d4651d0a3b..bc0aba199c 100644 --- a/frontend/src/ManageOrgVars/ManageOrgVars.jsx +++ b/frontend/src/ManageOrgVars/ManageOrgVars.jsx @@ -9,7 +9,6 @@ import { withTranslation } from 'react-i18next'; class ManageOrgVarsComponent extends React.Component { constructor(props) { super(props); - this.currentUser = authenticationService.currentUserValue; this.state = { isLoading: true, @@ -221,15 +220,24 @@ class ManageOrgVarsComponent extends React.Component { } canCreateVariable = () => { - return this.canAnyGroupPerformAction('org_environment_variable_create', this.currentUser.group_permissions); + return this.canAnyGroupPerformAction( + 'org_environment_variable_create', + authenticationService.currentSessionValue.group_permissions + ); }; canUpdateVariable = () => { - return this.canAnyGroupPerformAction('org_environment_variable_update', this.currentUser.group_permissions); + return this.canAnyGroupPerformAction( + 'org_environment_variable_update', + authenticationService.currentSessionValue.group_permissions + ); }; canDeleteVariable = () => { - return this.canAnyGroupPerformAction('org_environment_variable_delete', this.currentUser.group_permissions); + return this.canAnyGroupPerformAction( + 'org_environment_variable_delete', + authenticationService.currentSessionValue.group_permissions + ); }; render() { @@ -303,7 +311,6 @@ class ManageOrgVarsComponent extends React.Component { variables={variables} canUpdateVariable={this.canUpdateVariable()} canDeleteVariable={this.canDeleteVariable()} - admin={this.currentUser.admin} onEditBtnClicked={this.onEditBtnClicked} onDeleteBtnClicked={this.onDeleteBtnClicked} /> diff --git a/frontend/src/ManageSSO/GeneralSettings.jsx b/frontend/src/ManageSSO/GeneralSettings.jsx index ad9c77ab90..fa5b688910 100644 --- a/frontend/src/ManageSSO/GeneralSettings.jsx +++ b/frontend/src/ManageSSO/GeneralSettings.jsx @@ -5,7 +5,6 @@ import { copyToClipboard } from '@/_helpers/appUtils'; import { useTranslation } from 'react-i18next'; export function GeneralSettings({ settings, updateData, instanceSettings }) { - const isSingleOrganization = window.public_config?.DISABLE_MULTI_WORKSPACE === 'true'; const [enableSignUp, setEnableSignUp] = useState(settings?.enable_sign_up || false); const [inheritSSO, setInheritSSO] = useState(settings?.inherit_s_s_o || false); const [domain, setDomain] = useState(settings?.domain || ''); @@ -121,7 +120,7 @@ export function GeneralSettings({ settings, updateData, instanceSettings }) {
- {!isSingleOrganization && (instanceSettings.google.enabled || instanceSettings.git.enabled) && ( + {(instanceSettings.google.enabled || instanceSettings.git.enabled) && (
- {!isSingleOrganization && ( -
- +
+ -
-

- {`${window.public_config?.TOOLJET_HOST}/login/${authenticationService?.currentUserValue?.organization_id}`} -

- copyFunction('login-url')} - src={`assets/images/icons/copy-dark.svg`} - width="22" - height="22" - className="sso-copy" - data-cy="copy-icon" - /> -
-
-
- {t( - 'header.organization.menus.manageSSO.generalSettings.workspaceLogin', - `Use this URL to login directly to this workspace` - )} -
+
+

+ {`${window.public_config?.TOOLJET_HOST}/login/${authenticationService?.currentSessionValue?.current_organization_id}`} +

+ copyFunction('login-url')} + src={`assets/images/icons/copy-dark.svg`} + width="22" + height="22" + className="sso-copy" + data-cy="copy-icon" + /> +
+
+
+ {t( + 'header.organization.menus.manageSSO.generalSettings.workspaceLogin', + `Use this URL to login directly to this workspace` + )}
- )} +
diff --git a/frontend/src/SuccessInfoScreen/VerificationSuccessInfoScreen.jsx b/frontend/src/SuccessInfoScreen/VerificationSuccessInfoScreen.jsx index 11e84ab4e1..2d5b95b9d5 100644 --- a/frontend/src/SuccessInfoScreen/VerificationSuccessInfoScreen.jsx +++ b/frontend/src/SuccessInfoScreen/VerificationSuccessInfoScreen.jsx @@ -4,7 +4,7 @@ import GoogleSSOLoginButton from '@ee/components/LoginPage/GoogleSSOLoginButton' import GitSSOLoginButton from '@ee/components/LoginPage/GitSSOLoginButton'; import OnBoardingForm from '../OnBoardingForm/OnBoardingForm'; import { authenticationService } from '@/_services'; -import { useLocation, useNavigate, useParams } from 'react-router-dom'; +import { useLocation, useParams } from 'react-router-dom'; import { LinkExpiredInfoScreen } from '@/SuccessInfoScreen'; import { ShowLoading } from '@/_components'; import { toast } from 'react-hot-toast'; @@ -14,7 +14,7 @@ import EyeHide from '../../assets/images/onboardingassets/Icons/EyeHide'; import EyeShow from '../../assets/images/onboardingassets/Icons/EyeShow'; import Spinner from '@/_ui/Spinner'; import { useTranslation } from 'react-i18next'; -import { buildURLWithQuery } from '@/_helpers/utils'; +import { buildURLWithQuery, getSubpath } from '@/_helpers/utils'; export const VerificationSuccessInfoScreen = function VerificationSuccessInfoScreen() { const [showOnboarding, setShowOnboarding] = useState(false); @@ -30,11 +30,9 @@ export const VerificationSuccessInfoScreen = function VerificationSuccessInfoScr const { t } = useTranslation(); const location = useLocation(); - const navigate = useNavigate(); const params = useParams(); const organizationId = new URLSearchParams(location?.search).get('oid'); - const single_organization = window.public_config?.DISABLE_MULTI_WORKSPACE === 'true'; const source = new URLSearchParams(location?.search).get('source'); const darkMode = localStorage.getItem('darkMode') === 'true'; @@ -72,32 +70,20 @@ export const VerificationSuccessInfoScreen = function VerificationSuccessInfoScr if (source == 'sso') setShowJoinWorkspace(true); authenticationService.deleteLoginOrganizationId(); - if (!single_organization) { - if (organizationId) { - authenticationService.saveLoginOrganizationId(organizationId); - organizationId && - authenticationService.getOrganizationConfigs(organizationId).then( - (configs) => { - setIsGettingConfigs(false); - setConfigs(configs); - }, - () => { - setIsGettingConfigs(false); - } - ); - } else { - setIsGettingConfigs(false); - } + if (organizationId) { + authenticationService.saveLoginOrganizationId(organizationId); + organizationId && + authenticationService.getOrganizationConfigs(organizationId).then( + (configs) => { + setIsGettingConfigs(false); + setConfigs(configs); + }, + () => { + setIsGettingConfigs(false); + } + ); } else { - authenticationService.getOrganizationConfigs().then( - (configs) => { - setIsGettingConfigs(false); - setConfigs(configs); - }, - () => { - setIsGettingConfigs(false); - } - ); + setIsGettingConfigs(false); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -129,10 +115,11 @@ export const VerificationSuccessInfoScreen = function VerificationSuccessInfoScr password: password, }) .then((user) => { - authenticationService.updateUser(user); authenticationService.deleteLoginOrganizationId(); setIsLoading(false); - navigate('/'); + window.location = getSubpath() + ? `${getSubpath()}/${user?.current_organization_id}` + : `/${user?.current_organization_id}`; }) .catch((res) => { setIsLoading(false); @@ -150,15 +137,12 @@ export const VerificationSuccessInfoScreen = function VerificationSuccessInfoScr setPassword(event.target.value); }; const clickContinue = (e) => { - if (single_organization) userDetails?.onboarding_details?.questions ? setShowOnboarding(true) : setUpAccount(e); - else { - userDetails?.onboarding_details?.questions && !userDetails?.onboarding_details?.password - ? setShowOnboarding(true) - : (userDetails?.onboarding_details?.password && !userDetails?.onboarding_details?.questions) || - (userDetails?.onboarding_details?.password && userDetails?.onboarding_details?.questions) - ? setShowJoinWorkspace(true) - : setUpAccount(e); - } + userDetails?.onboarding_details?.questions && !userDetails?.onboarding_details?.password + ? setShowOnboarding(true) + : (userDetails?.onboarding_details?.password && !userDetails?.onboarding_details?.questions) || + (userDetails?.onboarding_details?.password && userDetails?.onboarding_details?.questions) + ? setShowJoinWorkspace(true) + : setUpAccount(e); }; return ( diff --git a/frontend/src/TooljetDatabase/index.jsx b/frontend/src/TooljetDatabase/index.jsx index 1f57b3fc35..03fff22782 100644 --- a/frontend/src/TooljetDatabase/index.jsx +++ b/frontend/src/TooljetDatabase/index.jsx @@ -2,6 +2,7 @@ import React, { createContext, useState, useMemo } from 'react'; import Layout from '@/_ui/Layout'; import TooljetDatabasePage from './TooljetDatabasePage'; import { usePostgrestQueryBuilder } from './usePostgrestQueryBuilder'; +import { authenticationService } from '../_services/authentication.service'; export const TooljetDatabaseContext = createContext({ organizationId: null, @@ -30,8 +31,9 @@ export const TooljetDatabaseContext = createContext({ }); export const TooljetDatabase = (props) => { - const { organization_id } = JSON.parse(localStorage.getItem('currentUser')) || {}; - const [organizationId, setOrganizationId] = useState(organization_id); + const [organizationId, setOrganizationId] = useState( + authenticationService?.currentSessionValue?.current_organization_id + ); const [columns, setColumns] = useState([]); const [tables, setTables] = useState([]); const [searchParam, setSearchParam] = useState(''); diff --git a/frontend/src/_components/NotificationCenter/Notification.jsx b/frontend/src/_components/NotificationCenter/Notification.jsx index 8cf394037d..e4af1df1fd 100644 --- a/frontend/src/_components/NotificationCenter/Notification.jsx +++ b/frontend/src/_components/NotificationCenter/Notification.jsx @@ -2,7 +2,7 @@ import React from 'react'; import moment from 'moment'; import { toast } from 'react-hot-toast'; import { commentNotificationsService } from '@/_services'; -import { hightlightMentionedUserInComment } from '@/_helpers/utils'; +import { hightlightMentionedUserInComment, appendWorkspaceId, getWorkspaceId } from '@/_helpers/utils'; export const Notification = ({ id, creator, comment, updatedAt, commentLink, isRead, fetchData, darkMode }) => { const updateMentionedNotification = async () => { @@ -14,10 +14,16 @@ export const Notification = ({ id, creator, comment, updatedAt, commentLink, isR fetchData(); }; + const getNewCommentLink = () => { + const url = new URL(commentLink); + url.pathname = appendWorkspaceId(getWorkspaceId(), url.pathname); + return url; + }; + const updated = moment(updatedAt).fromNow(); return (
- +
{creator?.avatar ? ( diff --git a/frontend/src/_components/Organization.jsx b/frontend/src/_components/Organization.jsx deleted file mode 100644 index 96f57d8415..0000000000 --- a/frontend/src/_components/Organization.jsx +++ /dev/null @@ -1,412 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { Link } from 'react-router-dom'; -import { authenticationService, organizationService } from '@/_services'; -import Modal from '../HomePage/Modal'; -import { toast } from 'react-hot-toast'; -import { SearchBox } from './SearchBox'; -import { useTranslation } from 'react-i18next'; - -export const Organization = function Organization({ darkMode }) { - const isSingleOrganization = window.public_config?.DISABLE_MULTI_WORKSPACE === 'true'; - const { admin, organization_id } = authenticationService.currentUserValue; - const [organization, setOrganization] = useState(authenticationService.currentUserValue?.organization); - const [showCreateOrg, setShowCreateOrg] = useState(false); - const [showEditOrg, setShowEditOrg] = useState(false); - const [isCreating, setIsCreating] = useState(false); - const [searchText, setSearchText] = useState(''); - const [organizationList, setOrganizationList] = useState([]); - const [getOrgStatus, setGetOrgStatus] = useState('loading'); - const [isListOrganizations, setIsListOrganizations] = useState(false); - const [newOrgName, setNewOrgName] = useState(''); - const { t } = useTranslation(); - - const getAvatar = (organization) => { - if (!organization) return; - - const orgName = organization.split(' ').filter((e) => e && !!e.trim()); - if (orgName.length > 1) { - return `${orgName[0]?.[0]}${orgName[1]?.[0]}`; - } else if (organization.length >= 2) { - return `${organization[0]}${organization[1]}`; - } else { - return `${organization[0]}${organization[0]}`; - } - }; - - useEffect(() => { - !isSingleOrganization && getOrganizations(); - }, [isSingleOrganization]); - - const getOrganizations = () => { - setGetOrgStatus('loading'); - organizationService.getOrganizations().then( - (data) => { - setOrganizationList(data.organizations); - setGetOrgStatus('success'); - }, - () => { - setGetOrgStatus('failure'); - } - ); - }; - - const showEditModal = () => { - setNewOrgName(organization); - setShowEditOrg(true); - }; - - const showCreateModal = () => { - setNewOrgName(''); - setShowCreateOrg(true); - }; - - const duplicateOrganizationCheck = () => organizationList.some((org) => org.name === newOrgName.trim()); - - const createOrganization = () => { - const organizationNameExists = duplicateOrganizationCheck(); - - if (!(newOrgName && newOrgName.trim())) { - toast.error('Workspace name cannot be empty.', { - position: 'top-center', - }); - return; - } - if (newOrgName.length > 25) { - toast.error('Workspace name cannot be longer than 25 characters.', { - position: 'top-center', - }); - return; - } - if (organizationNameExists) { - toast.error(`${newOrgName} already exists.`, { - position: 'top-center', - }); - return; - } - setIsCreating(true); - organizationService.createOrganization(newOrgName).then( - (data) => { - setIsCreating(false); - authenticationService.updateCurrentUserDetails(data); - window.location.href = ''; - }, - () => { - setIsCreating(false); - toast.error('Error while creating workspace', { - position: 'top-center', - }); - } - ); - }; - - const editOrganization = () => { - const organizationNameExists = duplicateOrganizationCheck(); - - if (!(newOrgName && newOrgName.trim())) { - toast.error('Workspace name can not be empty.', { - position: 'top-center', - }); - return; - } - if (newOrgName.length > 25) { - toast.error('Workspace name cannot be longer than 25 characters.', { - position: 'top-center', - }); - return; - } - if (organizationNameExists) { - toast.error(`The workspace ${newOrgName} already exists.`, { - position: 'top-center', - }); - return; - } - setIsCreating(true); - organizationService.editOrganization({ name: newOrgName }).then( - () => { - authenticationService.updateCurrentUserDetails({ organization: newOrgName }); - toast.success('Workspace updated', { - position: 'top-center', - }); - setOrganization(newOrgName); - getOrganizations(); - }, - () => { - toast.error('Error while editing workspace', { - position: 'top-center', - }); - } - ); - setIsCreating(false); - setShowEditOrg(false); - }; - - const switchOrganization = (orgId) => { - organizationService.switchOrganization(orgId).then( - (data) => { - authenticationService.updateCurrentUserDetails(data); - window.location.href = ''; - }, - () => { - return (window.location.href = `login/${orgId}`); - } - ); - }; - - const listOrganization = () => { - return ( - organizationList && - organizationList - .filter((org) => org.name?.toLowerCase().includes(searchText ? searchText.toLowerCase() : '')) - .map((org) => { - return ( -
switchOrganization(org.id)} - className="dropdown-item org-list-item" - > -
- {getAvatar(org.name)} -
-
-
{org.name}
-
-
- {organization_id === org.id && ( -
- - - - -
- )} -
-
- ); - }) - ); - }; - - const searchOrganizations = (text) => { - setSearchText(text); - }; - - const getListOrganizations = () => { - return ( -
- ); - }; - - const getOrganizationMenu = () => { - return ( -
-
-
-
- {getAvatar(organization)} -
-
-
- {organization} -
- {admin && ( -
- - {t('globals.edit', 'Edit')} - -
- )} -
- {!isSingleOrganization && ( -
-
setIsListOrganizations(true)}> - - - - -
-
- )} -
-
- {!isSingleOrganization && ( -
-
{t('header.organization.menus.addWorkspace', 'Add workspace')}
-
- )} -
- {admin && ( - <> - - {t('header.organization.menus.menusList.manageUsers', 'Manage Users')} - - - {t('header.organization.menus.menusList.manageGroups', 'Manage Groups')} - - - {t('header.organization.menus.menusList.manageSso', 'Manage SSO')} - - - )} - - {admin - ? t('header.organization.menus.menusList.manageEnv', 'Manage Workspace Variables') - : t('globals.environmentVar', 'Workspace Variables')} - -
- ); - }; - - return ( -
-
- setIsListOrganizations(false)} - style={{ height: '38px' }} - > -
{organization}
-
-
- {!isSingleOrganization || admin - ? isListOrganizations - ? getListOrganizations() - : getOrganizationMenu() - : getOrganizationMenu()} -
-
- setShowCreateOrg(false)} - title={t('header.organization.createWorkspace', 'Create workspace')} - > -
-
- setNewOrgName(e.target.value)} - className="form-control" - placeholder={t('header.organization.workspaceName', 'workspace name')} - disabled={isCreating} - maxLength={25} - /> -
-
-
-
- - -
-
-
- setShowEditOrg(false)} - title={t('header.organization.editWorkspace', 'Edit workspace')} - > -
-
- setNewOrgName(e.target.value)} - className="form-control" - placeholder={t('header.organization.workspaceName', 'workspace name')} - disabled={isCreating} - value={newOrgName} - maxLength={25} - /> -
-
-
-
- - -
-
-
-
- ); -}; diff --git a/frontend/src/_components/OrganizationManager/CreateOrganization.jsx b/frontend/src/_components/OrganizationManager/CreateOrganization.jsx index 1bdfbb10e0..a73f4afeb9 100644 --- a/frontend/src/_components/OrganizationManager/CreateOrganization.jsx +++ b/frontend/src/_components/OrganizationManager/CreateOrganization.jsx @@ -1,8 +1,9 @@ import React, { useState } from 'react'; -import { authenticationService, organizationService } from '@/_services'; +import { organizationService } from '@/_services'; import AlertDialog from '@/_ui/AlertDialog'; import { toast } from 'react-hot-toast'; import { useTranslation } from 'react-i18next'; +import { appendWorkspaceId } from '../../_helpers/utils'; export const CreateOrganization = ({ showCreateOrg, setShowCreateOrg }) => { const [isCreating, setIsCreating] = useState(false); @@ -21,8 +22,9 @@ export const CreateOrganization = ({ showCreateOrg, setShowCreateOrg }) => { organizationService.createOrganization(newOrgName).then( (data) => { setIsCreating(false); - authenticationService.updateCurrentUserDetails(data); - window.location.href = ''; + const newPath = appendWorkspaceId(data.current_organization_id, location.pathname, true); + window.history.replaceState(null, null, newPath); + window.location.reload(); }, () => { setIsCreating(false); diff --git a/frontend/src/_components/OrganizationManager/CustomSelect.jsx b/frontend/src/_components/OrganizationManager/CustomSelect.jsx index 9591199ae3..4a82f16049 100644 --- a/frontend/src/_components/OrganizationManager/CustomSelect.jsx +++ b/frontend/src/_components/OrganizationManager/CustomSelect.jsx @@ -8,7 +8,7 @@ import { authenticationService } from '@/_services'; const Menu = (props) => { const { t } = useTranslation(); - const { admin } = authenticationService.currentUserValue; + const { admin } = authenticationService.currentSessionValue; return ( @@ -77,55 +77,20 @@ export const CustomSelect = ({ ...props }) => { const [showEditOrg, setShowEditOrg] = useState(false); const [showCreateOrg, setShowCreateOrg] = useState(false); - const isSingleOrganization = window.public_config?.DISABLE_MULTI_WORKSPACE === 'true'; - const { organization, admin } = authenticationService.currentUserValue; - return ( <> - {isSingleOrganization ? ( -
- {organization} - <> - {admin && ( -
setShowEditOrg(true)}> -
-
- - - - -
-
-
- )} - -
- ) : ( - ); }; diff --git a/frontend/src/_components/OrganizationManager/EditOrganization.jsx b/frontend/src/_components/OrganizationManager/EditOrganization.jsx index fffd98ac07..f916bc27e0 100644 --- a/frontend/src/_components/OrganizationManager/EditOrganization.jsx +++ b/frontend/src/_components/OrganizationManager/EditOrganization.jsx @@ -18,7 +18,6 @@ export const EditOrganization = ({ showEditOrg, setShowEditOrg }) => { setIsCreating(true); organizationService.editOrganization({ name: newOrgName }).then( () => { - authenticationService.updateCurrentUserDetails({ organization: newOrgName }); toast.success('Workspace updated'); window.location.reload(); }, diff --git a/frontend/src/_components/OrganizationManager/List.jsx b/frontend/src/_components/OrganizationManager/List.jsx index c2733e1647..282000e7b6 100644 --- a/frontend/src/_components/OrganizationManager/List.jsx +++ b/frontend/src/_components/OrganizationManager/List.jsx @@ -1,51 +1,28 @@ import React, { useState, useEffect } from 'react'; -import { authenticationService, organizationService } from '@/_services'; +import { authenticationService } from '@/_services'; import { CustomSelect } from './CustomSelect'; +import { getWorkspaceIdFromURL, appendWorkspaceId, getAvatar } from '../../_helpers/utils'; export const OrganizationList = function () { - const { organization_id } = authenticationService.currentUserValue; + const { current_organization_id } = authenticationService.currentSessionValue; const [organizationList, setOrganizationList] = useState([]); const [getOrgStatus, setGetOrgStatus] = useState(''); useEffect(() => { - getOrganizations(); + setGetOrgStatus('loading'); + const sessionObservable = authenticationService.currentSession.subscribe((newSession) => { + setOrganizationList(newSession.organizations ?? []); + if (newSession.organizations?.length > 0) setGetOrgStatus('success'); + }); + + () => sessionObservable.unsubscribe(); }, []); - const getOrganizations = () => { - setGetOrgStatus('loading'); - organizationService.getOrganizations().then( - (data) => { - setOrganizationList(data.organizations); - setGetOrgStatus('success'); - }, - () => { - setGetOrgStatus('failure'); - } - ); - }; - const switchOrganization = (orgId) => { - organizationService.switchOrganization(orgId).then( - (data) => { - authenticationService.updateCurrentUserDetails(data); - window.location.reload(); - }, - () => { - return (window.location.href = `login/${orgId}`); - } - ); - }; - - const getAvatar = (organization) => { - if (!organization) return; - - const orgName = organization.split(' ').filter((e) => e && !!e.trim()); - if (orgName.length > 1) { - return `${orgName[0]?.[0]}${orgName[1]?.[0]}`; - } else if (organization.length >= 2) { - return `${organization[0]}${organization[1]}`; - } else { - return `${organization[0]}${organization[0]}`; + if (getWorkspaceIdFromURL() !== orgId) { + const newPath = appendWorkspaceId(orgId, location.pathname, true); + window.history.replaceState(null, null, newPath); + window.location.reload(); } }; @@ -70,7 +47,7 @@ export const OrganizationList = function () { switchOrganization(id)} /> ); diff --git a/frontend/src/_components/PrivateRoute.jsx b/frontend/src/_components/PrivateRoute.jsx index 713eedb287..9aa3acf30e 100644 --- a/frontend/src/_components/PrivateRoute.jsx +++ b/frontend/src/_components/PrivateRoute.jsx @@ -1,46 +1,111 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { Navigate, useLocation } from 'react-router-dom'; import { authenticationService } from '@/_services'; +import { excludeWorkspaceIdFromURL, appendWorkspaceId } from '../_helpers/utils'; export const PrivateRoute = ({ children }) => { + const [session, setSession] = React.useState(authenticationService.currentSessionValue); const location = useLocation(); - const currentUser = authenticationService.currentUserValue; - return !currentUser && !location.pathname.startsWith('/applications/') ? ( - - ) : ( - children - ); + useEffect(() => { + const subject = authenticationService.currentSession.subscribe((newSession) => { + setSession(newSession); + }); + + () => subject.unsubscribe(); + }, []); + + const wid = session?.current_organization_id; + const path = appendWorkspaceId(wid, location.pathname, true); + if (location.pathname === '/:workspaceId' && wid) window.history.replaceState(null, null, path); + + // authorised so return component + if ( + session?.group_permissions || + location.pathname.startsWith('/applications/') || + (location.pathname === '/switch-workspace' && session?.current_organization_id) + ) { + return children; + } else { + if ( + (session?.authentication_status === false || session?.authentication_failed) && + !location.pathname.startsWith('/applications/') + ) { + // not logged in so redirect to login page with the return url' + return ( + + ); + } + + return ( +
+
+
+
+
+
+
+ ); + } }; export const AdminRoute = ({ children }) => { + const [session, setSession] = React.useState(authenticationService.currentSessionValue); const location = useLocation(); - const currentUser = authenticationService.currentUserValue; - return !currentUser && !location.pathname.startsWith('/applications/') ? ( - - ) : !currentUser?.admin ? ( - - ) : ( - children - ); + useEffect(() => { + const subject = authenticationService.currentSession.subscribe((newSession) => { + setSession(newSession); + }); + + () => subject.unsubscribe(); + }, []); + + // authorised so return component + if (session?.group_permissions) { + //check: [Marketplace route] + if (!session?.admin) { + return ( + + ); + } + + return children; + } else { + if (session?.authentication_status === false && !location.pathname.startsWith('/applications/')) { + // not logged in so redirect to login page with the return url' + return ( + + ); + } + + return ( +
+
+
+
+
+
+
+ ); + } }; diff --git a/frontend/src/_components/Profile.jsx b/frontend/src/_components/Profile.jsx index 4711dd99a3..6bc11ba415 100644 --- a/frontend/src/_components/Profile.jsx +++ b/frontend/src/_components/Profile.jsx @@ -1,25 +1,52 @@ import React from 'react'; -import { Link, useNavigate } from 'react-router-dom'; +import { Link } from 'react-router-dom'; import { authenticationService } from '@/_services'; import Avatar from '@/_ui/Avatar'; import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; import { useTranslation } from 'react-i18next'; import { ToolTip } from '@/_components/ToolTip'; +import { getPrivateRoute } from '@/_helpers/routes'; export const Profile = function Header({ switchDarkMode, darkMode }) { - const { first_name, last_name, avatar_id } = authenticationService.currentUserValue; + const currentSession = authenticationService.currentSessionValue; + const [currentUser, setCurrentUser] = React.useState({ + first_name: currentSession?.current_user.first_name, + last_name: currentSession?.current_user.last_name, + avatar_id: currentSession?.current_user.avatar_id, + }); const { t } = useTranslation(); - const navigate = useNavigate(); function logout() { authenticationService.logout(); - navigate('/login'); } + function getUserDetails() { + authenticationService.getUserDetails().then((currentUser) => { + const { firstName, lastName, avatarId } = currentUser; + setCurrentUser({ first_name: firstName, last_name: lastName, avatar_id: avatarId }); + }); + } + + React.useEffect(() => { + const observable = authenticationService.currentSession.subscribe((session) => { + if (session.isUserUpdated) { + getUserDetails(); + authenticationService.updateCurrentSession({ ...session, isUserUpdated: false }); + } + }); + + () => observable.unsubscribe(); + }, []); + const getOverlay = () => { return (
- +
- +
diff --git a/frontend/src/_helpers/appUtils.js b/frontend/src/_helpers/appUtils.js index 653f286ed0..f660f9a375 100644 --- a/frontend/src/_helpers/appUtils.js +++ b/frontend/src/_helpers/appUtils.js @@ -24,6 +24,8 @@ import { v4 as uuidv4 } from 'uuid'; import { allSvgs } from '@tooljet/plugins/client'; import urlJoin from 'url-join'; import { tooljetDbOperations } from '@/Editor/QueryManager/QueryEditors/TooljetDatabase/operations'; +import { authenticationService } from '@/_services/authentication.service'; +import { setCookie } from '@/_helpers/cookie'; import { flushSync } from 'react-dom'; // TODO: It can be removed once we've a proper state update flow const ERROR_TYPES = Object.freeze({ @@ -81,6 +83,9 @@ export function onComponentOptionChanged(_ref, component, option_name, value) { export function fetchOAuthToken(authUrl, dataSourceId) { localStorage.setItem('sourceWaitingForOAuth', dataSourceId); + const currentSessionValue = authenticationService.currentSessionValue; + currentSessionValue?.current_organization_id && + setCookie('orgIdForOauth', currentSessionValue?.current_organization_id); window.open(authUrl); } @@ -806,8 +811,12 @@ export function previewQuery(_ref, query, editorState, calledFromQuery = false) if (query.kind === 'runjs') { queryExecutionPromise = executeMultilineJS(_ref, query.options.code, editorState, query?.id, true); } else if (query.kind === 'tooljetdb') { - const { organization_id } = JSON.parse(localStorage.getItem('currentUser')); - queryExecutionPromise = tooljetDbOperations.perform(query.options, organization_id, _ref.state.currentState); + const currentSessionValue = authenticationService.currentSessionValue; + queryExecutionPromise = tooljetDbOperations.perform( + query.options, + currentSessionValue?.current_organization_id, + _ref.state.currentState + ); } else if (query.kind === 'runpy') { queryExecutionPromise = executeRunPycode(_ref, query.options.code, query, editorState, true, 'edit'); } else { @@ -931,8 +940,12 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode = } else if (query.kind === 'runpy') { queryExecutionPromise = executeRunPycode(_self, query.options.code, query, _ref, false, mode); } else if (query.kind === 'tooljetdb') { - const { organization_id } = JSON.parse(localStorage.getItem('currentUser')); - queryExecutionPromise = tooljetDbOperations.perform(query.options, organization_id, _self.state.currentState); + const currentSessionValue = authenticationService.currentSessionValue; + queryExecutionPromise = tooljetDbOperations.perform( + query.options, + currentSessionValue?.current_organization_id, + _self.state.currentState + ); } else { queryExecutionPromise = dataqueryService.run(queryId, options); } diff --git a/frontend/src/_helpers/auth-header.js b/frontend/src/_helpers/auth-header.js index acb61f169a..498adf4ae0 100644 --- a/frontend/src/_helpers/auth-header.js +++ b/frontend/src/_helpers/auth-header.js @@ -1,15 +1,26 @@ import { authenticationService } from '@/_services'; +import { handleUnSubscription } from './utils'; -export function authHeader() { +export function authHeader(isMultipartData = false, current_organization_id) { // return authorization header with jwt token - const currentUser = authenticationService.currentUserValue; - if (currentUser && currentUser.auth_token) { - return { - Authorization: `Bearer ${currentUser.auth_token}`, - 'Content-Type': 'application/json', - }; + let session = authenticationService.currentSessionValue; + + let subsciption; + if (!subsciption || (subsciption?.isClosed && subsciption?.isStopped)) { + subsciption = authenticationService.currentSession.subscribe((newSession) => { + session = newSession; + }); + handleUnSubscription(subsciption); } + + const wid = current_organization_id || session.current_organization_id; + return { - 'Content-Type': 'application/json', + ...(!isMultipartData && { + 'Content-Type': 'application/json', + }), + ...(wid && { + 'tj-workspace-id': wid, + }), }; } diff --git a/frontend/src/_helpers/http-client.js b/frontend/src/_helpers/http-client.js index df23509bfc..f12ed47b06 100644 --- a/frontend/src/_helpers/http-client.js +++ b/frontend/src/_helpers/http-client.js @@ -2,6 +2,7 @@ import config from 'config'; import { authenticationService } from '@/_services'; import urlJoin from 'url-join'; import { isEmpty } from 'lodash'; +import { handleUnSubscription } from '@/_helpers/utils'; const HttpVerb = { Get: 'GET', @@ -34,11 +35,19 @@ class HttpClient { const options = { method, headers: this.headers, + credentials: 'include', }; - const user = JSON.parse(localStorage.getItem('currentUser')) || {}; - if (user?.auth_token) { - options.headers['Authorization'] = `Bearer ${user?.auth_token}`; + let session = authenticationService.currentSessionValue; + + let subsciption; + if (!subsciption || (subsciption?.isClosed && subsciption?.isStopped)) { + subsciption = authenticationService.currentSession.subscribe((newSession) => { + session = newSession; + }); + handleUnSubscription(subsciption); } + + options.headers['tj-workspace-id'] = session?.current_organization_id; if (data) { options.body = JSON.stringify(data); } diff --git a/frontend/src/_helpers/routes.js b/frontend/src/_helpers/routes.js new file mode 100644 index 0000000000..189335388f --- /dev/null +++ b/frontend/src/_helpers/routes.js @@ -0,0 +1,32 @@ +import { getWorkspaceIdFromURL } from '@/_helpers/utils'; +import { authenticationService } from '@/_services/authentication.service'; + +export const getPrivateRoute = (page, params = {}) => { + const routes = { + dashboard: '/', + editor: '/apps/:id/:pageHandle?', + preview: '/applications/:id/versions/:versionId/:pageHandle?', + launch: '/applications/:slug/:pageHandle?', + workspace_settings: '/workspace-settings', + settings: '/settings', + database: '/database', + integrations: '/integrations', + global_datasources: '/global-datasources', + }; + + let url = routes[page]; + const urlParams = url.split('/').map((path) => { + if (path.startsWith(':')) { + return params[path.substring(1)]; + } + return path; + }); + url = urlParams.join('/'); + + return appendWorkspaceId(url.replace(/\/$/, '')); +}; + +const appendWorkspaceId = (url) => { + const workspaceId = getWorkspaceIdFromURL() || authenticationService.currentSessionValue?.current_organization_id; + return `/${workspaceId}${url}`; +}; diff --git a/frontend/src/_helpers/utils.js b/frontend/src/_helpers/utils.js index 6301a4d7a8..11036e971e 100644 --- a/frontend/src/_helpers/utils.js +++ b/frontend/src/_helpers/utils.js @@ -5,6 +5,7 @@ import axios from 'axios'; import JSON5 from 'json5'; import { previewQuery, executeAction } from '@/_helpers/appUtils'; import { toast } from 'react-hot-toast'; +import { authenticationService } from '@/_services/authentication.service'; export function findProp(obj, prop, defval) { if (typeof defval === 'undefined') defval = null; @@ -667,6 +668,95 @@ export const getuserName = (formData) => { return ''; }; +export const pathnameWithoutSubpath = (path) => { + const subpath = getSubpath(); + if (subpath) return path.replace(subpath, ''); + return path; +}; + +// will replace or append workspace-id in a path +export const appendWorkspaceId = (workspaceId, path, replaceId = false) => { + const subpath = getSubpath(); + path = pathnameWithoutSubpath(path); + + let newPath = path; + if (path === '/:workspaceId' || path.split('/').length === 2) { + newPath = `/${workspaceId}`; + } else { + const paths = path.split('/').filter((path) => path !== ''); + if (replaceId) { + paths[0] = workspaceId; + } else { + paths.unshift(workspaceId); + } + newPath = `/${paths.join('/')}`; + } + return subpath ? `${subpath}${newPath}` : newPath; +}; + +export const getWorkspaceIdFromURL = () => { + const pathname = window.location.pathname; + const pathnameArray = pathname.split('/').filter((path) => path !== ''); + const subpath = window?.public_config?.SUB_PATH; + const subpathArray = subpath ? subpath.split('/').filter((path) => path != '') : []; + const existedPaths = [ + 'forgot-password', + 'switch-workspace', + 'reset-password', + 'invitations', + 'organization-invitations', + 'sso', + 'setup', + 'confirm', + ':workspaceId', + 'confirm-invite', + 'oauth2', + 'applications', + 'integrations', + ]; + + if (pathname.includes('login')) { + return subpath ? pathnameArray[subpathArray.length + 1] : pathnameArray[1]; + } + + const workspaceId = subpath ? pathnameArray[subpathArray.length] : pathnameArray[0]; + return !existedPaths.includes(workspaceId) ? workspaceId : ''; +}; + +export const getWorkspaceId = () => + getWorkspaceIdFromURL() || authenticationService.currentSessionValue?.current_organization_id; + +export const excludeWorkspaceIdFromURL = (pathname) => { + if (!pathname.includes('/applications/')) { + const paths = pathname?.split('/').filter((path) => path !== ''); + paths.shift(); + const newPath = paths.join('/'); + return newPath ? `/${newPath}` : '/'; + } + return pathname; +}; + +export const handleUnSubscription = (subsciption) => { + setTimeout(() => { + subsciption.unsubscribe(); + }, 5000); +}; + +export const getAvatar = (organization) => { + if (!organization) return; + + const orgName = organization.split(' ').filter((e) => e && !!e.trim()); + if (orgName.length > 1) { + return `${orgName[0]?.[0]}${orgName[1]?.[0]}`; + } else if (organization.length >= 2) { + return `${organization[0]}${organization[1]}`; + } else { + return `${organization[0]}${organization[0]}`; + } +}; + +export const getSubpath = () => + window?.public_config?.SUB_PATH ? stripTrailingSlash(window?.public_config?.SUB_PATH) : null; export function isExpectedDataType(data, expectedDataType) { function getCurrentDataType(node) { return Object.prototype.toString.call(node).slice(8, -1).toLowerCase(); diff --git a/frontend/src/_helpers/websocketConnection.js b/frontend/src/_helpers/websocketConnection.js index 5b252c11be..d623b55e34 100644 --- a/frontend/src/_helpers/websocketConnection.js +++ b/frontend/src/_helpers/websocketConnection.js @@ -25,12 +25,11 @@ class WebSocketConnection { // Connection opened this.socket.addEventListener('open', (event) => { console.log('connection established', event); - const currentUser = JSON.parse(localStorage.getItem('currentUser')); + //TODO: verify if the socket functionality is working or not this.socket.send( JSON.stringify({ event: 'authenticate', - data: currentUser.auth_token, }) ); diff --git a/frontend/src/_services/app.service.js b/frontend/src/_services/app.service.js index bbed0dd698..4d980262a2 100644 --- a/frontend/src/_services/app.service.js +++ b/frontend/src/_services/app.service.js @@ -25,12 +25,12 @@ export const appService = { }; function getConfig() { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/config`, requestOptions).then(handleResponse); } function getAll(page, folder, searchKey) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; if (page === 0) return fetch(`${config.apiUrl}/apps`, requestOptions).then(handleResponse); else return fetch( @@ -40,66 +40,76 @@ function getAll(page, folder, searchKey) { } function createApp(body = {}) { - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/apps`, requestOptions).then(handleResponse); } function cloneApp(id) { - const requestOptions = { method: 'POST', headers: authHeader() }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/apps/${id}/clone`, requestOptions).then(handleResponse); } function exportApp(id, versionId) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/apps/${id}/export${versionId ? `?versionId=${versionId}` : ''}`, requestOptions).then( handleResponse ); } function getVersions(id) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/apps/${id}/versions`, requestOptions).then(handleResponse); } function importApp(body) { - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/apps/import`, requestOptions).then(handleResponse); } function changeIcon(icon, appId) { - const requestOptions = { method: 'PUT', headers: authHeader(), body: JSON.stringify({ icon }) }; + const requestOptions = { + method: 'PUT', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify({ icon }), + }; return fetch(`${config.apiUrl}/apps/${appId}/icons`, requestOptions).then(handleResponse); } function getApp(id, accessType) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/apps/${id}${accessType ? `?access_type=${accessType}` : ''}`, requestOptions).then( handleResponse ); } function deleteApp(id) { - const requestOptions = { method: 'DELETE', headers: authHeader() }; + const requestOptions = { method: 'DELETE', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/apps/${id}`, requestOptions).then(handleResponse); } function getAppBySlug(slug) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/apps/slugs/${slug}`, requestOptions).then(handleResponse); } function getAppByVersion(appId, versionId) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/apps/${appId}/versions/${versionId}`, requestOptions).then(handleResponse); } function saveApp(id, attributes) { - const requestOptions = { method: 'PUT', headers: authHeader(), body: JSON.stringify({ app: attributes }) }; + const requestOptions = { + method: 'PUT', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify({ app: attributes }), + }; return fetch(`${config.apiUrl}/apps/${id}`, requestOptions).then(handleResponse); } function getAppUsers(id) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/apps/${id}/users`, requestOptions).then(handleResponse); } @@ -110,7 +120,7 @@ function createAppUser(app_id, org_user_id, role) { role, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/app_users`, requestOptions).then(handleResponse); } @@ -118,6 +128,7 @@ function setVisibility(appId, visibility) { const requestOptions = { method: 'PUT', headers: authHeader(), + credentials: 'include', body: JSON.stringify({ app: { is_public: visibility } }), }; return fetch(`${config.apiUrl}/apps/${appId}`, requestOptions).then(handleResponse); @@ -127,13 +138,19 @@ function setMaintenance(appId, value) { const requestOptions = { method: 'PUT', headers: authHeader(), + credentials: 'include', body: JSON.stringify({ app: { is_maintenance_on: value } }), }; return fetch(`${config.apiUrl}/apps/${appId}`, requestOptions).then(handleResponse); } function setSlug(appId, slug) { - const requestOptions = { method: 'PUT', headers: authHeader(), body: JSON.stringify({ app: { slug: slug } }) }; + const requestOptions = { + method: 'PUT', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify({ app: { slug: slug } }), + }; return fetch(`${config.apiUrl}/apps/${appId}`, requestOptions).then(handleResponse); } @@ -148,7 +165,7 @@ function setPasswordFromToken({ token, password, organization, role, firstName, last_name: lastName, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/set-password-from-token`, requestOptions).then(handleResponse); } @@ -158,6 +175,6 @@ function acceptInvite({ token, password }) { password, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/accept-invite`, requestOptions); } diff --git a/frontend/src/_services/appVersion.service.js b/frontend/src/_services/appVersion.service.js index 63feddd90f..af4f6285e9 100644 --- a/frontend/src/_services/appVersion.service.js +++ b/frontend/src/_services/appVersion.service.js @@ -10,12 +10,12 @@ export const appVersionService = { }; function getAll(appId) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/apps/${appId}/versions`, requestOptions).then(handleResponse); } function getOne(appId, versionId) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/apps/${appId}/versions/${versionId}`, requestOptions).then(handleResponse); } @@ -28,6 +28,7 @@ function create(appId, versionName, versionFromId) { const requestOptions = { method: 'POST', headers: authHeader(), + credentials: 'include', body: JSON.stringify(body), }; return fetch(`${config.apiUrl}/apps/${appId}/versions`, requestOptions).then(handleResponse); @@ -37,6 +38,7 @@ function del(appId, versionId) { const requestOptions = { method: 'DELETE', headers: authHeader(), + credentials: 'include', }; return fetch(`${config.apiUrl}/apps/${appId}/versions/${versionId}`, requestOptions).then(handleResponse); } @@ -49,6 +51,7 @@ function save(appId, versionId, values) { const requestOptions = { method: 'PUT', headers: authHeader(), + credentials: 'include', body: JSON.stringify(body), }; return fetch(`${config.apiUrl}/apps/${appId}/versions/${versionId}`, requestOptions).then(handleResponse); diff --git a/frontend/src/_services/authentication.service.js b/frontend/src/_services/authentication.service.js index b733414ba9..4002f9eac0 100644 --- a/frontend/src/_services/authentication.service.js +++ b/frontend/src/_services/authentication.service.js @@ -1,24 +1,43 @@ import { BehaviorSubject } from 'rxjs'; -import { handleResponse, setCookie, getCookie, eraseCookie, handleResponseWithoutValidation } from '@/_helpers'; +import { + handleResponse, + setCookie, + getCookie, + eraseCookie, + handleResponseWithoutValidation, + authHeader, +} from '@/_helpers'; +import { excludeWorkspaceIdFromURL } from '@/_helpers/utils'; import config from 'config'; -const currentUserSubject = new BehaviorSubject(JSON.parse(localStorage.getItem('currentUser'))); +const currentSessionSubject = new BehaviorSubject({ + current_organization_id: null, + current_organization_name: null, + super_admin: null, + admin: null, + group_permissions: null, + app_group_permissions: null, + organizations: [], + authentication_status: null, + authentication_failed: null, + isUserUpdated: false, +}); export const authenticationService = { login, getOrganizationConfigs, logout, - clearUser, signup, verifyToken, verifyOrganizationToken, - updateCurrentUserDetails, onboarding, - updateUser, setupAdmin, - currentUser: currentUserSubject.asObservable(), - get currentUserValue() { - return currentUserSubject.value; + currentSession: currentSessionSubject.asObservable(), + get currentSessionValue() { + return currentSessionSubject.value; + }, + updateCurrentSession(data) { + currentSessionSubject.next(data); }, signInViaOAuth, resetPassword, @@ -27,24 +46,42 @@ export const authenticationService = { deleteLoginOrganizationId, forgotPassword, resendInvite, + authorize, + validateSession, + getUserDetails, }; function login(email, password, organizationId) { const requestOptions = { method: 'POST', - headers: { 'Content-Type': 'application/json' }, + headers: authHeader(), body: JSON.stringify({ email, password }), + credentials: 'include', }; return fetch(`${config.apiUrl}/authenticate${organizationId ? `/${organizationId}` : ''}`, requestOptions) .then(handleResponseWithoutValidation) .then((user) => { - // store user details and jwt token in local storage to keep user logged in between page refreshes - updateUser(user); + authenticationService.updateCurrentSession(user); return user; }); } +function validateSession(appId) { + const requestOptions = { + method: 'GET', + credentials: 'include', + }; + return fetch(`${config.apiUrl}/session${appId ? `?appId=${appId}` : ''}`, requestOptions).then( + handleResponseWithoutValidation + ); +} + +function getUserDetails() { + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; + return fetch(`${config.apiUrl}/profile`, requestOptions).then(handleResponse); +} + function saveLoginOrganizationId(organizationId) { organizationId && setCookie('login-workspace', organizationId); } @@ -71,12 +108,6 @@ function getOrganizationConfigs(organizationId) { .then((configs) => configs?.sso_configs); } -function updateCurrentUserDetails(details) { - const currentUserDetails = JSON.parse(localStorage.getItem('currentUser')); - const updatedUserDetails = Object.assign({}, currentUserDetails, details); - updateUser(updatedUserDetails); -} - function signup(email, name, password) { const requestOptions = { method: 'POST', @@ -107,6 +138,7 @@ function onboarding({ companyName, companySize, role, token, organizationToken, const requestOptions = { method: 'POST', headers: { 'Content-Type': 'application/json' }, + credentials: 'include', body: JSON.stringify({ ...(companyName?.length > 0 && { companyName }), ...(companySize?.length > 0 && { companySize }), @@ -129,6 +161,7 @@ function setupAdmin({ companyName, companySize, name, role, workspace, password, const requestOptions = { method: 'POST', headers: { 'Content-Type': 'application/json' }, + credentials: 'include', body: JSON.stringify({ companyName, companySize, @@ -198,25 +231,40 @@ function resetPassword(params) { } function logout() { - clearUser(); - const loginPath = (window.public_config?.SUB_PATH || '/') + 'login'; - const pathname = window.public_config?.SUB_PATH - ? window.location.pathname.replace(window.public_config?.SUB_PATH, '') - : window.location.pathname; - window.location.href = loginPath + `?redirectTo=${!(pathname.indexOf('/') === 0) ? '/' : ''}${pathname}`; -} + const requestOptions = { + method: 'GET', + headers: authHeader(), + credentials: 'include', + }; -function clearUser() { - // remove user from local storage to log user out - localStorage.removeItem('currentUser'); - currentUserSubject.next(null); + return fetch(`${config.apiUrl}/logout`, requestOptions) + .then(handleResponseWithoutValidation) + .then(() => { + const loginPath = (window.public_config?.SUB_PATH || '/') + 'login'; + const pathname = window.public_config?.SUB_PATH + ? window.location.pathname.replace(window.public_config?.SUB_PATH, '') + : window.location.pathname; + window.location.href = + loginPath + + `?redirectTo=${ + !pathname.includes('integrations') + ? excludeWorkspaceIdFromURL(pathname) + : `${pathname.indexOf('/') === 0 ? '' : '/'}${pathname}` + }`; + }) + .catch(() => { + authenticationService.updateCurrentSession({ + authentication_status: false, + }); + }); } function signInViaOAuth(configId, ssoType, ssoResponse) { const organizationId = getLoginOrganizationId(); const requestOptions = { method: 'POST', - headers: { 'Content-Type': 'application/json' }, + headers: authHeader(), + credentials: 'include', body: JSON.stringify({ ...ssoResponse, organizationId }), }; @@ -226,12 +274,17 @@ function signInViaOAuth(configId, ssoType, ssoResponse) { .then(handleResponseWithoutValidation) .then((user) => { if (!user.redirect_url) { - updateUser(user); + authenticationService.updateCurrentSession(user); } return user; }); } -function updateUser(user) { - localStorage.setItem('currentUser', JSON.stringify(user)); - currentUserSubject.next(user); + +function authorize() { + const requestOptions = { + method: 'GET', + headers: authHeader(), + credentials: 'include', + }; + return fetch(`${config.apiUrl}/authorize`, requestOptions).then(handleResponseWithoutValidation); } diff --git a/frontend/src/_services/dataquery.service.js b/frontend/src/_services/dataquery.service.js index b63fcf01fc..ee03fb9d66 100644 --- a/frontend/src/_services/dataquery.service.js +++ b/frontend/src/_services/dataquery.service.js @@ -12,7 +12,7 @@ export const dataqueryService = { }; function getAll(appVersionId) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; let searchParams = new URLSearchParams(`app_version_id=${appVersionId}`); return fetch(`${config.apiUrl}/data_queries?` + searchParams, requestOptions).then(handleResponse); } @@ -28,7 +28,7 @@ function create(app_id, app_version_id, name, kind, options, data_source_id, plu plugin_id, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/data_queries`, requestOptions).then(handleResponse); } @@ -38,12 +38,12 @@ function update(id, name, options) { name, }; - const requestOptions = { method: 'PATCH', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'PATCH', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/data_queries/${id}`, requestOptions).then(handleResponse); } function del(id) { - const requestOptions = { method: 'DELETE', headers: authHeader() }; + const requestOptions = { method: 'DELETE', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/data_queries/${id}`, requestOptions).then(handleResponse); } @@ -52,7 +52,7 @@ function run(queryId, options) { options: options, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/data_queries/${queryId}/run`, requestOptions).then(handleResponse); } @@ -63,7 +63,7 @@ function preview(query, options, versionId) { app_version_id: versionId, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/data_queries/preview`, requestOptions).then(handleResponse); } diff --git a/frontend/src/_services/datasource.service.js b/frontend/src/_services/datasource.service.js index 7c0180c9ce..3d1a9af07a 100644 --- a/frontend/src/_services/datasource.service.js +++ b/frontend/src/_services/datasource.service.js @@ -12,7 +12,7 @@ export const datasourceService = { }; function getAll(appVersionId) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; let searchParams = new URLSearchParams(`app_version_id=${appVersionId}`); return fetch(`${config.apiUrl}/data_sources?` + searchParams, requestOptions).then(handleResponse); } @@ -27,7 +27,7 @@ function create(plugin_id, name, kind, options, app_id, app_version_id) { app_version_id, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/data_sources`, requestOptions).then(handleResponse); } @@ -38,12 +38,12 @@ function save(id, name, options, app_id) { app_id, }; - const requestOptions = { method: 'PUT', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'PUT', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/data_sources/${id}`, requestOptions).then(handleResponse); } function deleteDataSource(id) { - const requestOptions = { method: 'DELETE', headers: authHeader() }; + const requestOptions = { method: 'DELETE', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/data_sources/${id}`, requestOptions).then(handleResponse); } @@ -54,16 +54,26 @@ function test(kind, options, plugin_id) { plugin_id, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/data_sources/test_connection`, requestOptions).then(handleResponse); } -function setOauth2Token(dataSourceId, body) { - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; +function setOauth2Token(dataSourceId, body, current_organization_id) { + const requestOptions = { + method: 'POST', + headers: authHeader(false, current_organization_id), + credentials: 'include', + body: JSON.stringify(body), + }; return fetch(`${config.apiUrl}/data_sources/${dataSourceId}/authorize_oauth2`, requestOptions).then(handleResponse); } function fetchOauth2BaseUrl(provider) { - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify({ provider }) }; + const requestOptions = { + method: 'POST', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify({ provider }), + }; return fetch(`${config.apiUrl}/data_sources/fetch_oauth2_base_url`, requestOptions).then(handleResponse); } diff --git a/frontend/src/_services/folder.service.js b/frontend/src/_services/folder.service.js index 0d2e177e85..e27d228562 100644 --- a/frontend/src/_services/folder.service.js +++ b/frontend/src/_services/folder.service.js @@ -11,7 +11,7 @@ export const folderService = { }; function getAll(searchKey = '') { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/folders?searchKey=${searchKey}`, requestOptions).then(handleResponse); } @@ -23,6 +23,7 @@ function create(name) { const requestOptions = { method: 'POST', headers: authHeader(), + credentials: 'include', body: JSON.stringify(body), }; return fetch(`${config.apiUrl}/folders`, requestOptions).then(handleResponse); @@ -36,6 +37,7 @@ function updateFolder(name, id) { const requestOptions = { method: 'PUT', headers: authHeader(), + credentials: 'include', body: JSON.stringify(body), }; return fetch(`${config.apiUrl}/folders/${id}`, requestOptions).then(handleResponse); @@ -45,6 +47,7 @@ function deleteFolder(id) { const requestOptions = { method: 'DELETE', headers: authHeader(), + credentials: 'include', }; return fetch(`${config.apiUrl}/folders/${id}`, requestOptions).then(handleResponse); } @@ -58,6 +61,7 @@ function addToFolder(appId, folderId) { const requestOptions = { method: 'POST', headers: authHeader(), + credentials: 'include', body: JSON.stringify(body), }; return fetch(`${config.apiUrl}/folder_apps`, requestOptions).then(handleResponse); @@ -71,6 +75,7 @@ function removeAppFromFolder(appId, folderId) { const requestOptions = { method: 'PUT', headers: authHeader(), + credentials: 'include', body: JSON.stringify(body), }; return fetch(`${config.apiUrl}/folder_apps/${folderId}`, requestOptions).then(handleResponse); diff --git a/frontend/src/_services/globalDatasource.service.js b/frontend/src/_services/globalDatasource.service.js index 0e83e8b72a..85da897495 100644 --- a/frontend/src/_services/globalDatasource.service.js +++ b/frontend/src/_services/globalDatasource.service.js @@ -10,7 +10,7 @@ export const globalDatasourceService = { }; function getAll(organizationId) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; let searchParams = new URLSearchParams(`organization_id=${organizationId}`); return fetch(`${config.apiUrl}/v2/data_sources?` + searchParams, requestOptions).then(handleResponse); } @@ -24,7 +24,7 @@ function create(plugin_id, name, kind, options, app_id, app_version_id, scope) { scope, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body), credentials: 'include' }; return fetch(`${config.apiUrl}/v2/data_sources`, requestOptions).then(handleResponse); } @@ -34,16 +34,16 @@ function save(id, name, options) { options, }; - const requestOptions = { method: 'PUT', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'PUT', headers: authHeader(), body: JSON.stringify(body), credentials: 'include' }; return fetch(`${config.apiUrl}/v2/data_sources/${id}`, requestOptions).then(handleResponse); } function deleteDataSource(id) { - const requestOptions = { method: 'DELETE', headers: authHeader() }; + const requestOptions = { method: 'DELETE', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/v2/data_sources/${id}`, requestOptions).then(handleResponse); } function convertToGlobal(id) { - const requestOptions = { method: 'POST', headers: authHeader() }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/v2/data_sources/${id}/scope`, requestOptions).then(handleResponse); } diff --git a/frontend/src/_services/groupPermission.service.js b/frontend/src/_services/groupPermission.service.js index 1575c1efe3..c67091ca59 100644 --- a/frontend/src/_services/groupPermission.service.js +++ b/frontend/src/_services/groupPermission.service.js @@ -22,6 +22,7 @@ function create(group) { const requestOptions = { method: 'POST', headers: authHeader(), + credentials: 'include', body: JSON.stringify(body), }; return fetch(`${config.apiUrl}/group_permissions`, requestOptions).then(handleResponse); @@ -31,6 +32,7 @@ function update(groupPermissionId, body) { const requestOptions = { method: 'PUT', headers: authHeader(), + credentials: 'include', body: JSON.stringify(body), }; return fetch(`${config.apiUrl}/group_permissions/${groupPermissionId}`, requestOptions).then(handleResponse); @@ -40,6 +42,7 @@ function del(groupPermissionId) { const requestOptions = { method: 'DELETE', headers: authHeader(), + credentials: 'include', }; return fetch(`${config.apiUrl}/group_permissions/${groupPermissionId}`, requestOptions).then(handleResponse); } @@ -48,6 +51,7 @@ function getGroup(groupPermissionId) { const requestOptions = { method: 'GET', headers: authHeader(), + credentials: 'include', }; return fetch(`${config.apiUrl}/group_permissions/${groupPermissionId}`, requestOptions).then(handleResponse); } @@ -56,6 +60,7 @@ function getGroups() { const requestOptions = { method: 'GET', headers: authHeader(), + credentials: 'include', }; return fetch(`${config.apiUrl}/group_permissions`, requestOptions).then(handleResponse); } @@ -64,6 +69,7 @@ function getAppsInGroup(groupPermissionId) { const requestOptions = { method: 'GET', headers: authHeader(), + credentials: 'include', }; return fetch(`${config.apiUrl}/group_permissions/${groupPermissionId}/apps`, requestOptions).then(handleResponse); } @@ -72,6 +78,7 @@ function getAppsNotInGroup(groupPermissionId) { const requestOptions = { method: 'GET', headers: authHeader(), + credentials: 'include', }; return fetch(`${config.apiUrl}/group_permissions/${groupPermissionId}/addable_apps`, requestOptions).then( handleResponse @@ -82,6 +89,7 @@ function getUsersInGroup(groupPermissionId) { const requestOptions = { method: 'GET', headers: authHeader(), + credentials: 'include', }; return fetch(`${config.apiUrl}/group_permissions/${groupPermissionId}/users`, requestOptions).then(handleResponse); } @@ -90,6 +98,7 @@ function getUsersNotInGroup(searchInput, groupPermissionId) { const requestOptions = { method: 'GET', headers: authHeader(), + credentials: 'include', }; return fetch( `${config.apiUrl}/group_permissions/${groupPermissionId}/addable_users?input=${searchInput}`, @@ -105,6 +114,7 @@ function updateAppGroupPermission(groupPermissionId, appGroupPermissionId, actio const requestOptions = { method: 'PUT', headers: authHeader(), + credentials: 'include', body: JSON.stringify(body), }; return fetch( diff --git a/frontend/src/_services/library-app.service.js b/frontend/src/_services/library-app.service.js index 16ca8108ac..799e9cca92 100644 --- a/frontend/src/_services/library-app.service.js +++ b/frontend/src/_services/library-app.service.js @@ -11,11 +11,11 @@ function deploy(identifier) { identifier, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/library_apps/`, requestOptions).then(handleResponse); } function templateManifests() { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/library_apps/`, requestOptions).then(handleResponse); } diff --git a/frontend/src/_services/org_environment_variable.service.js b/frontend/src/_services/org_environment_variable.service.js index e01b63fd5b..6949a3fc06 100644 --- a/frontend/src/_services/org_environment_variable.service.js +++ b/frontend/src/_services/org_environment_variable.service.js @@ -10,7 +10,7 @@ export const orgEnvironmentVariableService = { }; function getVariables() { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/organization-variables`, requestOptions).then(handleResponse); } @@ -27,7 +27,7 @@ function create(variable_name, value, variable_type, encrypted) { encrypted, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/organization-variables`, requestOptions).then(handleResponse); } @@ -37,11 +37,11 @@ function update(id, variable_name, value) { value, }; - const requestOptions = { method: 'PATCH', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'PATCH', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/organization-variables/${id}`, requestOptions).then(handleResponse); } function deleteVariable(id) { - const requestOptions = { method: 'DELETE', headers: authHeader() }; + const requestOptions = { method: 'DELETE', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/organization-variables/${id}`, requestOptions).then(handleResponse); } diff --git a/frontend/src/_services/organization.service.js b/frontend/src/_services/organization.service.js index 4b37595b65..05c89c117b 100644 --- a/frontend/src/_services/organization.service.js +++ b/frontend/src/_services/organization.service.js @@ -14,7 +14,7 @@ export const organizationService = { }; function getUsers(page, options) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; const { firstName, lastName, email, status } = options; const query = queryString.stringify({ page, firstName, lastName, email, status }); @@ -22,38 +22,53 @@ function getUsers(page, options) { } function getUsersByValue(searchInput) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/organizations/users/suggest?input=${searchInput}`, requestOptions).then( handleResponse ); } function createOrganization(name) { - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify({ name }) }; + const requestOptions = { + method: 'POST', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify({ name }), + }; return fetch(`${config.apiUrl}/organizations`, requestOptions).then(handleResponse); } function editOrganization(params) { - const requestOptions = { method: 'PATCH', headers: authHeader(), body: JSON.stringify(params) }; + const requestOptions = { + method: 'PATCH', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify(params), + }; return fetch(`${config.apiUrl}/organizations/`, requestOptions).then(handleResponse); } function getOrganizations() { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/organizations`, requestOptions).then(handleResponse); } function switchOrganization(organizationId) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/switch/${organizationId}`, requestOptions).then(handleResponseWithoutValidation); } function getSSODetails() { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/organizations/configs`, requestOptions).then(handleResponse); } function editOrganizationConfigs(params) { - const requestOptions = { method: 'PATCH', headers: authHeader(), body: JSON.stringify(params) }; + const requestOptions = { + method: 'PATCH', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify(params), + }; return fetch(`${config.apiUrl}/organizations/configs`, requestOptions).then(handleResponse); } diff --git a/frontend/src/_services/organization_user.service.js b/frontend/src/_services/organization_user.service.js index f4a6af3d5d..be712240e0 100644 --- a/frontend/src/_services/organization_user.service.js +++ b/frontend/src/_services/organization_user.service.js @@ -16,12 +16,12 @@ function create(first_name, last_name, email) { email, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/organization_users`, requestOptions).then(handleResponse); } -function inviteBulkUsers(formData, token) { - const requestOptions = { method: 'POST', headers: { Authorization: `Bearer ${token}` }, body: formData }; +function inviteBulkUsers(formData) { + const requestOptions = { method: 'POST', headers: authHeader(true), body: formData, credentials: 'include' }; return fetch(`${config.apiUrl}/organization_users/upload_csv`, requestOptions).then(handleResponse); } @@ -31,16 +31,16 @@ function changeRole(id, role) { role, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/organization_users/${id}/change_role`, requestOptions).then(handleResponse); } function archive(id) { - const requestOptions = { method: 'POST', headers: authHeader() }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/organization_users/${id}/archive`, requestOptions).then(handleResponse); } function unarchive(id) { - const requestOptions = { method: 'POST', headers: authHeader() }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/organization_users/${id}/unarchive`, requestOptions).then(handleResponse); } diff --git a/frontend/src/_services/tooljet.service.js b/frontend/src/_services/tooljet.service.js index b1cd156a07..6a50cce24b 100644 --- a/frontend/src/_services/tooljet.service.js +++ b/frontend/src/_services/tooljet.service.js @@ -21,6 +21,7 @@ function skipVersion() { const requestOptions = { method: 'POST', headers: authHeader(), + credentials: 'include', }; return fetch(`${config.apiUrl}/metadata/skip_version`, requestOptions).then(handleResponse); @@ -30,6 +31,7 @@ function skipOnboarding() { const requestOptions = { method: 'POST', headers: authHeader(), + credentials: 'include', }; return fetch(`${config.apiUrl}/metadata/skip_onboarding`, requestOptions).then(handleResponse); @@ -39,6 +41,7 @@ function finishOnboarding(options) { const requestOptions = { method: 'POST', headers: authHeader(), + credentials: 'include', body: JSON.stringify({ ...options, }), diff --git a/frontend/src/_services/user.service.js b/frontend/src/_services/user.service.js index f5a029d93e..51237d8a9a 100644 --- a/frontend/src/_services/user.service.js +++ b/frontend/src/_services/user.service.js @@ -12,24 +12,23 @@ export const userService = { }; function getAll() { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/users`, requestOptions).then(handleResponse); } function getAvatar(id) { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/files/${id}`, requestOptions) .then((response) => response.blob()) .then((blob) => blob); } -function updateAvatar(formData, token) { +function updateAvatar(formData) { const requestOptions = { method: 'POST', - headers: { - Authorization: `Bearer ${token}`, - }, + headers: authHeader(true), body: formData, + credentials: 'include', }; return fetch(`${config.apiUrl}/users/avatar`, requestOptions).then(handleResponse); } @@ -42,23 +41,23 @@ function createUser(first_name, last_name, email, role) { role, }; - const requestOptions = { method: 'POST', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/users`, requestOptions).then(handleResponse); } function deleteUser(id) { - const requestOptions = { method: 'DELETE', headers: authHeader(), body: JSON.stringify({}) }; + const requestOptions = { method: 'DELETE', headers: authHeader(), credentials: 'include', body: JSON.stringify({}) }; return fetch(`${config.apiUrl}/users/${id}`, requestOptions).then(handleResponse); } function updateCurrentUser(firstName, lastName) { const body = { first_name: firstName, last_name: lastName }; - const requestOptions = { method: 'PATCH', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'PATCH', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/users/update`, requestOptions).then(handleResponse); } function changePassword(currentPassword, newPassword) { const body = { currentPassword, newPassword }; - const requestOptions = { method: 'PATCH', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'PATCH', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; return fetch(`${config.apiUrl}/users/change_password`, requestOptions).then(handleResponse); } diff --git a/frontend/src/_styles/theme.scss b/frontend/src/_styles/theme.scss index 5faf788bbd..15ecda0afd 100644 --- a/frontend/src/_styles/theme.scss +++ b/frontend/src/_styles/theme.scss @@ -5,11 +5,12 @@ @import "./queryManager.scss"; @import "./onboarding.scss"; @import "./components.scss"; +@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,400;1,500;1,600;1,700&display=swap'); + @import "./global-datasources.scss"; @import "./typography.scss"; @import "./designtheme.scss"; -@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,400;1,500;1,600;1,700&display=swap'); // variables $border-radius: 4px; @@ -7467,6 +7468,174 @@ tbody { } } +@keyframes up-and-down { + to{ + opacity: 0.2; + transform: translateY(-20px); + + } +} + +.spin-loader { + position: fixed; + width: 100%; + + .load{ + display: flex; + justify-content: center; + margin: 200px auto; + } + + .load div{ + width: 20px; + height: 20px; + background-color: #3E63DD; + border-radius: 50%; + margin: 0 5px; + animation-name: #{up-and-down}; + animation-duration: 0.8s; + animation-iteration-count: infinite; + animation-direction: alternate; + } + + .load .two{ + animation-delay: 0.3s; + } + + .load .three{ + animation-delay: 0.6s; + } +} + +.organization-switch-modal { + font-family: 'IBM Plex Sans'; + + .modal-dialog{ + width: 376px; + } + + .modal-content{ + background: linear-gradient(0deg, #FFFFFF, #FFFFFF), + linear-gradient(0deg, #DFE3E6, #DFE3E6); + } + + .modal-header { + justify-content: center !important; + flex-direction: column; + padding: 40px 32px 20px 32px; + + .header-text { + font-style: normal; + font-weight: 600; + font-size: 20px; + line-height: 36px; + margin: 24px 0 5px 0; + } + + p { + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 20px; + color:#687076; + text-align: Center; + margin-bottom: 0px; + } + } + + .modal-body { + padding: 18px 32px; + + .org-list { + display: flex; + flex-direction: column; + + .org-item{ + height: 50px; + display: flex; + align-items: center; + padding: 0px 12px; + cursor: default; + + input[type=radio] { + margin-right: 16px; + width: 16px; + height: 16px; + } + + .avatar { + margin-right: 11px; + color: #11181C; + background-color: #F8FAFF; + width: 34px !important; + height: 34px !important; + } + + span { + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 20px; + color: #11181C; + } + } + + .selected-item { + border-radius: 6px; + background-color: #F0F4FF; + } + } + } + + .modal-footer { + justify-content: center; + padding: 24px 32px; + border-top: 1px solid #DFE3E6; + + button { + width: 100%; + font-style: normal; + font-weight: 600; + font-size: 14px; + line-height: 20px; + } + } +} + +.organization-switch-modal.dark-mode { + .modal-footer, + .modal-header { + border-color: #232e3c !important; + p { + color: rgba(255, 255, 255, 0.5) !important; + } + } + + .modal-body, + .modal-footer, + .modal-header, + .modal-content { + color: white; + background-color: #2b394a; + } + + .modal-content { + border: none; + } + + + .modal-body { + .org-list{ + span { + color: white; + } + + .selected-item { + background-color: #232e3c; + } + } + } +} .datasources-category { color: var(--slate10); } @@ -7569,5 +7738,5 @@ tbody { } .react-tel-input .country-list .country.highlight { color: #6b6b6b; -} + } } \ No newline at end of file diff --git a/frontend/src/_ui/Breadcrumbs/index.jsx b/frontend/src/_ui/Breadcrumbs/index.jsx index a5e63e3f43..4890587fdd 100644 --- a/frontend/src/_ui/Breadcrumbs/index.jsx +++ b/frontend/src/_ui/Breadcrumbs/index.jsx @@ -25,7 +25,7 @@ export const Breadcrumbs = () => { // define some custom breadcrumbs for certain routes (optional) const routes = [ - // { path: '/', breadcrumb: 'Apps' }, + { path: '/:worspace_id', breadcrumb: 'Apps' }, { path: '/database', breadcrumb: 'Tables', props: { dataCy: 'tables-page-header' } }, { path: '/workspace-settings', breadcrumb: 'Workspace settings' }, { path: '/global-datasources', breadcrumb: 'Global Datasources' }, diff --git a/frontend/src/_ui/Layout/index.jsx b/frontend/src/_ui/Layout/index.jsx index 6d0a3a5b11..01e050d73b 100644 --- a/frontend/src/_ui/Layout/index.jsx +++ b/frontend/src/_ui/Layout/index.jsx @@ -8,11 +8,14 @@ import Logo from '@assets/images/rocket.svg'; import Header from '../Header'; import { authenticationService } from '@/_services'; import config from 'config'; +import { getPrivateRoute } from '@/_helpers/routes'; function Layout({ children, switchDarkMode, darkMode }) { const router = useRouter(); - const { admin } = authenticationService.currentUserValue; + const currentUserValue = authenticationService.currentSessionValue; + const admin = currentUserValue?.admin; const marketplaceEnabled = config.ENABLE_MARKETPLACE_FEATURE === 'true'; + return (
@@ -21,7 +24,7 @@ function Layout({ children, switchDarkMode, darkMode }) { style={{ width: 48, borderRight: !darkMode ? '1px solid #eee' : 'inherit' }} >
- +
@@ -29,7 +32,7 @@ function Layout({ children, switchDarkMode, darkMode }) {
  • - + - + @@ -53,7 +69,7 @@ function Layout({ children, switchDarkMode, darkMode }) {
  • {window.public_config?.ENABLE_TOOLJET_DB == 'true' && admin && (
  • - + @@ -83,7 +99,7 @@ function Layout({ children, switchDarkMode, darkMode }) {
  • )}
  • - + @@ -122,7 +138,7 @@ function Layout({ children, switchDarkMode, darkMode }) {
  • {admin && (
  • - + diff --git a/server/ee/controllers/oauth.controller.ts b/server/ee/controllers/oauth.controller.ts index 07c51ed066..1302900549 100644 --- a/server/ee/controllers/oauth.controller.ts +++ b/server/ee/controllers/oauth.controller.ts @@ -1,21 +1,34 @@ -import { Body, Controller, Param, Post, UseGuards } from '@nestjs/common'; +import { Body, Controller, Param, Post, Res, UseGuards } from '@nestjs/common'; import { OauthService } from '../services/oauth/oauth.service'; -import { MultiOrganizationGuard } from 'src/modules/auth/multi-organization.guard'; +import { OrganizationAuthGuard } from 'src/modules/auth/organization-auth.guard'; +import { User } from 'src/decorators/user.decorator'; +import { Response } from 'express'; @Controller('oauth') export class OauthController { constructor(private oauthService: OauthService) {} + @UseGuards(OrganizationAuthGuard) @Post('sign-in/:configId') - async signIn(@Param('configId') configId, @Body() body) { - const result = await this.oauthService.signIn(body, configId); + async signIn( + @Param('configId') configId, + @Body() body, + @User() user, + @Res({ passthrough: true }) response: Response + ) { + const result = await this.oauthService.signIn(response, body, configId, null, user); return result; } - @UseGuards(MultiOrganizationGuard) + @UseGuards(OrganizationAuthGuard) @Post('sign-in/common/:ssoType') - async commonSignIn(@Param('ssoType') ssoType, @Body() body) { - const result = await this.oauthService.signIn(body, null, ssoType); + async commonSignIn( + @Param('ssoType') ssoType, + @Body() body, + @User() user, + @Res({ passthrough: true }) response: Response + ) { + const result = await this.oauthService.signIn(response, body, null, ssoType, user); return result; } } diff --git a/server/ee/services/oauth/oauth.service.ts b/server/ee/services/oauth/oauth.service.ts index 70236ceb1e..a169e9de7b 100644 --- a/server/ee/services/oauth/oauth.service.ts +++ b/server/ee/services/oauth/oauth.service.ts @@ -22,6 +22,7 @@ import { DeepPartial, EntityManager } from 'typeorm'; import { GitOAuthService } from './git_oauth.service'; import { GoogleOAuthService } from './google_oauth.service'; import UserResponse from './models/user_response'; +import { Response } from 'express'; @Injectable() export class OauthService { @@ -77,7 +78,7 @@ export class OauthService { throw new UnauthorizedException('User does not exist in the workspace'); } - if (!user && this.configService.get('DISABLE_MULTI_WORKSPACE') !== 'true') { + if (!user) { defaultOrganization = await this.organizationService.create('Untitled workspace', null, manager); } @@ -134,22 +135,28 @@ export class OauthService { }; } - async signIn(ssoResponse: SSOResponse, configId?: string, ssoType?: 'google' | 'git'): Promise { + async signIn( + response: Response, + ssoResponse: SSOResponse, + configId?: string, + ssoType?: 'google' | 'git', + user?: User + ): Promise { const { organizationId } = ssoResponse; let ssoConfigs: DeepPartial; let organization: DeepPartial; - const isSingleOrganization: boolean = this.configService.get('DISABLE_MULTI_WORKSPACE') === 'true'; const isInstanceSSOLogin = !!(!configId && ssoType && !organizationId); + const isInstanceSSOOrganizationLogin = !!(!configId && ssoType && organizationId); if (configId) { // SSO under an organization ssoConfigs = await this.organizationService.getConfigs(configId); organization = ssoConfigs?.organization; - } else if (!isSingleOrganization && ssoType && organizationId) { + } else if (isInstanceSSOOrganizationLogin) { // Instance SSO login from organization login page organization = await this.organizationService.fetchOrganizationDetails(organizationId, [true], false, true); ssoConfigs = organization?.ssoConfigs?.find((conf) => conf.sso === ssoType); - } else if (!isSingleOrganization && isInstanceSSOLogin) { + } else if (isInstanceSSOLogin) { // Instance SSO login from common login page ssoConfigs = this.#getInstanceSSOConfigs(ssoType); organization = ssoConfigs?.organization; @@ -157,6 +164,11 @@ export class OauthService { throw new UnauthorizedException(); } + if ((isInstanceSSOLogin || isInstanceSSOOrganizationLogin) && ssoConfigs?.id) { + // if instance sso login and sso configs returned stored in db, id will be present -> throwing error + throw new UnauthorizedException(); + } + if (!organization || !ssoConfigs) { // Should obtain organization configs throw new UnauthorizedException(); @@ -195,7 +207,7 @@ export class OauthService { let userDetails: User; let organizationDetails: DeepPartial; - if (!isSingleOrganization && isInstanceSSOLogin && !organizationId) { + if (isInstanceSSOLogin) { // Login from main login page - Multi-Workspace enabled userDetails = await this.usersService.findByEmail(userResponse.email); @@ -255,7 +267,7 @@ export class OauthService { throw new UnauthorizedException('User does not exist, please sign up'); } } else { - // single workspace or workspace login + // workspace login userDetails = await this.usersService.findByEmail(userResponse.email, organization.id, [ WORKSPACE_USER_STATUS.ACTIVE, WORKSPACE_USER_STATUS.INVITED, @@ -300,19 +312,11 @@ export class OauthService { (ou) => ou.organizationId === organization.id )?.invitationToken; - if (this.configService.get('DISABLE_MULTI_WORKSPACE') !== 'true') { - return decamelizeKeys({ - redirectUrl: `${this.configService.get('TOOLJET_HOST')}/invitations/${ - userDetails.invitationToken - }/workspaces/${organizationToken}?oid=${organization.id}&source=${URL_SSO_SOURCE}`, - }); - } else { - return decamelizeKeys({ - redirectUrl: `${this.configService.get( - 'TOOLJET_HOST' - )}/organization-invitations/${organizationToken}?oid=${organization.id}&source=${URL_SSO_SOURCE}`, - }); - } + return decamelizeKeys({ + redirectUrl: `${this.configService.get('TOOLJET_HOST')}/invitations/${ + userDetails.invitationToken + }/workspaces/${organizationToken}?oid=${organization.id}&source=${URL_SSO_SOURCE}`, + }); } } @@ -330,11 +334,12 @@ export class OauthService { }); } return await this.authService.generateLoginResultPayload( + response, userDetails, organizationDetails, - isInstanceSSOLogin, + isInstanceSSOLogin || isInstanceSSOOrganizationLogin, false, - manager + user ); }); } diff --git a/server/migrations/1678261179234-addUserSession.ts b/server/migrations/1678261179234-addUserSession.ts new file mode 100644 index 0000000000..c0c14cefeb --- /dev/null +++ b/server/migrations/1678261179234-addUserSession.ts @@ -0,0 +1,57 @@ +import { MigrationInterface, QueryRunner, Table, TableForeignKey } from 'typeorm'; + +export class addUserSession1678261179234 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.createTable( + new Table({ + name: 'user_sessions', + columns: [ + { + name: 'id', + type: 'uuid', + isGenerated: true, + default: 'gen_random_uuid()', + isPrimary: true, + }, + { + name: 'user_id', + type: 'uuid', + isNullable: false, + }, + { + name: 'device', + type: 'varchar', + isNullable: false, + default: `'unknown'`, + }, + { + name: 'created_at', + type: 'timestamp', + isNullable: false, + default: 'now()', + }, + { + name: 'expiry', + type: 'timestamp', + isNullable: false, + }, + ], + }), + true + ); + + await queryRunner.createForeignKey( + 'user_sessions', + new TableForeignKey({ + columnNames: ['user_id'], + referencedColumnNames: ['id'], + referencedTableName: 'users', + onDelete: 'CASCADE', + }) + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.dropTable('user_sessions'); + } +} diff --git a/server/package-lock.json b/server/package-lock.json index d08d8f40e9..27b88d5861 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -17,6 +17,7 @@ "@nestjs/passport": "^8.2.1", "@nestjs/platform-express": "^8.4.6", "@nestjs/platform-ws": "^8.0.10", + "@nestjs/schedule": "^2.2.0", "@nestjs/serve-static": "^2.2.2", "@nestjs/typeorm": "^8.0.0", "@nestjs/websockets": "^8.0.10", @@ -27,6 +28,7 @@ "class-transformer": "^0.5.1", "class-validator": "^0.13.1", "compression": "^1.7.4", + "cookie-parser": "^1.4.6", "dotenv": "^10.0.0", "express-http-proxy": "^1.6.3", "fast-csv": "^4.3.6", @@ -49,6 +51,7 @@ "pg": "^8.7.1", "pino-pretty": "^6.0.0", "reflect-metadata": "^0.1.13", + "request-ip": "^3.3.0", "rxjs": "^7.2.0", "sanitize-html": "^2.7.0", "semver": "^7.3.5", @@ -63,6 +66,8 @@ "@nestjs/schematics": "^8.0.0", "@nestjs/testing": "^8.0.0", "@types/compression": "^1.7.2", + "@types/cookie-parser": "^1.4.3", + "@types/cron": "^2.0.0", "@types/express": "^4.17.13", "@types/express-http-proxy": "^1.6.3", "@types/got": "^9.6.12", @@ -72,6 +77,7 @@ "@types/node": "^16.0.0", "@types/nodemailer": "^6.4.4", "@types/passport-jwt": "^3.0.6", + "@types/request-ip": "^0.0.37", "@types/sanitize-html": "^2.6.2", "@types/supertest": "^2.0.11", "@types/ws": "^8.2.2", @@ -135,7 +141,6 @@ "@tooljet-plugins/restapi": "file:packages/restapi", "@tooljet-plugins/rethinkdb": "file:packages/rethinkdb", "@tooljet-plugins/s3": "file:packages/s3", - "@tooljet-plugins/saphana": "file:packages/saphana", "@tooljet-plugins/sendgrid": "file:packages/sendgrid", "@tooljet-plugins/slack": "file:packages/slack", "@tooljet-plugins/smtp": "file:packages/smtp", @@ -147,23 +152,23 @@ "@tooljet-plugins/zendesk": "file:packages/zendesk" }, "devDependencies": { - "@types/jest": "^27.4.1", - "@types/nodemailer": "^6.4.4", - "@types/oracledb": "^5.2.2", - "@typescript-eslint/eslint-plugin": "^4.31.1", - "@typescript-eslint/parser": "^4.31.1", + "@types/jest": "^27.5.2", + "@types/nodemailer": "^6.4.7", + "@types/oracledb": "^5.2.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", "eslint": "^7.32.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-jest": "^24.4.2", + "eslint-config-prettier": "^8.6.0", + "eslint-plugin-jest": "^24.7.0", "eslint-plugin-prettier": "^3.4.1", - "jest": "^27.4.5", + "jest": "^27.5.1", "lerna": "^4.0.0", - "prettier": "^2.3.2", + "prettier": "^2.8.3", "rimraf": "^3.0.2", - "ts-jest": "^27.1.2" + "ts-jest": "^27.1.5" }, "peerDependencies": { - "typescript": "^4.5.4" + "typescript": "^4.9.5" } }, "../plugins/packages/common": { @@ -1816,6 +1821,28 @@ "version": "2.3.1", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, + "node_modules/@nestjs/schedule": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-2.2.0.tgz", + "integrity": "sha512-wrDnUONTxBkD6lTWh9ecYk/kvJTbA3PylotjBoRsECmcS1SNvgInFXuL38UnHiFnXM3CHSFnzRLB259Bc1mOdQ==", + "dependencies": { + "cron": "2.2.0", + "uuid": "9.0.0" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", + "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.12" + } + }, + "node_modules/@nestjs/schedule/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@nestjs/schematics": { "version": "8.0.8", "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-8.0.8.tgz", @@ -2252,11 +2279,30 @@ "@types/node": "*" } }, + "node_modules/@types/cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, "node_modules/@types/cookiejar": { "version": "2.1.2", "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, + "node_modules/@types/cron": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/cron/-/cron-2.0.0.tgz", + "integrity": "sha512-xZM08fqvwIXgghtPVkSPKNgC+JoMQ2OHazEvyTKnNf7aWu1aB6/4lBbQFrb03Td2cUGG7ITzMv3mFYnMu6xRaQ==", + "dev": true, + "dependencies": { + "@types/luxon": "*", + "@types/node": "*" + } + }, "node_modules/@types/eslint": { "version": "7.2.14", "integrity": "sha512-pESyhSbUOskqrGcaN+bCXIQDyT5zTaRWfj5ZjjSlMatgGjIn3QQPfocAu4WSabUR7CGyLZ2CQaZyISOEX7/saw==", @@ -2405,6 +2451,12 @@ "@types/node": "*" } }, + "node_modules/@types/luxon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.2.0.tgz", + "integrity": "sha512-lGmaGFoaXHuOLXFvuju2bfvZRqxAqkHPx9Y9IQdQABrinJJshJwfNCKV+u7rR3kJbiqfTF/NhOkcxxAFrObyaA==", + "dev": true + }, "node_modules/@types/mime": { "version": "1.3.2", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", @@ -2511,6 +2563,15 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "node_modules/@types/request-ip": { + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@types/request-ip/-/request-ip-0.0.37.tgz", + "integrity": "sha512-uw6/i3rQnpznxD7LtLaeuZytLhKZK6bRoTS6XVJlwxIOoOpEBU7bgKoVXDNtOg4Xl6riUKHa9bjMVrL6ESqYlQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/responselike": { "version": "1.0.0", "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", @@ -4239,6 +4300,26 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -4284,6 +4365,14 @@ "version": "1.1.1", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, + "node_modules/cron": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.2.0.tgz", + "integrity": "sha512-GPiI3OgMv83XRtEUc2gUdaLvJhO3XbLN288layOBkDTupg0RK5IECNGpkykIMHg+muVR2bxt29b0xvCAcBrjYQ==", + "dependencies": { + "luxon": "^3.2.1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", @@ -9360,6 +9449,14 @@ "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", "optional": true }, + "node_modules/luxon": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", + "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", + "engines": { + "node": ">=12" + } + }, "node_modules/macos-release": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", @@ -10986,6 +11083,11 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/request-ip": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz", + "integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==" + }, "node_modules/require-directory": { "version": "2.1.1", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", @@ -14347,6 +14449,22 @@ } } }, + "@nestjs/schedule": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-2.2.0.tgz", + "integrity": "sha512-wrDnUONTxBkD6lTWh9ecYk/kvJTbA3PylotjBoRsECmcS1SNvgInFXuL38UnHiFnXM3CHSFnzRLB259Bc1mOdQ==", + "requires": { + "cron": "2.2.0", + "uuid": "9.0.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + } + } + }, "@nestjs/schematics": { "version": "8.0.8", "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-8.0.8.tgz", @@ -14640,7 +14758,6 @@ "@tooljet-plugins/restapi": "file:packages/restapi", "@tooljet-plugins/rethinkdb": "file:packages/rethinkdb", "@tooljet-plugins/s3": "file:packages/s3", - "@tooljet-plugins/saphana": "file:packages/saphana", "@tooljet-plugins/sendgrid": "file:packages/sendgrid", "@tooljet-plugins/slack": "file:packages/slack", "@tooljet-plugins/smtp": "file:packages/smtp", @@ -14650,20 +14767,20 @@ "@tooljet-plugins/typesense": "file:packages/typesense", "@tooljet-plugins/woocommerce": "file:packages/woocommerce", "@tooljet-plugins/zendesk": "file:packages/zendesk", - "@types/jest": "^27.4.1", - "@types/nodemailer": "^6.4.4", - "@types/oracledb": "^5.2.2", - "@typescript-eslint/eslint-plugin": "^4.31.1", - "@typescript-eslint/parser": "^4.31.1", + "@types/jest": "^27.5.2", + "@types/nodemailer": "^6.4.7", + "@types/oracledb": "^5.2.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", "eslint": "^7.32.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-jest": "^24.4.2", + "eslint-config-prettier": "^8.6.0", + "eslint-plugin-jest": "^24.7.0", "eslint-plugin-prettier": "^3.4.1", - "jest": "^27.4.5", + "jest": "^27.5.1", "lerna": "^4.0.0", - "prettier": "^2.3.2", + "prettier": "^2.8.3", "rimraf": "^3.0.2", - "ts-jest": "^27.1.2" + "ts-jest": "^27.1.5" } }, "@tootallnate/once": { @@ -14760,11 +14877,30 @@ "@types/node": "*" } }, + "@types/cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, "@types/cookiejar": { "version": "2.1.2", "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, + "@types/cron": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/cron/-/cron-2.0.0.tgz", + "integrity": "sha512-xZM08fqvwIXgghtPVkSPKNgC+JoMQ2OHazEvyTKnNf7aWu1aB6/4lBbQFrb03Td2cUGG7ITzMv3mFYnMu6xRaQ==", + "dev": true, + "requires": { + "@types/luxon": "*", + "@types/node": "*" + } + }, "@types/eslint": { "version": "7.2.14", "integrity": "sha512-pESyhSbUOskqrGcaN+bCXIQDyT5zTaRWfj5ZjjSlMatgGjIn3QQPfocAu4WSabUR7CGyLZ2CQaZyISOEX7/saw==", @@ -14912,6 +15048,12 @@ "@types/node": "*" } }, + "@types/luxon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.2.0.tgz", + "integrity": "sha512-lGmaGFoaXHuOLXFvuju2bfvZRqxAqkHPx9Y9IQdQABrinJJshJwfNCKV+u7rR3kJbiqfTF/NhOkcxxAFrObyaA==", + "dev": true + }, "@types/mime": { "version": "1.3.2", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", @@ -15018,6 +15160,15 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "@types/request-ip": { + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@types/request-ip/-/request-ip-0.0.37.tgz", + "integrity": "sha512-uw6/i3rQnpznxD7LtLaeuZytLhKZK6bRoTS6XVJlwxIOoOpEBU7bgKoVXDNtOg4Xl6riUKHa9bjMVrL6ESqYlQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/responselike": { "version": "1.0.0", "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", @@ -16312,6 +16463,22 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, + "cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "requires": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + } + } + }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -16351,6 +16518,14 @@ "version": "1.1.1", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, + "cron": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.2.0.tgz", + "integrity": "sha512-GPiI3OgMv83XRtEUc2gUdaLvJhO3XbLN288layOBkDTupg0RK5IECNGpkykIMHg+muVR2bxt29b0xvCAcBrjYQ==", + "requires": { + "luxon": "^3.2.1" + } + }, "cross-spawn": { "version": "7.0.3", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", @@ -20120,6 +20295,11 @@ "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", "optional": true }, + "luxon": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", + "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==" + }, "macos-release": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", @@ -21334,6 +21514,11 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "request-ip": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz", + "integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==" + }, "require-directory": { "version": "2.1.1", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" diff --git a/server/package.json b/server/package.json index ed2d7714da..57e782a3a0 100644 --- a/server/package.json +++ b/server/package.json @@ -42,6 +42,7 @@ "@nestjs/passport": "^8.2.1", "@nestjs/platform-express": "^8.4.6", "@nestjs/platform-ws": "^8.0.10", + "@nestjs/schedule": "^2.2.0", "@nestjs/serve-static": "^2.2.2", "@nestjs/typeorm": "^8.0.0", "@nestjs/websockets": "^8.0.10", @@ -52,6 +53,7 @@ "class-transformer": "^0.5.1", "class-validator": "^0.13.1", "compression": "^1.7.4", + "cookie-parser": "^1.4.6", "dotenv": "^10.0.0", "express-http-proxy": "^1.6.3", "fast-csv": "^4.3.6", @@ -74,6 +76,7 @@ "pg": "^8.7.1", "pino-pretty": "^6.0.0", "reflect-metadata": "^0.1.13", + "request-ip": "^3.3.0", "rxjs": "^7.2.0", "sanitize-html": "^2.7.0", "semver": "^7.3.5", @@ -91,6 +94,8 @@ "@nestjs/schematics": "^8.0.0", "@nestjs/testing": "^8.0.0", "@types/compression": "^1.7.2", + "@types/cookie-parser": "^1.4.3", + "@types/cron": "^2.0.0", "@types/express": "^4.17.13", "@types/express-http-proxy": "^1.6.3", "@types/got": "^9.6.12", @@ -100,6 +105,7 @@ "@types/node": "^16.0.0", "@types/nodemailer": "^6.4.4", "@types/passport-jwt": "^3.0.6", + "@types/request-ip": "^0.0.37", "@types/sanitize-html": "^2.6.2", "@types/supertest": "^2.0.11", "@types/ws": "^8.2.2", @@ -123,4 +129,4 @@ "node": "18.3.0", "npm": "8.11.0" } -} \ No newline at end of file +} diff --git a/server/src/app.module.ts b/server/src/app.module.ts index 3241bfac8d..cf54ededac 100644 --- a/server/src/app.module.ts +++ b/server/src/app.module.ts @@ -41,8 +41,11 @@ import { PluginsModule } from './modules/plugins/plugins.module'; import * as path from 'path'; import * as fs from 'fs'; import { AppEnvironmentsModule } from './modules/app_environments/app_environments.module'; +import { RequestContextModule } from './modules/request_context/request-context.module'; +import { ScheduleModule } from '@nestjs/schedule'; const imports = [ + ScheduleModule.forRoot(), ConfigModule.forRoot({ isGlobal: true, envFilePath: [`../.env.${process.env.NODE_ENV}`, '../.env'], @@ -74,6 +77,7 @@ const imports = [ }, }), TypeOrmModule.forRoot(ormconfig), + RequestContextModule, AppConfigModule, SeedsModule, AuthModule, diff --git a/server/src/controllers/app.controller.ts b/server/src/controllers/app.controller.ts index 9e60899d4d..ed4472026a 100644 --- a/server/src/controllers/app.controller.ts +++ b/server/src/controllers/app.controller.ts @@ -1,4 +1,15 @@ -import { Controller, Get, Request, Post, UseGuards, Body, Param, BadRequestException, Query } from '@nestjs/common'; +import { + Controller, + Get, + Request, + Post, + UseGuards, + Body, + Param, + BadRequestException, + Query, + Res, +} from '@nestjs/common'; import { User } from 'src/decorators/user.decorator'; import { JwtAuthGuard } from '../../src/modules/auth/jwt-auth.guard'; import { @@ -13,35 +24,88 @@ import { CreateAdminDto, CreateUserDto } from '@dto/user.dto'; import { AcceptInviteDto } from '@dto/accept-organization-invite.dto'; import { FirstUserSignupDisableGuard } from 'src/modules/auth/first-user-signup-disable.guard'; import { FirstUserSignupGuard } from 'src/modules/auth/first-user-signup.guard'; +import { OrganizationAuthGuard } from 'src/modules/auth/organization-auth.guard'; +import { AuthorizeWorkspaceGuard } from 'src/modules/auth/authorize-workspace-guard'; +import { Response } from 'express'; +import { SessionAuthGuard } from 'src/modules/auth/session-auth-guard'; +import { UsersService } from '@services/users.service'; +import { SessionService } from '@services/session.service'; @Controller() export class AppController { - constructor(private authService: AuthService) {} + constructor( + private authService: AuthService, + private userService: UsersService, + private sessionService: SessionService + ) {} - @Post(['authenticate', 'authenticate/:organizationId']) - async login(@Body() appAuthDto: AppAuthenticationDto, @Param('organizationId') organizationId) { - return this.authService.login(appAuthDto.email, appAuthDto.password, organizationId); + @Post('authenticate') + async login(@Body() appAuthDto: AppAuthenticationDto, @Res({ passthrough: true }) response: Response) { + return this.authService.login(response, appAuthDto.email, appAuthDto.password); + } + + @UseGuards(OrganizationAuthGuard) + @Post('authenticate/:organizationId') + async organizationLogin( + @User() user, + @Body() appAuthDto: AppAuthenticationDto, + @Param('organizationId') organizationId, + @Res({ passthrough: true }) response: Response + ) { + return this.authService.login(response, appAuthDto.email, appAuthDto.password, organizationId, user); + } + + @UseGuards(SessionAuthGuard) + @Get('session') + async getSessionDetails(@User() user, @Query('appId') appId: string) { + let appOrganizationId: string; + if (appId) { + appOrganizationId = await this.userService.returnOrgIdOfAnApp(appId); + if (appOrganizationId && user.organizationIds?.includes(appOrganizationId)) { + user.organization_id = appOrganizationId; + } + } + return await this.authService.generateSessionPayload(user, appOrganizationId); + } + + @UseGuards(JwtAuthGuard) + @Get('logout') + async terminateUserSession(@User() user, @Res({ passthrough: true }) response: Response) { + await this.sessionService.terminateSession(user.id, user.sessionId, response); + return; + } + + @UseGuards(JwtAuthGuard) + @Get('profile') + async getUserDetails(@User() user) { + return this.sessionService.getSessionUserDetails(user); + } + + @UseGuards(AuthorizeWorkspaceGuard) + @Get('authorize') + async authorize(@User() user) { + return await this.authService.authorizeOrganization(user); } @UseGuards(JwtAuthGuard) @Get('switch/:organizationId') - async switch(@Param('organizationId') organizationId, @User() user) { + async switch(@Param('organizationId') organizationId, @User() user, @Res({ passthrough: true }) response: Response) { if (!organizationId) { throw new BadRequestException(); } - return await this.authService.switchOrganization(organizationId, user); + return await this.authService.switchOrganization(response, organizationId, user); } @UseGuards(FirstUserSignupGuard) @Post('setup-admin') - async setupAdmin(@Body() userCreateDto: CreateAdminDto) { - return await this.authService.setupAdmin(userCreateDto); + async setupAdmin(@Body() userCreateDto: CreateAdminDto, @Res({ passthrough: true }) response: Response) { + return await this.authService.setupAdmin(response, userCreateDto); } @UseGuards(FirstUserSignupDisableGuard) @Post('setup-account-from-token') - async create(@Body() userCreateDto: CreateUserDto) { - return await this.authService.setupAccountFromInvitationToken(userCreateDto); + async create(@Body() userCreateDto: CreateUserDto, @Res({ passthrough: true }) response: Response) { + return await this.authService.setupAccountFromInvitationToken(response, userCreateDto); } @UseGuards(FirstUserSignupDisableGuard) diff --git a/server/src/controllers/apps.controller.ts b/server/src/controllers/apps.controller.ts index 8dd07c0e95..8ae8c9cfa7 100644 --- a/server/src/controllers/apps.controller.ts +++ b/server/src/controllers/apps.controller.ts @@ -105,7 +105,6 @@ export class AppsController { } @UseGuards(AppAuthGuard) // This guard will allow access for unauthenticated user if the app is public - @UseInterceptors(ValidAppInterceptor) @Get('slugs/:slug') async appFromSlug(@User() user, @AppDecorator() app: App) { if (user) { diff --git a/server/src/controllers/organizations.controller.ts b/server/src/controllers/organizations.controller.ts index a00dc695f2..ccdd8176ce 100644 --- a/server/src/controllers/organizations.controller.ts +++ b/server/src/controllers/organizations.controller.ts @@ -1,6 +1,5 @@ -import { Body, Controller, Get, NotFoundException, Param, Patch, Post, UseGuards, Query } from '@nestjs/common'; +import { Body, Controller, Get, NotFoundException, Param, Patch, Post, UseGuards, Query, Res } from '@nestjs/common'; import { OrganizationsService } from '@services/organizations.service'; -import { AppConfigService } from '@services/app_config.service'; import { decamelizeKeys } from 'humps'; import { User } from 'src/decorators/user.decorator'; import { JwtAuthGuard } from '../../src/modules/auth/jwt-auth.guard'; @@ -9,18 +8,12 @@ import { AppAbility } from 'src/modules/casl/casl-ability.factory'; import { CheckPolicies } from 'src/modules/casl/check_policies.decorator'; import { PoliciesGuard } from 'src/modules/casl/policies.guard'; import { User as UserEntity } from 'src/entities/user.entity'; -import { ConfigService } from '@nestjs/config'; -import { MultiOrganizationGuard } from 'src/modules/auth/multi-organization.guard'; import { OrganizationCreateDto, OrganizationUpdateDto } from '@dto/organization.dto'; +import { Response } from 'express'; @Controller('organizations') export class OrganizationsController { - constructor( - private organizationsService: OrganizationsService, - private authService: AuthService, - private readonly configService: ConfigService, - private appConfigService: AppConfigService - ) {} + constructor(private organizationsService: OrganizationsService, private authService: AuthService) {} @UseGuards(JwtAuthGuard, PoliciesGuard) @CheckPolicies((ability: AppAbility) => ability.can('viewAllUsers', UserEntity)) @@ -69,15 +62,19 @@ export class OrganizationsController { return decamelizeKeys({ organizations: result }); } - @UseGuards(JwtAuthGuard, MultiOrganizationGuard) + @UseGuards(JwtAuthGuard) @Post() - async create(@User() user, @Body() organizationCreateDto: OrganizationCreateDto) { + async create( + @User() user, + @Body() organizationCreateDto: OrganizationCreateDto, + @Res({ passthrough: true }) response: Response + ) { const result = await this.organizationsService.create(organizationCreateDto.name, user); if (!result) { throw new Error(); } - return await this.authService.switchOrganization(result.id, user, true); + return await this.authService.switchOrganization(response, result.id, user, true); } @Get(['/:organizationId/public-configs', '/public-configs']) @@ -86,10 +83,7 @@ export class OrganizationsController { if (!existingOrganizationId) { throw new NotFoundException(); } - if (!organizationId && this.configService.get('DISABLE_MULTI_WORKSPACE') === 'true') { - // Request from single organization login page - find one from organization and setting - organizationId = existingOrganizationId; - } else if (!organizationId) { + if (!organizationId) { const result = this.organizationsService.constructSSOConfigs(); return decamelizeKeys({ ssoConfigs: result }); } diff --git a/server/src/decorators/app.decorator.ts b/server/src/decorators/app.decorator.ts index 0eca3c78b8..e74c96e5c5 100644 --- a/server/src/decorators/app.decorator.ts +++ b/server/src/decorators/app.decorator.ts @@ -3,5 +3,5 @@ import { App } from 'src/entities/app.entity'; export const AppDecorator = createParamDecorator((data: unknown, ctx: ExecutionContext): App => { const request = ctx.switchToHttp().getRequest(); - return request.app; + return request.tj_app; }); diff --git a/server/src/entities/user.entity.ts b/server/src/entities/user.entity.ts index e9d2457b1f..acb2539d2d 100644 --- a/server/src/entities/user.entity.ts +++ b/server/src/entities/user.entity.ts @@ -130,6 +130,8 @@ export class User extends BaseEntity { apps: App[]; organizationId: string; + organizationIds?: Array; isPasswordLogin: boolean; isSSOLogin: boolean; + sessionId: string; } diff --git a/server/src/entities/user_sessions.entity.ts b/server/src/entities/user_sessions.entity.ts new file mode 100644 index 0000000000..e7317adc64 --- /dev/null +++ b/server/src/entities/user_sessions.entity.ts @@ -0,0 +1,24 @@ +import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, JoinColumn, BaseEntity, ManyToOne } from 'typeorm'; +import { User } from './user.entity'; + +@Entity({ name: 'user_sessions' }) +export class UserSessions extends BaseEntity { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ name: 'user_id' }) + userId: string; + + @ManyToOne(() => User, (user) => user.id, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'user_id' }) + user: User; + + @Column({ name: 'device' }) + device: string; + + @CreateDateColumn({ default: () => 'now()', name: 'created_at' }) + createdAt: Date; + + @Column({ name: 'expiry' }) + expiry: Date; +} diff --git a/server/src/interceptors/valid.app.interceptor.ts b/server/src/interceptors/valid.app.interceptor.ts index 611079323f..7a809606e9 100644 --- a/server/src/interceptors/valid.app.interceptor.ts +++ b/server/src/interceptors/valid.app.interceptor.ts @@ -19,9 +19,9 @@ export class ValidAppInterceptor implements NestInterceptor { if (!(id || slug)) { throw new BadRequestException(); } - const app = id ? await this.appsService.find(id) : this.appsService.findBySlug(slug); + const app = request.tj_app || (id ? await this.appsService.find(id) : this.appsService.findBySlug(slug)); if (!app) throw new NotFoundException('App not found. Invalid app id'); - request.app = app; + request.tj_app = app; return next.handle(); } } diff --git a/server/src/main.ts b/server/src/main.ts index 498e192e86..8ba3de293f 100644 --- a/server/src/main.ts +++ b/server/src/main.ts @@ -1,6 +1,7 @@ import { NestFactory } from '@nestjs/core'; import { NestExpressApplication } from '@nestjs/platform-express'; import { WsAdapter } from '@nestjs/platform-ws'; +import * as cookieParser from 'cookie-parser'; import * as compression from 'compression'; import { AppModule } from './app.module'; import * as helmet from 'helmet'; @@ -43,7 +44,10 @@ async function bootstrap() { app.setGlobalPrefix(UrlPrefix + 'api', { exclude: pathsToExclude, }); - app.enableCors(); + app.enableCors({ + origin: true, + credentials: true, + }); app.use(compression()); app.use( @@ -83,6 +87,7 @@ async function bootstrap() { }) ); + app.use(cookieParser()); app.use(json({ limit: '50mb' })); app.use(urlencoded({ extended: true, limit: '50mb', parameterLimit: 1000000 })); app.useStaticAssets(join(__dirname, 'assets'), { prefix: (UrlPrefix ? UrlPrefix : '/') + 'assets' }); diff --git a/server/src/middlewares/request-context.middleware.ts b/server/src/middlewares/request-context.middleware.ts new file mode 100644 index 0000000000..1a3e282364 --- /dev/null +++ b/server/src/middlewares/request-context.middleware.ts @@ -0,0 +1,10 @@ +import { Injectable, NestMiddleware } from '@nestjs/common'; +import { Request, Response } from 'express'; +import { RequestContext } from '../models/request-context.model'; + +@Injectable() +export class RequestContextMiddleware implements NestMiddleware { + use(req: Request, res: Response, next: () => void) { + RequestContext.cls.run(new RequestContext(req, res), next); + } +} diff --git a/server/src/models/request-context.model.ts b/server/src/models/request-context.model.ts new file mode 100644 index 0000000000..da25c4864d --- /dev/null +++ b/server/src/models/request-context.model.ts @@ -0,0 +1,12 @@ +import { AsyncLocalStorage } from 'async_hooks'; +import { Request, Response } from 'express'; + +export class RequestContext { + static cls = new AsyncLocalStorage(); + + static get currentContext() { + return this.cls.getStore(); + } + + constructor(public readonly req: Request, public readonly res: Response) {} +} diff --git a/server/src/modules/auth/app-auth.guard.ts b/server/src/modules/auth/app-auth.guard.ts index 0ca2f5ae45..de4f5b390d 100644 --- a/server/src/modules/auth/app-auth.guard.ts +++ b/server/src/modules/auth/app-auth.guard.ts @@ -11,13 +11,18 @@ export class AppAuthGuard extends AuthGuard('jwt') { async canActivate(context: ExecutionContext): Promise { const request = context.switchToHttp().getRequest(); + if (!request.params.slug) { + throw new NotFoundException('App not found. Invalid app id'); + } // unauthenticated users should be able to to view public apps - if (request.route.path.includes('/api/apps/slugs/:slug')) { - const app = await this.appsService.findBySlug(request.params.slug); - if (!app) throw new NotFoundException('App not found. Invalid app id'); - if (app.isPublic === true) { - return true; - } + const app = await this.appsService.findBySlug(request.params.slug); + if (!app) throw new NotFoundException('App not found. Invalid app id'); + + request.tj_app = app; + request.headers['tj-workspace-id'] = app.organizationId; + + if (app.isPublic === true) { + return true; } return super.canActivate(context); diff --git a/server/src/modules/auth/auth.module.ts b/server/src/modules/auth/auth.module.ts index eb26e847ec..4db2947cef 100644 --- a/server/src/modules/auth/auth.module.ts +++ b/server/src/modules/auth/auth.module.ts @@ -34,6 +34,8 @@ import { AppEnvironmentService } from '@services/app_environments.service'; import { MetaModule } from '../meta/meta.module'; import { Metadata } from 'src/entities/metadata.entity'; import { MetadataService } from '@services/metadata.service'; +import { SessionService } from '@services/session.service'; +import { SessionScheduler } from 'src/schedulers/session.scheduler'; @Module({ imports: [ @@ -59,9 +61,6 @@ import { MetadataService } from '@services/metadata.service'; useFactory: (config: ConfigService) => { return { secret: config.get('SECRET_KEY_BASE'), - signOptions: { - expiresIn: config.get('JWT_EXPIRATION_TIME') || '30d', - }, }; }, inject: [ConfigService], @@ -85,8 +84,10 @@ import { MetadataService } from '@services/metadata.service'; AppEnvironmentService, MetadataService, PluginsHelper, + SessionService, + SessionScheduler, ], controllers: [OauthController], - exports: [AuthService], + exports: [AuthService, SessionService], }) export class AuthModule {} diff --git a/server/src/modules/auth/authorize-workspace-guard.ts b/server/src/modules/auth/authorize-workspace-guard.ts new file mode 100644 index 0000000000..c5b535c341 --- /dev/null +++ b/server/src/modules/auth/authorize-workspace-guard.ts @@ -0,0 +1,34 @@ +import { ExecutionContext, Injectable, NotFoundException } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { Organization } from 'src/entities/organization.entity'; +import { getManager } from 'typeorm'; + +@Injectable() +export class AuthorizeWorkspaceGuard extends AuthGuard('jwt') { + async canActivate(context: ExecutionContext): Promise { + const request = context.switchToHttp().getRequest(); + if (request?.cookies['auth_token']) { + let user: any; + const organizationId = + typeof request.headers['tj-workspace-id'] === 'object' + ? request.headers['tj-workspace-id'][0] + : request.headers['tj-workspace-id']; + if (organizationId) { + const org = await getManager().findOne(Organization, { + where: { id: organizationId }, + select: ['id'], + }); + if (!org) { + throw new NotFoundException(); + } + } + + try { + user = super.canActivate(context); + } catch (err) { + return false; + } + return user; + } + } +} diff --git a/server/src/modules/auth/jwt.strategy.ts b/server/src/modules/auth/jwt.strategy.ts index 945d3fc566..306ee7672c 100644 --- a/server/src/modules/auth/jwt.strategy.ts +++ b/server/src/modules/auth/jwt.strategy.ts @@ -1,34 +1,84 @@ -import { ExtractJwt, Strategy } from 'passport-jwt'; +import { Strategy } from 'passport-jwt'; import { PassportStrategy } from '@nestjs/passport'; import { Injectable } from '@nestjs/common'; import { UsersService } from '../../../src/services/users.service'; import { ConfigService } from '@nestjs/config'; import { User } from 'src/entities/user.entity'; -import { USER_STATUS, WORKSPACE_USER_STATUS } from 'src/helpers/user_lifecycle'; +import { WORKSPACE_USER_STATUS } from 'src/helpers/user_lifecycle'; +import { Request } from 'express'; +import { SessionService } from '@services/session.service'; @Injectable() export class JwtStrategy extends PassportStrategy(Strategy) { - constructor(private usersService: UsersService, private configService: ConfigService) { + constructor( + private usersService: UsersService, + private configService: ConfigService, + private sessionService: SessionService + ) { super({ - jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), - ignoreExpiration: false, + jwtFromRequest: (request) => { + return request?.cookies['auth_token']; + }, + ignoreExpiration: true, secretOrKey: configService.get('SECRET_KEY_BASE'), + passReqToCallback: true, }); } - async validate(payload: any) { - if (!payload.organizationId) return false; - const user: User = await this.usersService.findByEmail( - payload.sub, - payload.organizationId, - WORKSPACE_USER_STATUS.ACTIVE - ); - if (!user || user.status !== USER_STATUS.ACTIVE) return false; + async validate(req: Request, payload: JWTPayload) { + const isUserMandatory = !req['isUserNotMandatory']; + const isGetUserSession = !!req['isGetUserSession']; - user.organizationId = payload.organizationId; - user.isPasswordLogin = payload.isPasswordLogin; - user.isSSOLogin = payload.isSSOLogin; + if (isUserMandatory || isGetUserSession) { + await this.sessionService.validateUserSession(payload.username, payload.sessionId); + } - return user; + if (isGetUserSession) { + const user: User = await this.usersService.findByEmail(payload.sub); + user.organizationIds = payload.organizationIds; + return user; + } + + const organizationId = + typeof req.headers['tj-workspace-id'] === 'object' + ? req.headers['tj-workspace-id'][0] + : req.headers['tj-workspace-id']; + + if (isUserMandatory) { + // header des not exist + if (!organizationId) return false; + + // No authenticated workspaces + if (!payload.organizationIds?.length) { + return false; + } + // requested workspace not authenticated + if (!payload.organizationIds.some((oid) => oid === organizationId)) { + return false; + } + } + + if (payload?.sub && organizationId) { + const user: User = await this.usersService.findByEmail(payload.sub, organizationId, WORKSPACE_USER_STATUS.ACTIVE); + + user.organizationId = organizationId; + user.organizationIds = payload.organizationIds; + user.isPasswordLogin = payload.isPasswordLogin; + user.isSSOLogin = payload.isSSOLogin; + user.sessionId = payload.sessionId; + + return user; + } + return {}; } } + +type JWTPayload = { + sessionId: string; + username: string; + sub: string; + organizationId?: string; + organizationIds?: Array; + isPasswordLogin: boolean; + isSSOLogin: boolean; +}; diff --git a/server/src/modules/auth/multi-organization.guard.ts b/server/src/modules/auth/multi-organization.guard.ts deleted file mode 100644 index 7cea5f0761..0000000000 --- a/server/src/modules/auth/multi-organization.guard.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; - -@Injectable() -export class MultiOrganizationGuard implements CanActivate { - constructor(private configService: ConfigService) {} - - async canActivate(context: ExecutionContext): Promise { - return this.configService.get('DISABLE_MULTI_WORKSPACE') !== 'true'; - } -} diff --git a/server/src/modules/auth/organization-auth.guard.ts b/server/src/modules/auth/organization-auth.guard.ts new file mode 100644 index 0000000000..91ca351817 --- /dev/null +++ b/server/src/modules/auth/organization-auth.guard.ts @@ -0,0 +1,20 @@ +import { ExecutionContext, Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class OrganizationAuthGuard extends AuthGuard('jwt') { + async canActivate(context: ExecutionContext): Promise { + let user; + const request = context.switchToHttp().getRequest(); + request.isUserNotMandatory = true; + if (request?.cookies['auth_token']) { + try { + user = await super.canActivate(context); + } catch (err) { + return true; + } + return user; + } + return true; + } +} diff --git a/server/src/modules/auth/session-auth-guard.ts b/server/src/modules/auth/session-auth-guard.ts new file mode 100644 index 0000000000..b0370139a1 --- /dev/null +++ b/server/src/modules/auth/session-auth-guard.ts @@ -0,0 +1,20 @@ +import { ExecutionContext, Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class SessionAuthGuard extends AuthGuard('jwt') { + async canActivate(context: ExecutionContext): Promise { + let user; + const request = context.switchToHttp().getRequest(); + request.isGetUserSession = true; + if (request?.cookies['auth_token']) { + try { + user = await super.canActivate(context); + } catch (err) { + return false; + } + return user; + } + return false; + } +} diff --git a/server/src/modules/org_environment_variables/is-public.guard.ts b/server/src/modules/org_environment_variables/is-public.guard.ts index 7a2b58e6b4..371262bed5 100644 --- a/server/src/modules/org_environment_variables/is-public.guard.ts +++ b/server/src/modules/org_environment_variables/is-public.guard.ts @@ -11,7 +11,7 @@ export class IsPublicGuard implements CanActivate { return false; } const app = await this.appsService.findBySlug(request.params.app_slug); - request.app = app; + request.tj_app = app; return !!app?.isPublic; } } diff --git a/server/src/modules/organizations/organizations.module.ts b/server/src/modules/organizations/organizations.module.ts index 7c860e5246..7331c52c1f 100644 --- a/server/src/modules/organizations/organizations.module.ts +++ b/server/src/modules/organizations/organizations.module.ts @@ -34,6 +34,7 @@ import { AppEnvironmentService } from '@services/app_environments.service'; import { MetaModule } from '../meta/meta.module'; import { Metadata } from 'src/entities/metadata.entity'; import { MetadataService } from '@services/metadata.service'; +import { SessionService } from '@services/session.service'; @Module({ imports: [ @@ -58,9 +59,6 @@ import { MetadataService } from '@services/metadata.service'; useFactory: (config: ConfigService) => { return { secret: config.get('SECRET_KEY_BASE'), - signOptions: { - expiresIn: config.get('JWT_EXPIRATION_TIME') || '30d', - }, }; }, inject: [ConfigService], @@ -82,6 +80,7 @@ import { MetadataService } from '@services/metadata.service'; PluginsHelper, MetadataService, AppEnvironmentService, + SessionService, ], controllers: [OrganizationsController, OrganizationUsersController], }) diff --git a/server/src/modules/request_context/request-context.module.ts b/server/src/modules/request_context/request-context.module.ts new file mode 100644 index 0000000000..75d513da1b --- /dev/null +++ b/server/src/modules/request_context/request-context.module.ts @@ -0,0 +1,12 @@ +import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; +import { RequestContextMiddleware } from '../../middlewares/request-context.middleware'; + +@Module({ + providers: [RequestContextMiddleware], + exports: [RequestContextMiddleware], +}) +export class RequestContextModule implements NestModule { + configure(consumer: MiddlewareConsumer): any { + consumer.apply(RequestContextMiddleware).forRoutes('*'); + } +} diff --git a/server/src/schedulers/session.scheduler.ts b/server/src/schedulers/session.scheduler.ts new file mode 100644 index 0000000000..4eb2fe1371 --- /dev/null +++ b/server/src/schedulers/session.scheduler.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@nestjs/common'; +import { Cron, CronExpression } from '@nestjs/schedule'; +import { UserSessions } from 'src/entities/user_sessions.entity'; +import { dbTransactionWrap } from 'src/helpers/utils.helper'; +import { EntityManager } from 'typeorm'; + +@Injectable() +export class SessionScheduler { + @Cron(CronExpression.EVERY_HOUR) + async handleCron() { + console.log('starting job to clear expired sessions at ', new Date().toISOString()); + await dbTransactionWrap(async (manager: EntityManager) => { + await manager + .createQueryBuilder(UserSessions, 'user_sessions') + .delete() + .where('user_sessions.expiry < :now', { now: new Date() }) + .execute(); + }); + } +} diff --git a/server/src/services/app_config.service.ts b/server/src/services/app_config.service.ts index 7d3ccb76e3..4954e3e9e3 100644 --- a/server/src/services/app_config.service.ts +++ b/server/src/services/app_config.service.ts @@ -24,7 +24,6 @@ export class AppConfigService { 'SENTRY_DEBUG', 'TOOLJET_HOST', 'SUB_PATH', - 'DISABLE_MULTI_WORKSPACE', 'ENABLE_MARKETPLACE_FEATURE', 'ENABLE_TOOLJET_DB', 'LANGUAGE', diff --git a/server/src/services/auth.service.ts b/server/src/services/auth.service.ts index 564188cc7a..ee0130a174 100644 --- a/server/src/services/auth.service.ts +++ b/server/src/services/auth.service.ts @@ -9,6 +9,7 @@ import { UsersService } from './users.service'; import { OrganizationsService } from './organizations.service'; import { JwtService } from '@nestjs/jwt'; import { User } from '../entities/user.entity'; +import { UserSessions } from '../entities/user_sessions.entity'; import { OrganizationUsersService } from './organization_users.service'; import { EmailService } from './email.service'; import { decamelizeKeys } from 'humps'; @@ -32,6 +33,10 @@ import { WORKSPACE_USER_STATUS, } from 'src/helpers/user_lifecycle'; import { MetadataService } from './metadata.service'; +import { Response } from 'express'; +import { SessionService } from './session.service'; +import { RequestContext } from 'src/models/request-context.model'; +import * as requestIp from 'request-ip'; const bcrypt = require('bcrypt'); const uuid = require('uuid'); @@ -48,7 +53,8 @@ export class AuthService { private organizationUsersService: OrganizationUsersService, private emailService: EmailService, private metadataService: MetadataService, - private configService: ConfigService + private configService: ConfigService, + private sessionService: SessionService ) {} verifyToken(token: string) { @@ -91,7 +97,7 @@ export class AuthService { return user; } - async login(email: string, password: string, organizationId?: string) { + async login(response: Response, email: string, password: string, organizationId?: string, loggedInUser?: User) { let organization: Organization; const user = await this.validateUser(email, password, organizationId); @@ -100,34 +106,24 @@ export class AuthService { if (!organizationId) { // Global login // Determine the organization to be loaded - if (this.configService.get('DISABLE_MULTI_WORKSPACE') === 'true') { - // Single organization - if (user?.organizationUsers?.[0].status !== WORKSPACE_USER_STATUS.ACTIVE) { - throw new UnauthorizedException('Your account is not active'); - } - organization = await this.organizationsService.getSingleOrganization(); - if (!organization?.ssoConfigs?.find((oc) => oc.sso == 'form' && oc.enabled)) { - throw new UnauthorizedException(); - } - } else { - // Multi organization - const organizationList: Organization[] = await this.organizationsService.findOrganizationWithLoginSupport( - user, - 'form' - ); - const defaultOrgDetails: Organization = organizationList?.find((og) => og.id === user.defaultOrganizationId); - if (defaultOrgDetails) { - // default organization form login enabled - organization = defaultOrgDetails; - } else if (organizationList?.length > 0) { - // default organization form login not enabled, picking first one from form enabled list - organization = organizationList[0]; - } else { - // no form login enabled organization available for user - creating new one - organization = await this.organizationsService.create('Untitled workspace', user, manager); - } + const organizationList: Organization[] = await this.organizationsService.findOrganizationWithLoginSupport( + user, + 'form' + ); + + const defaultOrgDetails: Organization = organizationList?.find((og) => og.id === user.defaultOrganizationId); + if (defaultOrgDetails) { + // default organization form login enabled + organization = defaultOrgDetails; + } else if (organizationList?.length > 0) { + // default organization form login not enabled, picking first one from form enabled list + organization = organizationList[0]; + } else { + // no form login enabled organization available for user - creating new one + organization = await this.organizationsService.create('Untitled workspace', user, manager); } + user.organizationId = organization.id; } else { // organization specific login @@ -152,17 +148,14 @@ export class AuthService { manager ); - return await this.generateLoginResultPayload(user, organization, false, true, manager); + return await this.generateLoginResultPayload(response, user, organization, false, true, loggedInUser); }); } - async switchOrganization(newOrganizationId: string, user: User, isNewOrganization?: boolean) { + async switchOrganization(response: Response, newOrganizationId: string, user: User, isNewOrganization?: boolean) { if (!(isNewOrganization || user.isPasswordLogin || user.isSSOLogin)) { throw new UnauthorizedException(); } - if (this.configService.get('DISABLE_MULTI_WORKSPACE') === 'true') { - throw new UnauthorizedException(); - } const newUser = await this.usersService.findByEmail(user.email, newOrganizationId, WORKSPACE_USER_STATUS.ACTIVE); if (!newUser) { @@ -183,7 +176,34 @@ export class AuthService { // Updating default organization Id await this.usersService.updateUser(newUser.id, { defaultOrganizationId: newUser.organizationId }, manager); - return await this.generateLoginResultPayload(user, organization, user.isSSOLogin, user.isPasswordLogin, manager); + return await this.generateLoginResultPayload( + response, + user, + organization, + user.isSSOLogin, + user.isPasswordLogin, + user + ); + }); + } + + async authorizeOrganization(user: User) { + return await dbTransactionWrap(async (manager: EntityManager) => { + if (user.defaultOrganizationId !== user.organizationId) + await this.usersService.updateUser(user.id, { defaultOrganizationId: user.organizationId }, manager); + + return decamelizeKeys({ + admin: await this.usersService.hasGroup(user, 'admin', null, manager), + groupPermissions: await this.usersService.groupPermissions(user, manager), + appGroupPermissions: await this.usersService.appGroupPermissions(user, null, manager), + currentUser: { + id: user.id, + email: user.email, + firstName: user.firstName, + lastName: user.lastName, + avatarId: user.avatarId, + }, + }); }); } @@ -221,18 +241,8 @@ export class AuthService { let organization: Organization; // Check if the configs allows user signups - if (this.configService.get('DISABLE_MULTI_WORKSPACE') === 'true') { - // Single organization checking if organization exist - organization = await this.organizationsService.getSingleOrganization(); - - if (organization) { - throw new NotAcceptableException('Multi organization not supported - organization exist'); - } - } else { - // Multi organization - if (this.configService.get('DISABLE_SIGNUPS') === 'true') { - throw new NotAcceptableException(); - } + if (this.configService.get('DISABLE_SIGNUPS') === 'true') { + throw new NotAcceptableException(); } const names = { firstName: '', lastName: '' }; @@ -306,7 +316,7 @@ export class AuthService { return nameObj; } - async setupAdmin(userCreateDto: CreateAdminDto): Promise { + async setupAdmin(response: Response, userCreateDto: CreateAdminDto): Promise { const { companyName, companySize, name, role, workspace, password, email, phoneNumber } = userCreateDto; const nameObj = this.splitName(name); @@ -334,14 +344,14 @@ export class AuthService { manager ); await this.organizationUsersService.create(user, organization, false, manager); - return this.generateLoginResultPayload(user, organization, false, true, manager); + return this.generateLoginResultPayload(response, user, organization, false, true, null, manager); }); await this.metadataService.finishOnboarding(name, email, companyName, companySize, role); return result; } - async setupAccountFromInvitationToken(userCreateDto: CreateUserDto) { + async setupAccountFromInvitationToken(response: Response, userCreateDto: CreateUserDto) { const { companyName, companySize, token, role, organizationToken, password, source, phoneNumber } = userCreateDto; if (!token) { @@ -406,7 +416,7 @@ export class AuthService { throw new BadRequestException('Invalid invitation link'); } - if (this.configService.get('DISABLE_MULTI_WORKSPACE') !== 'true' && organizationUser) { + if (organizationUser) { // Activate invited workspace await this.organizationUsersService.activateOrganization(organizationUser, manager); @@ -426,13 +436,12 @@ export class AuthService { const isInstanceSSOLogin = !organizationUser && isSSOVerify; - return this.generateLoginResultPayload(user, organization, isInstanceSSOLogin, !isSSOVerify, manager); + return this.generateLoginResultPayload(response, user, organization, isInstanceSSOLogin, !isSSOVerify); }); } async acceptOrganizationInvite(acceptInviteDto: AcceptInviteDto) { - const { password, token } = acceptInviteDto; - const isSingleWorkspace = this.configService.get('DISABLE_MULTI_WORKSPACE') === 'true'; + const { token } = acceptInviteDto; return await dbTransactionWrap(async (manager: EntityManager) => { const organizationUser = await manager.findOne(OrganizationUser, { @@ -445,7 +454,7 @@ export class AuthService { } const user: User = organizationUser.user; - if (!isSingleWorkspace && user.invitationToken) { + if (user.invitationToken) { // User sign up link send - not activated account this.emailService .sendWelcomeEmail( @@ -459,38 +468,9 @@ export class AuthService { 'Please setup your account using account setup link shared via email before accepting the invite' ); } + await this.usersService.updateUser(user.id, { defaultOrganizationId: organizationUser.organizationId }, manager); - if (isSingleWorkspace) { - if (user.invitationToken && !password) { - // user in invited state, password mandatory - throw new BadRequestException('Please enter password'); - } - // set new password - await this.usersService.updateUser( - user.id, - { - ...(password ? { password } : {}), - invitationToken: null, - passwordRetryCount: 0, - ...getUserStatusAndSource(lifecycleEvents.USER_REDEEM), - }, - manager - ); - } else { - await this.usersService.updateUser( - user.id, - { defaultOrganizationId: organizationUser.organizationId }, - manager - ); - } await this.organizationUsersService.activateOrganization(organizationUser, manager); - - if (isSingleWorkspace) { - // Sign in - return { - user: await this.generateLoginResultPayload(user, organizationUser.organization, false, true, manager), - }; - } return; }); } @@ -542,7 +522,6 @@ export class AuthService { } async verifyOrganizationToken(token: string) { - const isSingleWorkspace = this.configService.get('DISABLE_MULTI_WORKSPACE') === 'true'; const organizationUser: OrganizationUser = await this.organizationUsersRepository.findOne({ where: { invitationToken: token }, relations: ['user'], @@ -552,58 +531,92 @@ export class AuthService { if (!user) { throw new BadRequestException('Invalid token'); } - if (user.status === USER_STATUS.ARCHIVED || (!isSingleWorkspace && user.status !== USER_STATUS.ACTIVE)) { + if (user.status !== USER_STATUS.ACTIVE) { throw new BadRequestException(getUserErrorMessages(user.status)); } - if (isSingleWorkspace) { - await this.usersService.updateUser(user.id, getUserStatusAndSource(lifecycleEvents.USER_VERIFY)); - } - return { email: user.email, name: `${user.firstName}${user.lastName ? ` ${user.lastName}` : ''}`, onboarding_details: { - password: isSingleWorkspace && user.invitationToken, // Should accept password for Single workspace if initial setup + password: false, // Should not accept password for organization token }, }; } + generateSessionPayload(user: User, appOrganizationId: string) { + return decamelizeKeys({ + id: user.id, + email: user.email, + firstName: user.firstName, + lastName: user.lastName, + currentOrganizationId: appOrganizationId + ? appOrganizationId + : user?.organizationIds?.includes(user?.defaultOrganizationId) + ? user.defaultOrganizationId + : user?.organizationIds?.[0], + }); + } + async generateLoginResultPayload( + response: Response, user: User, organization: DeepPartial, isInstanceSSO: boolean, isPasswordLogin: boolean, + loggedInUser?: User, manager?: EntityManager ): Promise { + const request = RequestContext?.currentContext?.req; + const organizationIds = new Set([ + ...(loggedInUser?.id === user.id ? loggedInUser?.organizationIds || [] : []), + organization.id, + ]); + let sessionId = loggedInUser?.sessionId; + + // logged in user and new user are different -> creating session + if (loggedInUser?.id !== user.id) { + const session: UserSessions = await this.sessionService.createSession( + user.id, + `IP: ${request?.clientIp || requestIp.getClientIp(request) || 'unknown'} UA: ${ + request?.headers['user-agent'] || 'unknown' + }`, + manager + ); + sessionId = session.id; + } + const JWTPayload: JWTPayload = { + sessionId: sessionId, username: user.id, sub: user.email, - organizationId: organization.id, - isSSOLogin: isInstanceSSO, - isPasswordLogin, + organizationIds: [...organizationIds], + isSSOLogin: loggedInUser?.isSSOLogin || isInstanceSSO, + isPasswordLogin: loggedInUser?.isPasswordLogin || isPasswordLogin, }; user.organizationId = organization.id; + response.cookie('auth_token', this.jwtService.sign(JWTPayload), { + httpOnly: true, + sameSite: 'strict', + maxAge: 2 * 365 * 24 * 60 * 60 * 1000, // maximum expiry 2 years + }); + return decamelizeKeys({ id: user.id, - authToken: this.jwtService.sign(JWTPayload), email: user.email, firstName: user.firstName, lastName: user.lastName, - organizationId: organization.id, - organization: organization.name, - admin: await this.usersService.hasGroup(user, 'admin', null, manager), - groupPermissions: await this.usersService.groupPermissions(user, manager), - appGroupPermissions: await this.usersService.appGroupPermissions(user, null, manager), + currentOrganizationId: organization.id, }); } } interface JWTPayload { + sessionId: string; username: string; sub: string; - organizationId: string; + organizationIds: Array; isSSOLogin: boolean; isPasswordLogin: boolean; } diff --git a/server/src/services/organization_users.service.ts b/server/src/services/organization_users.service.ts index ef2cdab2c4..068bbe63b9 100644 --- a/server/src/services/organization_users.service.ts +++ b/server/src/services/organization_users.service.ts @@ -86,11 +86,6 @@ export class OrganizationUsersService { await dbTransactionWrap(async (manager: EntityManager) => { await manager.update(OrganizationUser, id, { status: WORKSPACE_USER_STATUS.INVITED, invitationToken }); - - if (this.configService.get('DISABLE_MULTI_WORKSPACE') === 'true') { - // Resetting password if single organization - await this.usersService.updateUser(id, { password: uuid.v4() }, manager); - } }, manager); this.emailService diff --git a/server/src/services/organizations.service.ts b/server/src/services/organizations.service.ts index 6cc067b1d7..18237aeb35 100644 --- a/server/src/services/organizations.service.ts +++ b/server/src/services/organizations.service.ts @@ -118,9 +118,7 @@ export class OrganizationsService { enable_sign_up: this.configService.get('DISABLE_SIGNUPS') !== 'true', enabled: true, }, - enableSignUp: - this.configService.get('DISABLE_MULTI_WORKSPACE') !== 'true' && - this.configService.get('SSO_DISABLE_SIGNUPS') !== 'true', + enableSignUp: this.configService.get('SSO_DISABLE_SIGNUPS') !== 'true', }; } @@ -252,9 +250,7 @@ export class OrganizationsService { status: orgUser.status, avatarId: orgUser.user.avatarId, ...(orgUser.invitationToken ? { invitationToken: orgUser.invitationToken } : {}), - ...(this.configService.get('DISABLE_MULTI_WORKSPACE') !== 'true' && - this.configService.get('HIDE_ACCOUNT_SETUP_LINK') !== 'true' && - orgUser.user.invitationToken + ...(this.configService.get('HIDE_ACCOUNT_SETUP_LINK') !== 'true' && orgUser.user.invitationToken ? { accountSetupToken: orgUser.user.invitationToken } : {}), }; @@ -355,11 +351,7 @@ export class OrganizationsService { if (!result) return; - if ( - addInstanceLevelSSO && - this.configService.get('DISABLE_MULTI_WORKSPACE') !== 'true' && - result.inheritSSO - ) { + if (addInstanceLevelSSO && result.inheritSSO) { if ( this.configService.get('SSO_GOOGLE_OAUTH2_CLIENT_ID') && !result.ssoConfigs?.some((config) => config.sso === 'google') @@ -534,8 +526,6 @@ export class OrganizationsService { }; const groups = inviteNewUserDto.groups ?? []; - const isSingleWorkspace = this.configService.get('DISABLE_MULTI_WORKSPACE') === 'true'; - return await dbTransactionWrap(async (manager: EntityManager) => { let user = await this.usersService.findByEmail(userParams.email, undefined, undefined, manager); @@ -558,16 +548,14 @@ export class OrganizationsService { ); } - if (!isSingleWorkspace) { - if (!user) { - // User not exist - shouldSendWelcomeMail = true; - // Create default organization if user not exist - defaultOrganization = await this.create('Untitled workspace', null, manager); - } else if (user.invitationToken) { - // User not setup - shouldSendWelcomeMail = true; - } + if (!user) { + // User not exist + shouldSendWelcomeMail = true; + // Create default organization if user not exist + defaultOrganization = await this.create('Untitled workspace', null, manager); + } else if (user.invitationToken) { + // User not setup + shouldSendWelcomeMail = true; } user = await this.usersService.create( userParams, diff --git a/server/src/services/session.service.ts b/server/src/services/session.service.ts new file mode 100644 index 0000000000..9bda277381 --- /dev/null +++ b/server/src/services/session.service.ts @@ -0,0 +1,83 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { EntityManager } from 'typeorm'; +import { dbTransactionWrap } from 'src/helpers/utils.helper'; +import { USER_STATUS } from 'src/helpers/user_lifecycle'; +import { UserSessions } from 'src/entities/user_sessions.entity'; +import { ConfigService } from '@nestjs/config'; +import { Response } from 'express'; +import { User } from 'src/entities/user.entity'; + +@Injectable() +export class SessionService { + constructor(private configService: ConfigService) {} + + async validateUserSession(userId: string, sessionId: string): Promise { + await dbTransactionWrap(async (manager: EntityManager) => { + const session: UserSessions = await manager + .createQueryBuilder(UserSessions, 'user_sessions') + .innerJoin('user_sessions.user', 'user') + .andWhere('user_sessions.expiry >= :now', { + now: new Date(), + }) + .andWhere('user_sessions.id = :sessionId', { + sessionId, + }) + .andWhere('user.id = :userId', { + userId, + }) + .andWhere('user.status = :status', { status: USER_STATUS.ACTIVE }) + .getOne(); + + if (!session) { + throw new UnauthorizedException(); + } + + // extending expiry asynchronously + session.expiry = this.getSessionExpiry(); + manager.save(session).catch((err) => console.error('error while extending user session expiry', err)); + }); + } + + async createSession(userId: string, device: string, manager?: EntityManager): Promise { + return await dbTransactionWrap(async (manager: EntityManager) => { + return await manager.save( + manager.create(UserSessions, { + userId, + device, + createdAt: new Date(), + expiry: this.getSessionExpiry(), + }) + ); + }, manager); + } + + async terminateSession(userId: string, sessionId: string, response: Response): Promise { + response.clearCookie('auth_token'); + await dbTransactionWrap(async (manager: EntityManager) => { + await manager.delete(UserSessions, { id: sessionId, userId }); + }); + } + + getSessionUserDetails(user: User): Partial { + const { firstName, lastName, avatarId, email, id } = user; + return { + firstName, + lastName, + avatarId, + email, + id, + }; + } + + private getSessionExpiry(): Date { + // default expiry 2 days (2880 minutes) + const now = new Date(); + return new Date( + now.getTime() + + (this.configService.get('USER_SESSION_EXPIRY') + ? this.configService.get('USER_SESSION_EXPIRY') + : 2880) * + 60000 + ); + } +} diff --git a/server/src/services/users.service.ts b/server/src/services/users.service.ts index eed21887d7..1e4bf620f2 100644 --- a/server/src/services/users.service.ts +++ b/server/src/services/users.service.ts @@ -362,6 +362,11 @@ export class UsersService { return !!app && app.organizationId === user.organizationId; } + async returnOrgIdOfAnApp(appId: string): Promise { + const app = await this.appsRepository.findOne(appId); + return app?.organizationId; + } + async addAvatar(userId: number, imageBuffer: Buffer, filename: string) { return await dbTransactionWrap(async (manager: EntityManager) => { const user = await manager.findOne(User, userId); diff --git a/server/test/controllers/app.e2e-spec.ts b/server/test/controllers/app.e2e-spec.ts index 5afb49da41..477686d95c 100644 --- a/server/test/controllers/app.e2e-spec.ts +++ b/server/test/controllers/app.e2e-spec.ts @@ -3,7 +3,7 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; import { getManager, Repository, Not } from 'typeorm'; import { User } from 'src/entities/user.entity'; -import { clearDB, createUser, authHeaderForUser, createNestAppInstanceWithEnvMock } from '../test.helper'; +import { clearDB, createUser, createNestAppInstanceWithEnvMock } from '../test.helper'; import { OrganizationUser } from 'src/entities/organization_user.entity'; import { Organization } from 'src/entities/organization.entity'; import { SSOConfigs } from 'src/entities/sso_config.entity'; @@ -38,143 +38,6 @@ describe('Authentication', () => { jest.clearAllMocks(); }); - describe('Single organization', () => { - beforeEach(async () => { - jest.spyOn(mockConfig, 'get').mockImplementation((key: string) => { - switch (key) { - case 'DISABLE_SIGNUPS': - return 'false'; - case 'DISABLE_MULTI_WORKSPACE': - return 'true'; - default: - return process.env[key]; - } - }); - }); - it('should create new users and organization', async () => { - const response = await request(app.getHttpServer()) - .post('/api/setup-admin') - .send({ email: 'test@tooljet.io', name: 'test', password: 'password', workspace: 'tooljet' }); - - expect(response.statusCode).toBe(201); - - const user = await userRepository.findOneOrFail({ - where: { email: 'test@tooljet.io' }, - relations: ['organizationUsers'], - }); - - const organization = await orgRepository.findOneOrFail({ - where: { id: user?.organizationUsers?.[0]?.organizationId }, - }); - - expect(user.defaultOrganizationId).toBe(user?.organizationUsers?.[0]?.organizationId); - expect(organization.name).toBe('tooljet'); - - const groupPermissions = await user.groupPermissions; - const groupNames = groupPermissions.map((x) => x.group); - - expect(new Set(['all_users', 'admin'])).toEqual(new Set(groupNames)); - - const adminGroup = groupPermissions.find((x) => x.group == 'admin'); - expect(adminGroup.appCreate).toBeTruthy(); - expect(adminGroup.appDelete).toBeTruthy(); - expect(adminGroup.folderCreate).toBeTruthy(); - expect(adminGroup.orgEnvironmentVariableCreate).toBeTruthy(); - expect(adminGroup.orgEnvironmentVariableUpdate).toBeTruthy(); - expect(adminGroup.orgEnvironmentVariableDelete).toBeTruthy(); - expect(adminGroup.folderUpdate).toBeTruthy(); - expect(adminGroup.folderDelete).toBeTruthy(); - - const allUserGroup = groupPermissions.find((x) => x.group == 'all_users'); - expect(allUserGroup.appCreate).toBeFalsy(); - expect(allUserGroup.appDelete).toBeFalsy(); - expect(allUserGroup.folderCreate).toBeFalsy(); - expect(allUserGroup.orgEnvironmentVariableCreate).toBeFalsy(); - expect(allUserGroup.orgEnvironmentVariableUpdate).toBeFalsy(); - expect(allUserGroup.orgEnvironmentVariableDelete).toBeFalsy(); - expect(allUserGroup.folderUpdate).toBeFalsy(); - expect(allUserGroup.folderDelete).toBeFalsy(); - }); - describe('Single organization operations', () => { - beforeEach(async () => { - current_organization = (await createUser(app, { email: 'admin@tooljet.io' })).organization; - }); - it('should not create new users since organization already exist', async () => { - const response = await request(app.getHttpServer()) - .post('/api/signup') - .send({ email: 'test@tooljet.io', name: 'test', password: 'password' }); - expect(response.statusCode).toBe(406); - }); - it('authenticate if valid credentials', async () => { - await request(app.getHttpServer()) - .post('/api/authenticate') - .send({ email: 'admin@tooljet.io', password: 'password' }) - .expect(201); - }); - it('authenticate to organization if valid credentials', async () => { - await request(app.getHttpServer()) - .post('/api/authenticate/' + current_organization.id) - .send({ email: 'admin@tooljet.io', password: 'password' }) - .expect(201); - }); - it('throw unauthorized error if user does not exist in given organization if valid credentials', async () => { - await request(app.getHttpServer()) - .post('/api/authenticate/82249621-efc1-4cd2-9986-5c22182fa8a7') - .send({ email: 'admin@tooljet.io', password: 'password' }) - .expect(401); - }); - it('throw 401 if user is archived', async () => { - await createUser(app, { email: 'user@tooljet.io', status: 'archived' }); - - await request(app.getHttpServer()) - .post('/api/authenticate') - .send({ email: 'user@tooljet.io', password: 'password' }) - .expect(401); - - const adminUser = await userRepository.findOneOrFail({ - email: 'admin@tooljet.io', - }); - await orgUserRepository.update({ userId: adminUser.id }, { status: 'archived' }); - - await request(app.getHttpServer()) - .get('/api/organizations/users') - .set('Authorization', authHeaderForUser(adminUser)) - .expect(401); - }); - it('throw 401 if user is invited', async () => { - await createUser(app, { email: 'user@tooljet.io', status: 'invited' }); - - await request(app.getHttpServer()) - .post('/api/authenticate') - .send({ email: 'user@tooljet.io', password: 'password' }) - .expect(401); - - const adminUser = await userRepository.findOneOrFail({ - email: 'admin@tooljet.io', - }); - await orgUserRepository.update({ userId: adminUser.id }, { status: 'invited' }); - - await request(app.getHttpServer()) - .get('/api/organizations/users') - .set('Authorization', authHeaderForUser(adminUser)) - .expect(401); - }); - it('throw 400 if invalid credentials', async () => { - await request(app.getHttpServer()) - .post('/api/authenticate') - .send({ email: 'amdin@tooljet.i0', password: 'password' }) - .expect(400); - }); - it('should throw 401 if form login is disabled', async () => { - await ssoConfigsRepository.update({ organizationId: current_organization.id }, { enabled: false }); - await request(app.getHttpServer()) - .post('/api/authenticate') - .send({ email: 'admin@tooljet.io', password: 'password' }) - .expect(401); - }); - }); - }); - describe('Multi organization', () => { beforeEach(async () => { const { organization, user } = await createUser(app, { @@ -254,16 +117,20 @@ describe('Authentication', () => { expect(allUserGroup.folderDelete).toBeFalsy(); }); it('authenticate if valid credentials', async () => { - await request(app.getHttpServer()) + const response = await request(app.getHttpServer()) .post('/api/authenticate') - .send({ email: 'admin@tooljet.io', password: 'password' }) - .expect(201); + .send({ email: 'admin@tooljet.io', password: 'password' }); + + expect(response.statusCode).toBe(201); + expect(response.headers['set-cookie'][0]).toMatch(/^auth_token=/); }); it('authenticate to organization if valid credentials', async () => { - await request(app.getHttpServer()) + const response = await request(app.getHttpServer()) .post('/api/authenticate/' + current_organization.id) - .send({ email: 'admin@tooljet.io', password: 'password' }) - .expect(201); + .send({ email: 'admin@tooljet.io', password: 'password' }); + + expect(response.statusCode).toBe(201); + expect(response.headers['set-cookie'][0]).toMatch(/^auth_token=/); }); it('throw unauthorized error if user does not exist in given organization if valid credentials', async () => { await request(app.getHttpServer()) @@ -284,10 +151,7 @@ describe('Authentication', () => { }); await orgUserRepository.update({ userId: adminUser.id }, { status: 'archived' }); - await request(app.getHttpServer()) - .get('/api/organizations/users') - .set('Authorization', authHeaderForUser(adminUser)) - .expect(401); + await request(app.getHttpServer()).get('/api/organizations/users').expect(401); }); it('throw 401 if user is invited', async () => { const { orgUser } = await createUser(app, { email: 'user@tooljet.io', status: 'invited' }); @@ -302,10 +166,7 @@ describe('Authentication', () => { }); await orgUserRepository.update({ userId: adminUser.id }, { status: 'invited' }); - await request(app.getHttpServer()) - .get('/api/organizations/users') - .set('Authorization', authHeaderForUser(adminUser)) - .expect(401); + await request(app.getHttpServer()).get('/api/organizations/users').expect(401); }); it('login to new organization if user is archived', async () => { const { orgUser } = await createUser(app, { email: 'user@tooljet.io', status: 'archived' }); @@ -315,8 +176,7 @@ describe('Authentication', () => { .send({ email: 'user@tooljet.io', password: 'password' }); expect(response.statusCode).toBe(201); - expect(response.body.organization_id).not.toBe(orgUser.organizationId); - expect(response.body.organization).toBe('Untitled workspace'); + expect(response.body.current_organization_id).not.toBe(orgUser.organizationId); }); it('login to new organization if user is invited', async () => { const { orgUser } = await createUser(app, { email: 'user@tooljet.io', status: 'invited' }); @@ -326,8 +186,7 @@ describe('Authentication', () => { .send({ email: 'user@tooljet.io', password: 'password' }); expect(response.statusCode).toBe(201); - expect(response.body.organization_id).not.toBe(orgUser.organizationId); - expect(response.body.organization).toBe('Untitled workspace'); + expect(response.body.current_organization_id).not.toBe(orgUser.organizationId); }); it('throw 401 if invalid credentials', async () => { await request(app.getHttpServer()) @@ -466,8 +325,7 @@ describe('Authentication', () => { .post('/api/authenticate') .send({ email: 'admin@tooljet.io', password: 'password' }); expect(response.statusCode).toBe(201); - expect(response.body.organization_id).not.toBe(current_organization.id); - expect(response.body.organization).toBe('Untitled workspace'); + expect(response.body.current_organization_id).not.toBe(current_organization.id); }); it('should be able to switch between organizations with admin privilege', async () => { const { organization: invited_organization } = await createUser( @@ -475,64 +333,26 @@ describe('Authentication', () => { { organizationName: 'New Organization' }, current_user ); + + const authResponse = await request(app.getHttpServer()) + .post('/api/authenticate') + .send({ email: 'admin@tooljet.io', password: 'password' }); + const response = await request(app.getHttpServer()) .get('/api/switch/' + invited_organization.id) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user.defaultOrganizationId) + .set('Cookie', authResponse.headers['set-cookie']); expect(response.statusCode).toBe(200); expect(Object.keys(response.body).sort()).toEqual( - [ - 'id', - 'email', - 'first_name', - 'last_name', - 'auth_token', - 'admin', - 'organization_id', - 'organization', - 'group_permissions', - 'app_group_permissions', - ].sort() + ['id', 'email', 'first_name', 'last_name', 'current_organization_id'].sort() ); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name } = response.body; expect(email).toEqual(current_user.email); expect(first_name).toEqual(current_user.firstName); expect(last_name).toEqual(current_user.lastName); - expect(admin).toBeTruthy(); - expect(organization_id).toBe(invited_organization.id); - expect(organization).toBe(invited_organization.name); - expect(group_permissions).toHaveLength(2); - expect(group_permissions.some((gp) => gp.group === 'all_users')).toBeTruthy(); - expect(group_permissions.some((gp) => gp.group === 'admin')).toBeTruthy(); - expect(Object.keys(group_permissions[0]).sort()).toEqual( - [ - 'id', - 'organization_id', - 'group', - 'app_create', - 'app_delete', - 'updated_at', - 'created_at', - 'folder_create', - 'org_environment_variable_create', - 'org_environment_variable_update', - 'org_environment_variable_delete', - 'folder_delete', - 'folder_update', - ].sort() - ); - expect(app_group_permissions).toHaveLength(0); await current_user.reload(); expect(current_user.defaultOrganizationId).toBe(invited_organization.id); }); @@ -542,63 +362,27 @@ describe('Authentication', () => { { groups: ['all_users'], organizationName: 'New Organization' }, current_user ); + + const authResponse = await request(app.getHttpServer()) + .post('/api/authenticate') + .send({ email: 'admin@tooljet.io', password: 'password' }); + const response = await request(app.getHttpServer()) .get('/api/switch/' + invited_organization.id) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', authResponse.body.current_organization_id) + .set('Cookie', authResponse.headers['set-cookie']); expect(response.statusCode).toBe(200); expect(Object.keys(response.body).sort()).toEqual( - [ - 'id', - 'email', - 'first_name', - 'last_name', - 'auth_token', - 'admin', - 'organization_id', - 'organization', - 'group_permissions', - 'app_group_permissions', - ].sort() + ['id', 'email', 'first_name', 'last_name', 'current_organization_id'].sort() ); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; expect(email).toEqual(current_user.email); expect(first_name).toEqual(current_user.firstName); expect(last_name).toEqual(current_user.lastName); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(invited_organization.id); - expect(organization).toBe(invited_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual( - [ - 'id', - 'organization_id', - 'group', - 'app_create', - 'app_delete', - 'updated_at', - 'created_at', - 'folder_create', - 'org_environment_variable_create', - 'org_environment_variable_update', - 'org_environment_variable_delete', - 'folder_delete', - 'folder_update', - ].sort() - ); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(invited_organization.id); await current_user.reload(); expect(current_user.defaultOrganizationId).toBe(invited_organization.id); }); @@ -730,53 +514,6 @@ describe('Authentication', () => { ); }); }); - - describe('Multi-Workspace Disabled', () => { - beforeEach(() => { - jest.spyOn(mockConfig, 'get').mockImplementation((key: string) => { - switch (key) { - case 'DISABLE_MULTI_WORKSPACE': - return 'true'; - default: - return process.env[key]; - } - }); - }); - - it('should allow users to accept invitation when Multi-Workspace is disabled', async () => { - const userData = await createUser(app, { - email: 'organizationUser@tooljet.io', - status: 'invited', - }); - const { user, orgUser } = userData; - - const response = await request(app.getHttpServer()).post('/api/accept-invite').send({ - token: orgUser.invitationToken, - password: uuidv4(), - }); - - expect(response.statusCode).toBe(201); - - const organizationUser = await getManager().findOneOrFail(OrganizationUser, { where: { userId: user.id } }); - expect(organizationUser.status).toEqual('active'); - }); - - it('should not allow users to accept invitation when user not entered password for single workspace', async () => { - const userData = await createUser(app, { - email: 'organizationUser@tooljet.io', - invitationToken: uuidv4(), - status: 'invited', - }); - const { orgUser } = userData; - - const response = await request(app.getHttpServer()).post('/api/accept-invite').send({ - token: orgUser.invitationToken, - }); - - expect(response.statusCode).toBe(400); - expect(response.body.message).toBe('Please enter password'); - }); - }); }); describe('GET /api/verify-invite-token', () => { @@ -864,66 +601,6 @@ describe('Authentication', () => { expect(redirect_url).toBe(`${process.env['TOOLJET_HOST']}/invitations/${invitationToken}`); }); }); - - describe('Multi-Workspace Disabled', () => { - beforeEach(async () => { - const { organization, user } = await createUser(app, { - email: 'admin@tooljet.io', - firstName: 'user', - lastName: 'name', - }); - current_organization = organization; - current_user = user; - jest.spyOn(mockConfig, 'get').mockImplementation((key: string) => { - switch (key) { - case 'DISABLE_MULTI_WORKSPACE': - return 'true'; - default: - return process.env[key]; - } - }); - }); - it('should return 400 while verifying invalid organization token', async () => { - await request(app.getHttpServer()).get(`/api/verify-organization-token?token=${uuidv4()}`).expect(400); - }); - - it('should return 400 if the user is archived', async () => { - const { - orgUser: { invitationToken }, - } = await createUser(app, { - email: 'organizationUser@tooljet.io', - invitationToken: uuidv4(), - status: 'archived', - }); - - await request(app.getHttpServer()).get(`/api/verify-organization-token?token=${invitationToken}`).expect(400); - }); - - it('should return user info while verifying organization token', async () => { - const userData = await createUser(app, { - email: 'organizationUser@tooljet.io', - invitationToken: uuidv4(), - status: 'invited', - }); - const { - orgUser: { invitationToken }, - user, - } = userData; - const response = await request(app.getHttpServer()).get( - `/api/verify-organization-token?token=${invitationToken}` - ); - const { - body: { email, name, onboarding_details }, - status, - } = response; - expect(status).toBe(200); - expect(email).toEqual('organizationUser@tooljet.io'); - expect(name).toEqual('test test'); - expect(Object.keys(onboarding_details)).toEqual(['password']); - await user.reload(); - expect(user.status).toBe('verified'); - }); - }); }); afterAll(async () => { diff --git a/server/test/controllers/app_users.e2e-spec.ts b/server/test/controllers/app_users.e2e-spec.ts index 1295b15d23..0d03a206fb 100644 --- a/server/test/controllers/app_users.e2e-spec.ts +++ b/server/test/controllers/app_users.e2e-spec.ts @@ -1,12 +1,13 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; import { - authHeaderForUser, clearDB, createApplication, createUser, createNestAppInstance, generateAppDefaults, + authenticateUser, + logoutUser, } from '../test.helper'; describe('app_users controller', () => { @@ -29,6 +30,9 @@ describe('app_users controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app); + const developerUserData = await createUser(app, { email: 'dev@tooljet.io', groups: ['all_users', 'developer'], @@ -38,7 +42,8 @@ describe('app_users controller', () => { const response = await request(app.getHttpServer()) .post(`/api/app_users`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ app_id: application.id, org_user_id: developerUserData.orgUser.id, @@ -47,6 +52,8 @@ describe('app_users controller', () => { }); expect(response.statusCode).toBe(201); + + await logoutUser(app, loggedUser.tokenCookie, adminUserData.user.defaultOrganizationId); }); it('should not be able to create new app user if admin of another organization', async () => { @@ -69,9 +76,12 @@ describe('app_users controller', () => { user: adminUserData.user, }); + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + const response = await request(app.getHttpServer()) .post(`/api/app_users`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)) + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ app_id: application.id, org_user_id: adminUserData.orgUser.id, @@ -79,6 +89,8 @@ describe('app_users controller', () => { }); expect(response.statusCode).toBe(403); + + await logoutUser(app, loggedUser.tokenCookie, anotherOrgAdminUserData.user.defaultOrganizationId); }); it('should not allow developers and viewers to create app users', async () => { @@ -102,9 +114,12 @@ describe('app_users controller', () => { organization: adminUserData.organization, }); + const loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + let response = await request(app.getHttpServer()) .post(`/api/app_users/`) - .set('Authorization', authHeaderForUser(developerUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ app_id: application.id, org_user_id: viewerUserData.orgUser.id, @@ -112,15 +127,19 @@ describe('app_users controller', () => { }); expect(response.statusCode).toBe(403); + await logoutUser(app, loggedUser.tokenCookie, developerUserData.user.defaultOrganizationId); + const loggedDeveloperUser = await authenticateUser(app, 'viewer@tooljet.io'); + response = response = await request(app.getHttpServer()) .post(`/api/app_users/`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('Cookie', loggedDeveloperUser.tokenCookie) .send({ app_id: application.id, org_user_id: developerUserData.orgUser.id, groups: ['all_users', 'admin'], }); + await logoutUser(app, loggedDeveloperUser.tokenCookie, viewerUserData.user.defaultOrganizationId); await application.reload(); }); diff --git a/server/test/controllers/apps.e2e-spec.ts b/server/test/controllers/apps.e2e-spec.ts index 7276340389..6e05862f28 100644 --- a/server/test/controllers/apps.e2e-spec.ts +++ b/server/test/controllers/apps.e2e-spec.ts @@ -1,7 +1,6 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; import { - authHeaderForUser, clearDB, createApplication, createUser, @@ -13,6 +12,8 @@ import { createAppEnvironments, createDataSourceOption, generateAppDefaults, + authenticateUser, + logoutUser, } from '../test.helper'; import { App } from 'src/entities/app.entity'; import { AppVersion } from 'src/entities/app_version.entity'; @@ -35,8 +36,6 @@ describe('apps controller', () => { beforeAll(async () => { app = await createNestAppInstance(); - app.setGlobalPrefix('/api'); - await app.init(); }); describe('GET /api/apps/:id', () => { @@ -52,18 +51,29 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const organization = adminUserData.organization; const developerUserData = await createUser(app, { email: 'developer@tooljet.io', groups: ['all_users', 'developer'], organization, }); + + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users', 'viewer'], organization, }); + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -73,17 +83,23 @@ describe('apps controller', () => { for (const userData of [viewerUserData, developerUserData]) { const response = await request(app.getHttpServer()) .post(`/api/apps`) - .set('Authorization', authHeaderForUser(userData.user)); + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(403); } const response = await request(app.getHttpServer()) .post(`/api/apps`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toBe(201); expect(response.body.name).toBe('Untitled app'); + + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); + await logoutUser(app, viewerUserData['tokenCookie'], viewerUserData.user.defaultOrganizationId); + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); }); }); @@ -93,9 +109,12 @@ describe('apps controller', () => { groups: ['all_users', 'admin'], }); + const loggedUser = await authenticateUser(app); + const response = await request(app.getHttpServer()) .post(`/api/apps`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(201); expect(response.body.name).toBe('Untitled app'); @@ -105,6 +124,8 @@ describe('apps controller', () => { expect(application.name).toBe('Untitled app'); expect(application.id).toBe(application.slug); + + // await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); }); }); @@ -121,6 +142,10 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const organization = adminUserData.organization; const allUserGroup = await getManager().findOneOrFail(GroupPermission, { where: { @@ -134,10 +159,17 @@ describe('apps controller', () => { organization, }); + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const anotherOrgAdminUserData = await createUser(app, { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + + loggedUser = await authenticateUser(app, 'another@tooljet.io'); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const anotherApplication = await createApplication(app, { name: 'Another organization App', user: anotherOrgAdminUserData.user, @@ -188,7 +220,8 @@ describe('apps controller', () => { let response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(developerUserData.user)); + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']); expect(response.statusCode).toBe(200); @@ -207,7 +240,8 @@ describe('apps controller', () => { response = await request(app.getHttpServer()) .get(`/api/apps?searchKey=public`) - .set('Authorization', authHeaderForUser(developerUserData.user)); + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']); expect(response.statusCode).toBe(200); @@ -224,7 +258,8 @@ describe('apps controller', () => { response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(200); @@ -241,7 +276,8 @@ describe('apps controller', () => { response = await request(app.getHttpServer()) .get(`/api/apps?searchKey=another`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(200); @@ -258,7 +294,8 @@ describe('apps controller', () => { response = await request(app.getHttpServer()) .get(`/api/apps?searchKey=public`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(200); @@ -272,6 +309,14 @@ describe('apps controller', () => { folder_count: 0, current_page: 1, }); + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); + await logoutUser( + app, + anotherOrgAdminUserData['tokenCookie'], + anotherOrgAdminUserData.user.defaultOrganizationId + ); }); }); @@ -281,6 +326,8 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; const organization = adminUserData.organization; const folder = await getManager().save(Folder, { name: 'Folder', @@ -291,7 +338,8 @@ describe('apps controller', () => { groups: ['all_users', 'developer'], organization, }); - + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; const anotherOrgAdminUserData = await createUser(app, { email: 'another@tooljet.io', groups: ['all_users', 'admin'], @@ -357,7 +405,8 @@ describe('apps controller', () => { let response = await request(app.getHttpServer()) .get(`/api/apps`) .query({ folder: folder.id, page: 1 }) - .set('Authorization', authHeaderForUser(developerUserData.user)); + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']); expect(response.statusCode).toBe(200); @@ -375,7 +424,8 @@ describe('apps controller', () => { response = await request(app.getHttpServer()) .get(`/api/apps?searchKey=public app in`) .query({ folder: folder.id, page: 1 }) - .set('Authorization', authHeaderForUser(developerUserData.user)); + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']); expect(response.statusCode).toBe(200); @@ -389,6 +439,8 @@ describe('apps controller', () => { folder_count: 1, current_page: 1, }); + + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); }); }); }); @@ -400,18 +452,27 @@ describe('apps controller', () => { groups: ['all_users', 'admin'], }); + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerUserData = await createUser(app, { email: 'dev@tooljet.io', groups: ['all_users', 'developer'], organization: adminUserData.organization, }); + loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users', 'viewer'], organization: adminUserData.organization, }); + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'App to clone', user: adminUserData.user, @@ -423,7 +484,8 @@ describe('apps controller', () => { let response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/clone`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toBe(201); @@ -433,15 +495,21 @@ describe('apps controller', () => { response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/clone`) - .set('Authorization', authHeaderForUser(developerUserData.user)); + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']); expect(response.statusCode).toBe(403); response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/clone`) - .set('Authorization', authHeaderForUser(viewerUserData.user)); + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']); expect(response.statusCode).toBe(403); + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); + await logoutUser(app, viewerUserData['tokenCookie'], viewerUserData.user.defaultOrganizationId); + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); }); it('should not be able to clone the app if app is of another organization', async () => { @@ -449,10 +517,14 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + const anotherOrgAdminUserData = await createUser(app, { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -460,9 +532,12 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/clone`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(403); + + await logoutUser(app, loggedUser.tokenCookie, anotherOrgAdminUserData.user.defaultOrganizationId); }); }); @@ -472,18 +547,24 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app); + const application = await createApplication(app, { user: adminUserData.user, }); const response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ app: { name: 'new name' } }); expect(response.statusCode).toBe(200); await application.reload(); expect(application.name).toBe('new name'); + + await logoutUser(app, loggedUser.tokenCookie, adminUserData.user.defaultOrganizationId); }); it('should not be able to update name of the app if admin of another organization', async () => { @@ -500,14 +581,19 @@ describe('apps controller', () => { user: adminUserData.user, }); + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + const response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)) + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ app: { name: 'new name' } }); expect(response.statusCode).toBe(403); await application.reload(); expect(application.name).toBe('name'); + + await logoutUser(app, loggedUser.tokenCookie, anotherOrgAdminUserData.user.defaultOrganizationId); }); it('should not allow custom groups without app create permission to change the name of apps', async () => { @@ -525,35 +611,51 @@ describe('apps controller', () => { groups: ['all_users', 'developer'], organization: adminUserData.organization, }); + + let loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users', 'viewer'], organization: adminUserData.organization, }); + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + let response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}`) - .set('Authorization', authHeaderForUser(developerUserData.user)) + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']) .send({ app: { name: 'new name' } }); expect(response.statusCode).toBe(403); response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send({ app: { name: 'new name' } }); expect(response.statusCode).toBe(403); await application.reload(); expect(application.name).toBe('name'); + + await logoutUser(app, viewerUserData['tokenCookie'], viewerUserData.user.defaultOrganizationId); + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); }); }); describe('DELETE delete app', () => { it('should be possible for the admin to delete an app, cascaded with its versions, queries, data sources and comments', async () => { const admin = await createUser(app, { - email: 'adminForDelete@tooljet.io', + email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app); + admin['tokenCookie'] = loggedUser.tokenCookie; + const { user } = await createUser(app, { firstName: 'mention', lastName: 'user', @@ -579,7 +681,8 @@ describe('apps controller', () => { const threadResponse = await request(app.getHttpServer()) .post(`/api/threads`) - .set('Authorization', authHeaderForUser(admin.user)) + .set('tj-workspace-id', admin.user.defaultOrganizationId) + .set('Cookie', admin['tokenCookie']) .send({ appId: application.id, appVersionsId: version.id, @@ -592,7 +695,8 @@ describe('apps controller', () => { const commentsResponse = await request(app.getHttpServer()) .post(`/api/comments`) - .set('Authorization', authHeaderForUser(admin.user)) + .set('tj-workspace-id', admin.user.defaultOrganizationId) + .set('Cookie', admin['tokenCookie']) .send({ threadId: thread.id, comment: '(@mention user) ', @@ -603,7 +707,8 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .delete(`/api/apps/${application.id}`) - .set('Authorization', authHeaderForUser(admin.user)); + .set('tj-workspace-id', admin.user.defaultOrganizationId) + .set('Cookie', admin['tokenCookie']); expect(response.statusCode).toBe(200); @@ -612,6 +717,8 @@ describe('apps controller', () => { await expect(DataQuery.findOneOrFail({ where: { id: dataQuery.id } })).rejects.toThrow(expect.any(Error)); await expect(DataSource.findOneOrFail({ where: { id: dataSource.id } })).rejects.toThrow(expect.any(Error)); await expect(AppUser.findOneOrFail({ where: { appId: application.id } })).rejects.toThrow(expect.any(Error)); + + await logoutUser(app, admin['tokenCookie'], admin.user.defaultOrganizationId); }); it('should be possible for app creator to delete an app', async () => { @@ -619,6 +726,10 @@ describe('apps controller', () => { email: 'developer@tooljet.io', groups: ['all_users', 'developer'], }); + + const loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developer['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'AppTObeDeleted', user: developer.user, @@ -633,10 +744,13 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .delete(`/api/apps/${application.id}`) - .set('Authorization', authHeaderForUser(developer.user)); + .set('tj-workspace-id', developer.user.defaultOrganizationId) + .set('Cookie', developer['tokenCookie']); expect(response.statusCode).toBe(200); await expect(App.findOneOrFail({ where: { id: application.id } })).rejects.toThrow(expect.any(Error)); + + await logoutUser(app, developer['tokenCookie'], developer.user.defaultOrganizationId); }); it('should not be possible for non admin to delete an app', async () => { @@ -644,6 +758,7 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -655,13 +770,18 @@ describe('apps controller', () => { organization: adminUserData.organization, }); + const loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .delete(`/api/apps/${application.id}`) - .set('Authorization', authHeaderForUser(developerUserData.user)); + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']); expect(response.statusCode).toBe(403); await expect(App.findOneOrFail({ where: { id: application.id } })).resolves; + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); }); }); @@ -678,10 +798,15 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + const anotherOrgAdminUserData = await createUser(app, { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -689,9 +814,12 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .get(`/api/apps/${application.id}/users`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(403); + + await logoutUser(app, anotherOrgAdminUserData['tokenCookie'], anotherOrgAdminUserData.user.defaultOrganizationId); }); xit('should be able to fetch app users if group is admin/developer/viewer of same organization', async () => { @@ -699,18 +827,29 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const organization = adminUserData.organization; const developerUserData = await createUser(app, { email: 'developer@tooljet.io', groups: ['all_users', 'developer'], organization, }); + + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users', 'viewer'], organization, }); + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -719,11 +858,16 @@ describe('apps controller', () => { for (const userData of [adminUserData, developerUserData, viewerUserData]) { const response = await request(app.getHttpServer()) .get(`/api/apps/${application.id}/users`) - .set('Authorization', authHeaderForUser(userData.user)); + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(200); expect(response.body.users.length).toBe(1); } + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); + await logoutUser(app, viewerUserData['tokenCookie'], viewerUserData.user.defaultOrganizationId); }); }); @@ -734,6 +878,10 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const organization = adminUserData.organization; const defaultUserData = await createUser(app, { email: 'developer@tooljet.io', @@ -741,6 +889,9 @@ describe('apps controller', () => { organization, }); + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + defaultUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -761,7 +912,8 @@ describe('apps controller', () => { for (const userData of [adminUserData, defaultUserData]) { const response = await request(app.getHttpServer()) .get(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(userData.user)); + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(200); expect(response.body.versions.length).toBe(1); @@ -780,6 +932,10 @@ describe('apps controller', () => { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -788,9 +944,12 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .get(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(403); + + await logoutUser(app, loggedUser.tokenCookie, anotherOrgAdminUserData.user.defaultOrganizationId); }); it('should be able to create a new app version if group is admin or has app update permission group in same organization', async () => { @@ -798,11 +957,19 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerUserData = await createUser(app, { email: 'dev@tooljet.io', groups: ['all_users', 'developer'], organization: adminUserData.organization, }); + + loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { user: adminUserData.user, }); @@ -822,7 +989,8 @@ describe('apps controller', () => { for (const [index, userData] of [adminUserData, developerUserData].entries()) { const response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ versionName: `v_${index}`, versionFromId: version.id, @@ -830,12 +998,19 @@ describe('apps controller', () => { expect(response.statusCode).toBe(201); } + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); }); it('should be able to create a new app version from existing version', async () => { const adminUserData = await createUser(app, { email: 'admin@tooljet.io', }); + + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { user: adminUserData.user, }); @@ -846,7 +1021,8 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ versionName: 'v2', versionFromId: v1.id, @@ -858,6 +1034,8 @@ describe('apps controller', () => { where: { name: 'v2' }, }); expect(v2.definition).toEqual(v1.definition); + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); }); it('should not be able to create app versions if user of another organization', async () => { @@ -865,10 +1043,18 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const anotherOrgAdminUserData = await createUser(app, { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + + loggedUser = await authenticateUser(app, 'another@tooljet.io'); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -877,12 +1063,18 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)) + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']) .send({ versionName: 'v0', }); expect(response.statusCode).toBe(403); + await logoutUser( + app, + anotherOrgAdminUserData['tokenCookie'], + anotherOrgAdminUserData.user.defaultOrganizationId + ); }); it('should not be able to create app versions if user does not have app create permission group', async () => { @@ -890,11 +1082,19 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users'], organization: adminUserData.organization, }); + + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -903,12 +1103,15 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send({ versionName: 'v0', }); expect(response.statusCode).toBe(403); + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); + await logoutUser(app, viewerUserData['tokenCookie'], viewerUserData.user.defaultOrganizationId); }); }); @@ -918,6 +1121,10 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { user: adminUserData.user, }); @@ -958,7 +1165,8 @@ describe('apps controller', () => { // subsequent version creation will copy and create new data sources and queries from previous version const version2 = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ versionName: 'v2', versionFromId: version.id, @@ -973,7 +1181,8 @@ describe('apps controller', () => { const version3 = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ versionName: 'v3', versionFromId: version2.body.id, @@ -1002,13 +1211,15 @@ describe('apps controller', () => { const version4 = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ versionName: 'v4', versionFromId: 'a77b051a-dd48-4633-a01f-089a845d5f88', }); expect(version4.statusCode).toBe(500); + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); }); //will fix this @@ -1016,6 +1227,10 @@ describe('apps controller', () => { const adminUserData = await createUser(app, { email: 'admin@tooljet.io', }); + + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const { application, appVersion: initialVersion } = await generateAppDefaults(app, adminUserData.user, { dsOptions: [{ key: 'foo', value: 'bar', encrypted: 'true' }], }); @@ -1027,7 +1242,8 @@ describe('apps controller', () => { let response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ versionName: 'v1', }); @@ -1037,7 +1253,8 @@ describe('apps controller', () => { response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ versionName: 'v1', versionFromId: initialVersion.id, @@ -1047,7 +1264,8 @@ describe('apps controller', () => { response = await request(app.getHttpServer()) .post(`/api/apps/${application.id}/versions`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ versionName: 'v2', versionFromId: response.body.id, @@ -1060,6 +1278,8 @@ describe('apps controller', () => { credentials = await getManager().find(Credential); expect([...new Set(credentials.map((c) => c.valueCiphertext))]).toEqual(['strongPassword']); + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); }); }); }); @@ -1073,10 +1293,15 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + const anotherOrgAdminUserData = await createUser(app, { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1085,9 +1310,15 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .delete(`/api/apps/${application.id}/versions/${version.id}`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(403); + await logoutUser( + app, + anotherOrgAdminUserData['tokenCookie'], + anotherOrgAdminUserData.user.defaultOrganizationId + ); }); it('should be able to delete an app version if group is admin or has app update permission group in same organization', async () => { @@ -1095,11 +1326,19 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerUserData = await createUser(app, { email: 'dev@tooljet.io', groups: ['all_users', 'developer'], organization: adminUserData.organization, }); + + loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { user: adminUserData.user, }); @@ -1121,15 +1360,20 @@ describe('apps controller', () => { let response = await request(app.getHttpServer()) .delete(`/api/apps/${application.id}/versions/${version1.id}`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toBe(200); response = await request(app.getHttpServer()) .delete(`/api/apps/${application.id}/versions/${version2.id}`) - .set('Authorization', authHeaderForUser(developerUserData.user)); + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']); expect(response.statusCode).toBe(403); + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); }); it('should not be able to delete app versions if user does not have app update permission group', async () => { @@ -1137,11 +1381,16 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users'], organization: adminUserData.organization, }); + + const loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1150,9 +1399,11 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .delete(`/api/apps/${application.id}/versions/${version.id}`) - .set('Authorization', authHeaderForUser(viewerUserData.user)); + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']); expect(response.statusCode).toBe(403); + await logoutUser(app, viewerUserData['tokenCookie'], viewerUserData.user.defaultOrganizationId); }); it('should not be able to delete released app version', async () => { @@ -1160,6 +1411,10 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1171,10 +1426,13 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .delete(`/api/apps/${application.id}/versions/${version.id}`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toBe(400); expect(response.body.message).toBe('You cannot delete a released version'); + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); }); }); }); @@ -1186,11 +1444,19 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerUserData = await createUser(app, { email: 'dev@tooljet.io', groups: ['all_users'], organization: adminUserData.organization, }); + + loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { user: adminUserData.user, }); @@ -1210,10 +1476,14 @@ describe('apps controller', () => { for (const userData of [adminUserData, developerUserData]) { const response = await request(app.getHttpServer()) .get(`/api/apps/${application.id}/versions/${version.id}`) - .set('Authorization', authHeaderForUser(userData.user)); + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(200); } + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); }); it('should not be able to get app versions if user of another organization', async () => { @@ -1231,11 +1501,20 @@ describe('apps controller', () => { }); const version = await createApplicationVersion(app, application); + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .get(`/api/apps/${application.id}/versions/${version.id}`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(403); + await logoutUser( + app, + anotherOrgAdminUserData['tokenCookie'], + anotherOrgAdminUserData.user.defaultOrganizationId + ); }); }); @@ -1245,11 +1524,19 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app, 'admin@tooljet.io'); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerUserData = await createUser(app, { email: 'dev@tooljet.io', groups: ['all_users', 'developer'], organization: adminUserData.organization, }); + + loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { user: adminUserData.user, }); @@ -1271,7 +1558,8 @@ describe('apps controller', () => { count++; const response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}/versions/${version.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ name: 'test' + count, definition: { components: {} }, @@ -1280,6 +1568,9 @@ describe('apps controller', () => { expect(response.statusCode).toBe(200); await version.reload(); } + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); }); it('should not be able to update app version if no app create permission within same organization', async () => { @@ -1292,6 +1583,10 @@ describe('apps controller', () => { groups: ['all_users'], organization: adminUserData.organization, }); + + const loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { user: adminUserData.user, }); @@ -1299,13 +1594,15 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}/versions/${version.id}`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send({ name: 'test', definition: { components: {} }, }); expect(response.statusCode).toBe(403); + await logoutUser(app, viewerUserData['tokenCookie'], viewerUserData.user.defaultOrganizationId); }); it('should not be able to update app versions if user of another organization', async () => { @@ -1313,10 +1610,15 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + const anotherOrgAdminUserData = await createUser(app, { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1325,13 +1627,19 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}/versions/${version.id}`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)) + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']) .send({ name: 'test', definition: { components: {} }, }); expect(response.statusCode).toBe(403); + await logoutUser( + app, + anotherOrgAdminUserData['tokenCookie'], + anotherOrgAdminUserData.user.defaultOrganizationId + ); }); it('should not be able to update app versions if the version is already released', async () => { @@ -1339,6 +1647,9 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { user: adminUserData.user, }); @@ -1347,7 +1658,8 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}/versions/${version.id}`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ name: 'test', definition: { components: {} }, @@ -1355,6 +1667,7 @@ describe('apps controller', () => { expect(response.statusCode).toBe(400); expect(response.body.message).toBe('You cannot update a released version'); + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); }); }); }); @@ -1371,16 +1684,28 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerUserData = await createUser(app, { email: 'developer@tooljet.io', groups: ['all_users', 'developer'], organization: adminUserData.organization, }); + + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users', 'viewer'], organization: adminUserData.organization, }); + + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1413,10 +1738,14 @@ describe('apps controller', () => { for (const userData of [adminUserData, developerUserData, viewerUserData]) { const response = await request(app.getHttpServer()) .get('/api/apps/slugs/foo') - .set('Authorization', authHeaderForUser(userData.user)); + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(200); } + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); + await logoutUser(app, viewerUserData['tokenCookie'], viewerUserData.user.defaultOrganizationId); }); it('should not be able to fetch app using slug if member of another organization', async () => { @@ -1428,6 +1757,9 @@ describe('apps controller', () => { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1437,9 +1769,11 @@ describe('apps controller', () => { await createApplicationVersion(app, application); const response = await request(app.getHttpServer()) .get('/api/apps/slugs/foo') - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); - expect(response.statusCode).toBe(403); + expect(response.statusCode).toBe(401); + + await logoutUser(app, anotherOrgAdminUserData['tokenCookie'], anotherOrgAdminUserData.user.defaultOrganizationId); }); it('should be able to fetch app using slug if a public app ( even if unauthenticated )', async () => { @@ -1468,16 +1802,28 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerUserData = await createUser(app, { email: 'developer@tooljet.io', groups: ['all_users', 'developer'], organization: adminUserData.organization, }); + + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users', 'viewer'], organization: adminUserData.organization, }); + + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1499,14 +1845,16 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .get(`/api/apps/${application.id}/export`) - .set('Authorization', authHeaderForUser(viewerUserData.user)); + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']); expect(response.statusCode).toBe(403); for (const userData of [adminUserData, developerUserData]) { const response = await request(app.getHttpServer()) .get(`/api/apps/${application.id}/export`) - .set('Authorization', authHeaderForUser(userData.user)); + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(200); expect(response.body.appV2.id).toBe(application.id); @@ -1514,6 +1862,10 @@ describe('apps controller', () => { expect(response.body.appV2.isPublic).toBe(application.isPublic); expect(response.body.appV2.organizationId).toBe(application.organizationId); } + + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); + await logoutUser(app, viewerUserData['tokenCookie'], viewerUserData.user.defaultOrganizationId); }); it('should not be able to export app if member of another organization', async () => { @@ -1521,10 +1873,15 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + const anotherOrgAdminUserData = await createUser(app, { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1533,9 +1890,11 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .get(`/api/apps/${application.id}/export`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(403); + await logoutUser(app, anotherOrgAdminUserData['tokenCookie'], anotherOrgAdminUserData.user.defaultOrganizationId); }); it('should not be able to export app if it is a public app for an unauthenticated user', async () => { @@ -1562,18 +1921,29 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const organization = adminUserData.organization; const developerUserData = await createUser(app, { email: 'developer@tooljet.io', groups: ['all_users', 'developer'], organization, }); + + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users', 'viewer'], organization, }); + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1583,14 +1953,16 @@ describe('apps controller', () => { for (const userData of [viewerUserData, developerUserData]) { const response = await request(app.getHttpServer()) .post('/api/apps/import') - .set('Authorization', authHeaderForUser(userData.user)); + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(403); } const response = await request(app.getHttpServer()) .post('/api/apps/import') - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ name: 'Imported App' }); expect(response.statusCode).toBe(201); @@ -1613,14 +1985,19 @@ describe('apps controller', () => { user: adminUserData.user, }); + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}/icons`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ icon: 'new-icon-name' }); expect(response.statusCode).toBe(200); await application.reload(); expect(application.icon).toBe('new-icon-name'); + await logoutUser(app, adminUserData['tokenCookie'], adminUserData.user.defaultOrganizationId); }); it('should not be able to update icon of the app if admin of another organization', async () => { @@ -1632,6 +2009,8 @@ describe('apps controller', () => { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + const loggedUser = await authenticateUser(app, 'another@tooljet.io'); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1639,12 +2018,14 @@ describe('apps controller', () => { const response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}/icons`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)) + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']) .send({ icon: 'new-icon-name' }); expect(response.statusCode).toBe(403); await application.reload(); expect(application.icon).toBe(null); + await logoutUser(app, anotherOrgAdminUserData['tokenCookie'], anotherOrgAdminUserData.user.defaultOrganizationId); }); it('should not allow custom groups without app create permission to change the name of apps', async () => { @@ -1652,6 +2033,7 @@ describe('apps controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + const application = await createApplication(app, { name: 'name', user: adminUserData.user, @@ -1662,26 +2044,38 @@ describe('apps controller', () => { groups: ['all_users', 'developer'], organization: adminUserData.organization, }); + + let loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users', 'viewer'], organization: adminUserData.organization, }); + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + let response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}/icons`) - .set('Authorization', authHeaderForUser(developerUserData.user)) + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']) .send({ icon: 'new-icon' }); expect(response.statusCode).toBe(403); response = await request(app.getHttpServer()) .put(`/api/apps/${application.id}/icons`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send({ icon: 'new-icon' }); expect(response.statusCode).toBe(403); await application.reload(); expect(application.icon).toBe(null); + + await logoutUser(app, developerUserData['tokenCookie'], developerUserData.user.defaultOrganizationId); + await logoutUser(app, viewerUserData['tokenCookie'], viewerUserData.user.defaultOrganizationId); }); }); diff --git a/server/test/controllers/comment.e2e-spec.ts b/server/test/controllers/comment.e2e-spec.ts index b096078dd0..1089ecdf2b 100644 --- a/server/test/controllers/comment.e2e-spec.ts +++ b/server/test/controllers/comment.e2e-spec.ts @@ -1,13 +1,14 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; import { - authHeaderForUser, createThread, clearDB, createApplication, createUser, createNestAppInstance, createApplicationVersion, + authenticateUser, + logoutUser, } from '../test.helper'; describe('comment controller', () => { @@ -46,10 +47,19 @@ describe('comment controller', () => { appVersionsId: version.id, }); + const loggedUser = await authenticateUser(app, user.email); + const response = await request(app.getHttpServer()) .get(`/api/comments/${thread.id}/all`) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); + + await logoutUser(app, loggedUser.tokenCookie, user.defaultOrganizationId); + }); + + afterAll(async () => { + await app.close(); }); }); diff --git a/server/test/controllers/data_queries.e2e-spec.ts b/server/test/controllers/data_queries.e2e-spec.ts index 6eb514e9cb..ab50720d4e 100644 --- a/server/test/controllers/data_queries.e2e-spec.ts +++ b/server/test/controllers/data_queries.e2e-spec.ts @@ -1,13 +1,13 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; import { - authHeaderForUser, clearDB, createUser, createNestAppInstance, createDataQuery, createAppGroupPermission, generateAppDefaults, + authenticateUser, } from '../test.helper'; import { getManager, getRepository } from 'typeorm'; import { GroupPermission } from 'src/entities/group_permission.entity'; @@ -29,20 +29,28 @@ describe('data queries controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + let loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; const developerUserData = await createUser(app, { email: 'developer@tooljet.io', groups: ['all_users', 'developer'], organization: adminUserData.organization, }); + loggedUser = await authenticateUser(app, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['all_users', 'viewer'], organization: adminUserData.organization, }); + loggedUser = await authenticateUser(app, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; const anotherOrgAdminUserData = await createUser(app, { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + loggedUser = await authenticateUser(app, anotherOrgAdminUserData.user.email); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; const { application, dataQuery } = await generateAppDefaults(app, adminUserData.user, {}); @@ -74,7 +82,8 @@ describe('data queries controller', () => { const newOptions = { method: userData.user.email }; const response = await request(app.getHttpServer()) .patch(`/api/data_queries/${dataQuery.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ options: newOptions, }); @@ -89,7 +98,8 @@ describe('data queries controller', () => { const oldOptions = dataQuery.options; const response = await request(app.getHttpServer()) .patch(`/api/data_queries/${dataQuery.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ options: { method: '' }, }); @@ -105,6 +115,8 @@ describe('data queries controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + let loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; const developerUserData = await createUser(app, { email: 'developer@tooljet.io', groups: ['all_users', 'developer'], @@ -123,6 +135,13 @@ describe('data queries controller', () => { isQueryNeeded: false, }); + loggedUser = await authenticateUser(app, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, anotherOrgAdminUserData.user.email); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + // setup app permissions for developer const developerUserGroup = await getRepository(GroupPermission).findOneOrFail({ where: { @@ -151,7 +170,8 @@ describe('data queries controller', () => { const response = await request(app.getHttpServer()) .delete(`/api/data_queries/${dataQuery.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ options: newOptions, }); @@ -176,7 +196,8 @@ describe('data queries controller', () => { const response = await request(app.getHttpServer()) .delete(`/api/data_queries/${dataQuery.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ options: { method: '' }, }); @@ -206,10 +227,19 @@ describe('data queries controller', () => { isQueryNeeded: false, }); + let loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const anotherOrgAdminUserData = await createUser(app, { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + loggedUser = await authenticateUser(app, anotherOrgAdminUserData.user.email); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; const allUserGroup = await getManager().findOneOrFail(GroupPermission, { where: { group: 'all_users', organization: adminUserData.organization }, @@ -242,7 +272,8 @@ describe('data queries controller', () => { for (const userData of [adminUserData, developerUserData]) { const response = await request(app.getHttpServer()) .get(`/api/data_queries?app_version_id=${appVersion.id}`) - .set('Authorization', authHeaderForUser(userData.user)); + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(200); expect(response.body.data_queries.length).toBe(1); @@ -250,14 +281,16 @@ describe('data queries controller', () => { let response = await request(app.getHttpServer()) .get(`/api/data_queries?app_version_id=${appVersion.id}`) - .set('Authorization', authHeaderForUser(viewerUserData.user)); + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']); expect(response.statusCode).toBe(200); // Forbidden if user of another organization response = await request(app.getHttpServer()) .get(`/api/data_queries?app_version_id=${appVersion.id}`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(403); }); @@ -278,16 +311,21 @@ describe('data queries controller', () => { options: { method: 'get' }, }); + const loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + let response = await request(app.getHttpServer()) .get(`/api/data_queries?app_version_id=${appVersion.id}`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toBe(200); expect(response.body.data_queries.length).toBe(1); response = await request(app.getHttpServer()) .get(`/api/data_queries?app_version_id=62929ad6-11ae-4655-bb3e-2d2465b58950`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toBe(500); }); @@ -319,6 +357,15 @@ describe('data queries controller', () => { groups: ['all_users', 'admin'], }); + let loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, anotherOrgAdminUserData.user.email); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + // setup app permissions for developer const developerUserGroup = await getRepository(GroupPermission).findOneOrFail({ where: { @@ -342,7 +389,8 @@ describe('data queries controller', () => { for (const userData of [adminUserData, developerUserData]) { const response = await request(app.getHttpServer()) .post(`/api/data_queries`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send(requestBody); expect(response.statusCode).toBe(201); @@ -357,7 +405,8 @@ describe('data queries controller', () => { for (const userData of [anotherOrgAdminUserData, viewerUserData]) { const response = await request(app.getHttpServer()) .post(`/api/data_queries`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send(requestBody); expect(response.statusCode).toBe(403); @@ -387,6 +436,9 @@ describe('data queries controller', () => { const createdQueries = []; const totalQueries = 15; + const loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + for (let i = 1; i <= totalQueries; i++) { const queryParams = { name: `restapi${i}`, @@ -399,7 +451,8 @@ describe('data queries controller', () => { const response = await request(app.getHttpServer()) .post(`/api/data_queries`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send(queryParams); response.body['plugin'] = null; @@ -411,7 +464,8 @@ describe('data queries controller', () => { const response = await request(app.getHttpServer()) .get(`/api/data_queries?app_version_id=${appVersion.id}`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toBe(200); expect(response.body.data_queries.length).toBe(totalQueries); @@ -444,6 +498,13 @@ describe('data queries controller', () => { const { application, dataQuery } = await generateAppDefaults(app, adminUserData.user, {}); + let loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + // setup app permissions for developer const developerUserGroup = await getRepository(GroupPermission).findOneOrFail({ where: { @@ -471,7 +532,8 @@ describe('data queries controller', () => { for (const userData of [adminUserData, developerUserData, viewerUserData]) { const response = await request(app.getHttpServer()) .post(`/api/data_queries/${dataQuery.id}/run`) - .set('Authorization', authHeaderForUser(userData.user)); + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(201); expect(response.body.data.length).toBe(30); @@ -488,10 +550,14 @@ describe('data queries controller', () => { groups: ['all_users', 'admin'], }); + const loggedUser = await authenticateUser(app, anotherOrgAdminUserData.user.email); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const { dataQuery } = await generateAppDefaults(app, adminUserData.user, {}); const response = await request(app.getHttpServer()) .post(`/api/data_queries/${dataQuery.id}/run`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(403); }); diff --git a/server/test/controllers/data_sources.e2e-spec.ts b/server/test/controllers/data_sources.e2e-spec.ts index d43f105cf3..160ee8d73e 100644 --- a/server/test/controllers/data_sources.e2e-spec.ts +++ b/server/test/controllers/data_sources.e2e-spec.ts @@ -1,7 +1,6 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; import { - authHeaderForUser, clearDB, createApplication, createUser, @@ -11,6 +10,7 @@ import { createAppGroupPermission, createApplicationVersion, generateAppDefaults, + authenticateUser, } from '../test.helper'; import { Credential } from 'src/entities/credential.entity'; import { getManager, getRepository } from 'typeorm'; @@ -48,6 +48,15 @@ describe('data sources controller', () => { groups: ['all_users', 'admin'], }); + let loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, anotherOrgAdminUserData.user.email); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const { application, appVersion: applicationVersion } = await generateAppDefaults(app, adminUserData.user, { isDataSourceNeeded: false, isQueryNeeded: false, @@ -74,7 +83,8 @@ describe('data sources controller', () => { for (const userData of [adminUserData, developerUserData]) { const response = await request(app.getHttpServer()) .post(`/api/data_sources`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send(dataSourceParams); expect(response.statusCode).toBe(201); @@ -93,7 +103,8 @@ describe('data sources controller', () => { for (const userData of [anotherOrgAdminUserData, viewerUserData]) { const response = await request(app.getHttpServer()) .post(`/api/data_sources`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send(dataSourceParams); expect(response.statusCode).toBe(403); @@ -119,6 +130,16 @@ describe('data sources controller', () => { email: 'another@tooljet.io', groups: ['all_users', 'admin'], }); + + let loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, anotherOrgAdminUserData.user.email); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const { application, dataSource } = await generateAppDefaults(app, adminUserData.user, { isQueryNeeded: false, dsOptions: [{ key: 'foo', value: 'bar', encrypted: 'true' }], @@ -145,7 +166,8 @@ describe('data sources controller', () => { ]; const response = await request(app.getHttpServer()) .put(`/api/data_sources/${dataSource.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ options: newOptions, }); @@ -171,7 +193,8 @@ describe('data sources controller', () => { ]; const response = await request(app.getHttpServer()) .put(`/api/data_sources/${dataSource.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ options: newOptions, }); @@ -200,6 +223,15 @@ describe('data sources controller', () => { groups: ['all_users', 'admin'], }); + let loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, anotherOrgAdminUserData.user.email); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const { application, appVersion } = await generateAppDefaults(app, adminUserData.user, { isQueryNeeded: false, }); @@ -219,7 +251,8 @@ describe('data sources controller', () => { for (const userData of [adminUserData, developerUserData, viewerUserData]) { const response = await request(app.getHttpServer()) .get(`/api/data_sources?app_version_id=${appVersion.id}`) - .set('Authorization', authHeaderForUser(userData.user)); + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(200); expect(response.body.data_sources.length).toBe(1); @@ -228,7 +261,8 @@ describe('data sources controller', () => { // Forbidden if user of another organization const response = await request(app.getHttpServer()) .get(`/api/data_sources?app_version_id=${appVersion.id}`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)); + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', anotherOrgAdminUserData['tokenCookie']); expect(response.statusCode).toBe(403); }); @@ -253,6 +287,15 @@ describe('data sources controller', () => { groups: ['all_users', 'admin'], }); + let loggedUser = await authenticateUser(app, adminUserData.user.email); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + loggedUser = await authenticateUser(app, anotherOrgAdminUserData.user.email); + anotherOrgAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + const { application, appVersion } = await generateAppDefaults(app, adminUserData.user, { isQueryNeeded: false, isDataSourceNeeded: false, @@ -280,7 +323,8 @@ describe('data sources controller', () => { const response = await request(app.getHttpServer()) .delete(`/api/data_sources/${dataSource.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send(); expect(response.statusCode).toBe(200); @@ -297,7 +341,8 @@ describe('data sources controller', () => { const response = await request(app.getHttpServer()) .delete(`/api/data_sources/${dataSource.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send(); expect(response.statusCode).toBe(403); @@ -355,9 +400,12 @@ describe('data sources controller', () => { const dataQuery2Temp = query2; + const loggedUser = await authenticateUser(app, adminUserData.user.email); + const response = await request(app.getHttpServer()) .delete(`/api/data_sources/${dataSource1.id}`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send(); expect(response.statusCode).toBe(200); @@ -374,20 +422,25 @@ describe('data sources controller', () => { email: 'admin@tooljet.io', groups: ['all_users', 'admin'], }); + + const loggedUser = await authenticateUser(app, adminUserData.user.email); + const { dataSource } = await generateAppDefaults(app, adminUserData.user, { isQueryNeeded: false, }); let response = await request(app.getHttpServer()) .get(`/api/data_sources?app_version_id=${dataSource.appVersionId}`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); expect(response.body.data_sources.length).toBe(1); response = await request(app.getHttpServer()) .get(`/api/data_sources?app_version_id=62929ad6-11ae-4655-bb3e-2d2465b58950`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(500); }); @@ -405,14 +458,21 @@ describe('data sources controller', () => { isQueryNeeded: false, }); + const loggedUser = await authenticateUser(app, anotherOrgAdminUserData.user.email); + // Should not update if user of another org const response = await request(app.getHttpServer()) .post(`/api/data_sources/${dataSource.id}/authorize_oauth2`) - .set('Authorization', authHeaderForUser(anotherOrgAdminUserData.user)) + .set('tj-workspace-id', anotherOrgAdminUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ code: 'oauth-auth-code', }); expect(response.statusCode).toBe(403); }); + + afterAll(async () => { + await app.close(); + }); }); diff --git a/server/test/controllers/files.e2e-spec.ts b/server/test/controllers/files.e2e-spec.ts index bbc4b877a7..df2899e666 100644 --- a/server/test/controllers/files.e2e-spec.ts +++ b/server/test/controllers/files.e2e-spec.ts @@ -1,6 +1,6 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; -import { authHeaderForUser, createFile, clearDB, createUser, createNestAppInstance } from '../test.helper'; +import { createFile, clearDB, createUser, createNestAppInstance, authenticateUser } from '../test.helper'; describe('files controller', () => { let app: INestApplication; @@ -24,10 +24,17 @@ describe('files controller', () => { const file = await createFile(app); + const loggedUser = await authenticateUser(app); + const response = await request(app.getHttpServer()) .get(`/api/files/${file.id}`) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); }); + + afterAll(async () => { + await app.close(); + }); }); diff --git a/server/test/controllers/folder_apps.e2e-spec.ts b/server/test/controllers/folder_apps.e2e-spec.ts index eb5c64ddf7..7cb64f2825 100644 --- a/server/test/controllers/folder_apps.e2e-spec.ts +++ b/server/test/controllers/folder_apps.e2e-spec.ts @@ -1,5 +1,5 @@ import { INestApplication } from '@nestjs/common'; -import { authHeaderForUser, clearDB, createNestAppInstance, setupOrganization } from '../test.helper'; +import { authenticateUser, clearDB, createNestAppInstance, setupOrganization } from '../test.helper'; import * as request from 'supertest'; import { getManager } from 'typeorm'; import { Folder } from '../../src/entities/folder.entity'; @@ -28,9 +28,13 @@ describe('folder apps controller', () => { const folder = await manager.save( manager.create(Folder, { name: 'folder', organizationId: adminUser.organizationId }) ); + + const loggedUser = await authenticateUser(nestApp); + const response = await request(nestApp.getHttpServer()) .post(`/api/folder_apps`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ folder_id: folder.id, app_id: app.id }); expect(response.statusCode).toBe(201); @@ -49,14 +53,18 @@ describe('folder apps controller', () => { manager.create(Folder, { name: 'folder', organizationId: adminUser.organizationId }) ); + const loggedUser = await authenticateUser(nestApp); + await request(nestApp.getHttpServer()) .post(`/api/folder_apps`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ folder_id: folder.id, app_id: app.id }); const response = await request(nestApp.getHttpServer()) .post(`/api/folder_apps`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ folder_id: folder.id, app_id: app.id }); expect(response.statusCode).toBe(400); @@ -65,6 +73,9 @@ describe('folder apps controller', () => { it('should remove an app from a folder', async () => { const { adminUser, app } = await setupOrganization(nestApp); + + const loggedUser = await authenticateUser(nestApp); + const manager = getManager(); // create a new folder const folder = await manager.save( @@ -74,10 +85,14 @@ describe('folder apps controller', () => { const folderApp = await manager.save(manager.create(FolderApp, { folderId: folder.id, appId: app.id })); const response = await request(nestApp.getHttpServer()) .put(`/api/folder_apps/${folderApp.folderId}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ app_id: folderApp.appId }); expect(response.statusCode).toBe(200); }); }); + afterAll(async () => { + await nestApp.close(); + }); }); diff --git a/server/test/controllers/folders.e2e-spec.ts b/server/test/controllers/folders.e2e-spec.ts index af94321eb9..c9e1dd485d 100644 --- a/server/test/controllers/folders.e2e-spec.ts +++ b/server/test/controllers/folders.e2e-spec.ts @@ -1,7 +1,6 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; import { - authHeaderForUser, clearDB, createApplication, createUser, @@ -9,6 +8,7 @@ import { createGroupPermission, createUserGroupPermissions, createAppGroupPermission, + authenticateUser, } from '../test.helper'; import { getManager } from 'typeorm'; import { Folder } from 'src/entities/folder.entity'; @@ -37,6 +37,8 @@ describe('folders controller', () => { }); const { user } = adminUserData; + const loggedUser = await authenticateUser(nestApp); + const folder = await getManager().save(Folder, { name: 'Folder1', organizationId: adminUserData.organization.id, @@ -73,7 +75,8 @@ describe('folders controller', () => { let response = await request(nestApp.getHttpServer()) .get(`/api/folders`) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); expect(new Set(Object.keys(response.body))).toEqual(new Set(['folders'])); @@ -92,7 +95,8 @@ describe('folders controller', () => { response = await request(nestApp.getHttpServer()) .get(`/api/folders?searchKey=app in`) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); expect(new Set(Object.keys(response.body))).toEqual(new Set(['folders'])); @@ -111,7 +115,8 @@ describe('folders controller', () => { response = await request(nestApp.getHttpServer()) .get(`/api/folders?searchKey=some text`) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); expect(new Set(Object.keys(response.body))).toEqual(new Set(['folders'])); @@ -141,6 +146,12 @@ describe('folders controller', () => { organization: adminUserData.organization, }); + let loggedUser = await authenticateUser(nestApp); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(nestApp, newUserData.user.email); + newUserData['tokenCookie'] = loggedUser.tokenCookie; + const folder = await getManager().save(Folder, { name: 'Folder1', organizationId: adminUserData.organization.id, @@ -195,7 +206,8 @@ describe('folders controller', () => { // admin can see all folders let response = await request(nestApp.getHttpServer()) .get(`/api/folders`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toBe(200); expect(new Set(Object.keys(response.body))).toEqual(new Set(['folders'])); @@ -212,7 +224,8 @@ describe('folders controller', () => { // new user cannot see any folders without having apps with access response = await request(nestApp.getHttpServer()) .get(`/api/folders`) - .set('Authorization', authHeaderForUser(newUserData.user)); + .set('tj-workspace-id', newUserData.user.defaultOrganizationId) + .set('Cookie', newUserData['tokenCookie']); expect(response.statusCode).toBe(200); expect(new Set(Object.keys(response.body))).toEqual(new Set(['folders'])); @@ -236,7 +249,8 @@ describe('folders controller', () => { response = await request(nestApp.getHttpServer()) .get(`/api/folders`) - .set('Authorization', authHeaderForUser(newUserData.user)); + .set('tj-workspace-id', newUserData.user.defaultOrganizationId) + .set('Cookie', newUserData['tokenCookie']); expect(response.statusCode).toBe(200); @@ -253,7 +267,8 @@ describe('folders controller', () => { response = await request(nestApp.getHttpServer()) .get(`/api/folders`) - .set('Authorization', authHeaderForUser(newUserData.user)); + .set('tj-workspace-id', newUserData.user.defaultOrganizationId) + .set('Cookie', newUserData['tokenCookie']); expect(response.statusCode).toBe(200); folders = response.body.folders; @@ -278,9 +293,12 @@ describe('folders controller', () => { }); const { user } = adminUserData; + const loggedUser = await authenticateUser(nestApp); + const response = await request(nestApp.getHttpServer()) .post(`/api/folders`) - .set('Authorization', authHeaderForUser(user)) + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ name: 'My folder' }); expect(response.statusCode).toBe(201); @@ -312,6 +330,15 @@ describe('folders controller', () => { organization: adminUserData.organization, }); + let loggedUser = await authenticateUser(nestApp); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(nestApp, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(nestApp, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerGroup = await getManager().findOneOrFail(GroupPermission, { where: { group: 'developer' }, }); @@ -328,7 +355,8 @@ describe('folders controller', () => { for (const userData of [adminUserData, developerUserData]) { await request(nestApp.getHttpServer()) .put(`/api/folders/${folder.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ name: 'My folder' }) .expect(200); @@ -339,7 +367,8 @@ describe('folders controller', () => { await request(nestApp.getHttpServer()) .put(`/api/folders/${folder.id}`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send({ name: 'My folder' }) .expect(403); }); @@ -371,6 +400,15 @@ describe('folders controller', () => { folderDelete: true, }); + let loggedUser = await authenticateUser(nestApp); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(nestApp, viewerUserData.user.email); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(nestApp, developerUserData.user.email); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + for (const userData of [adminUserData, developerUserData]) { const folder = await getManager().save(Folder, { name: 'Folder1', @@ -381,7 +419,8 @@ describe('folders controller', () => { await request(nestApp.getHttpServer()) .delete(`/api/folders/${folder.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send() .expect(200); @@ -396,7 +435,8 @@ describe('folders controller', () => { await request(nestApp.getHttpServer()) .delete(`/api/folders/${folder.id}`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send() .expect(403); }); diff --git a/server/test/controllers/group_permissions.e2e-spec.ts b/server/test/controllers/group_permissions.e2e-spec.ts index 78d0068bce..11bb0eebb6 100644 --- a/server/test/controllers/group_permissions.e2e-spec.ts +++ b/server/test/controllers/group_permissions.e2e-spec.ts @@ -1,6 +1,6 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; -import { authHeaderForUser, clearDB, createUser, createNestAppInstance, createApplication } from '../test.helper'; +import { clearDB, createUser, createNestAppInstance, createApplication, authenticateUser } from '../test.helper'; import { getManager } from 'typeorm'; import { AppGroupPermission } from 'src/entities/app_group_permission.entity'; import { UserGroupPermission } from 'src/entities/user_group_permission.entity'; @@ -22,9 +22,13 @@ describe('group permissions controller', () => { const { organization: { defaultUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp, 'developer@tooljet.io'); + const response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(defaultUser)) + .set('tj-workspace-id', defaultUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(response.statusCode).toBe(403); @@ -34,9 +38,13 @@ describe('group permissions controller', () => { const { organization: { adminUser, organization }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp); + const response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(response.statusCode).toBe(201); @@ -59,12 +67,15 @@ describe('group permissions controller', () => { organization: { adminUser }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + const reservedGroups = ['All Users', 'Admin']; for (let i = 0; i < reservedGroups.length; i += 1) { const response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: reservedGroups[i] }); expect(response.statusCode).toBe(400); @@ -76,16 +87,21 @@ describe('group permissions controller', () => { const { organization: { adminUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp); + let response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(response.statusCode).toBe(201); response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(response.statusCode).toBe(409); @@ -97,16 +113,24 @@ describe('group permissions controller', () => { anotherOrganization: { anotherAdminUser }, } = await setupOrganizations(nestApp); + let loggedUser = await authenticateUser(nestApp); + adminUser['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(nestApp, anotherAdminUser.email); + anotherAdminUser['tokenCookie'] = loggedUser.tokenCookie; + let response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', adminUser['tokenCookie']) .send({ group: 'avengers' }); expect(response.statusCode).toBe(201); response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(anotherAdminUser)) + .set('tj-workspace-id', anotherAdminUser.defaultOrganizationId) + .set('Cookie', anotherAdminUser['tokenCookie']) .send({ group: 'avengers' }); expect(response.statusCode).toBe(201); @@ -118,9 +142,13 @@ describe('group permissions controller', () => { const { organization: { defaultUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp, 'developer@tooljet.io'); + const response = await request(nestApp.getHttpServer()) .get('/api/group_permissions/id') - .set('Authorization', authHeaderForUser(defaultUser)); + .set('tj-workspace-id', defaultUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(403); }); @@ -130,9 +158,12 @@ describe('group permissions controller', () => { organization: { adminUser, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + let response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(response.statusCode).toBe(201); @@ -146,7 +177,8 @@ describe('group permissions controller', () => { response = await request(nestApp.getHttpServer()) .get(`/api/group_permissions/${updatedGroup.id}`) - .set('Authorization', authHeaderForUser(adminUser)); + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); expect(response.body.group).toBe('avengers'); @@ -162,16 +194,24 @@ describe('group permissions controller', () => { anotherOrganization: { anotherAdminUser }, } = await setupOrganizations(nestApp); + let loggedUser = await authenticateUser(nestApp); + adminUser['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(nestApp, anotherAdminUser.email); + anotherAdminUser['tokenCookie'] = loggedUser.tokenCookie; + let response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', adminUser['tokenCookie']) .send({ group: 'avengers' }); const groupPermissionId = response.body.id; response = await request(nestApp.getHttpServer()) .post(`/api/group_permissions/${groupPermissionId}`) - .set('Authorization', authHeaderForUser(anotherAdminUser)) + .set('tj-workspace-id', anotherAdminUser.defaultOrganizationId) + .set('Cookie', anotherAdminUser['tokenCookie']) .send({ group: 'avengers' }); expect(response.statusCode).toBe(404); @@ -183,9 +223,13 @@ describe('group permissions controller', () => { const { organization: { defaultUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp, 'developer@tooljet.io'); + const response = await request(nestApp.getHttpServer()) .put('/api/group_permissions/id') - .set('Authorization', authHeaderForUser(defaultUser)) + .set('tj-workspace-id', defaultUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(response.statusCode).toBe(403); @@ -196,9 +240,12 @@ describe('group permissions controller', () => { organization: { adminUser, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + const createResponse = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(createResponse.statusCode).toBe(201); @@ -213,7 +260,8 @@ describe('group permissions controller', () => { //update a group name const updateResponse = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${updatedGroup.id}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ name: 'titans' }); expect(updateResponse.statusCode).toBe(200); @@ -227,9 +275,12 @@ describe('group permissions controller', () => { organization: { adminUser, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + const createResponse = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(createResponse.statusCode).toBe(201); @@ -244,7 +295,8 @@ describe('group permissions controller', () => { //update a group name const updateResponse = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${updatedGroup.id}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ name: 'All users' }); expect(updateResponse.statusCode).toBe(400); @@ -255,6 +307,8 @@ describe('group permissions controller', () => { organization: { adminUser, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + const adminGroup = await getManager().findOne(GroupPermission, { where: { group: 'admin', organizationId: organization.id }, }); @@ -262,7 +316,8 @@ describe('group permissions controller', () => { //update a group name const updateResponse = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${adminGroup.id}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ name: 'titans' }); expect(updateResponse.statusCode).toBe(400); @@ -273,9 +328,12 @@ describe('group permissions controller', () => { organization: { adminUser, app, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + let response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(response.statusCode).toBe(201); @@ -291,7 +349,8 @@ describe('group permissions controller', () => { response = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${groupPermissionId}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ add_apps: [app.id] }); expect(response.statusCode).toBe(200); @@ -312,7 +371,8 @@ describe('group permissions controller', () => { response = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${groupPermissionId}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ remove_apps: [app.id] }); expect(response.statusCode).toBe(200); @@ -329,9 +389,12 @@ describe('group permissions controller', () => { organization: { adminUser, defaultUser, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + let response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); const updatedGroup: GroupPermission = await getManager().findOneOrFail(GroupPermission, { @@ -344,7 +407,8 @@ describe('group permissions controller', () => { response = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${groupPermissionId}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ add_users: [defaultUser.id] }); expect(response.statusCode).toBe(200); @@ -362,7 +426,8 @@ describe('group permissions controller', () => { response = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${groupPermissionId}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ remove_users: [defaultUser.id] }); expect(response.statusCode).toBe(200); @@ -387,9 +452,12 @@ describe('group permissions controller', () => { }, }); + const loggedUser = await authenticateUser(nestApp); + const response = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${adminGroupPermission.id}`) - .set('Authorization', authHeaderForUser(user)) + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ remove_users: [user.id] }); expect(response.statusCode).toBe(400); @@ -401,6 +469,9 @@ describe('group permissions controller', () => { organization: { adminUser, defaultUser }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + adminUser['tokenCookie'] = loggedUser.tokenCookie; + const manager = getManager(); const adminGroupPermission = await manager.findOneOrFail(GroupPermission, { where: { @@ -411,7 +482,8 @@ describe('group permissions controller', () => { const response = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${adminGroupPermission.id}/`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', adminUser['tokenCookie']) .send({ remove_users: [defaultUser.id] }); expect(response.statusCode).toBe(400); @@ -424,9 +496,13 @@ describe('group permissions controller', () => { const { organization: { defaultUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp, 'developer@tooljet.io'); + const response = await request(nestApp.getHttpServer()) .get('/api/group_permissions') - .set('Authorization', authHeaderForUser(defaultUser)); + .set('tj-workspace-id', defaultUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(403); }); @@ -436,10 +512,13 @@ describe('group permissions controller', () => { organization: { adminUser, defaultUser, app, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + // create group permission let response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(response.statusCode).toBe(201); @@ -456,7 +535,8 @@ describe('group permissions controller', () => { // add apps and users to group permission response = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${groupPermissionId}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ add_apps: [app.id], add_users: [defaultUser.id] }); expect(response.statusCode).toBe(200); @@ -464,7 +544,8 @@ describe('group permissions controller', () => { // list group permission response = await request(nestApp.getHttpServer()) .get('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)); + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); const groupPermissions = response.body.group_permissions; @@ -481,9 +562,13 @@ describe('group permissions controller', () => { const { organization: { defaultUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp, 'developer@tooljet.io'); + const response = await request(nestApp.getHttpServer()) .get('/api/group_permissions/id/apps') - .set('Authorization', authHeaderForUser(defaultUser)); + .set('tj-workspace-id', defaultUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(403); }); @@ -493,6 +578,8 @@ describe('group permissions controller', () => { organization: { adminUser, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + const manager = getManager(); const adminGroupPermission = await manager.findOneOrFail(GroupPermission, { where: { @@ -503,7 +590,8 @@ describe('group permissions controller', () => { const response = await request(nestApp.getHttpServer()) .get(`/api/group_permissions/${adminGroupPermission.id}/apps`) - .set('Authorization', authHeaderForUser(adminUser)); + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); @@ -530,9 +618,13 @@ describe('group permissions controller', () => { const { organization: { defaultUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp, 'developer@tooljet.io'); + const response = await request(nestApp.getHttpServer()) .get('/api/group_permissions/id/addable_apps') - .set('Authorization', authHeaderForUser(defaultUser)); + .set('tj-workspace-id', defaultUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(403); }); @@ -542,10 +634,13 @@ describe('group permissions controller', () => { organization: { adminUser, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + // create group permission let response = await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(response.statusCode).toBe(201); @@ -562,7 +657,8 @@ describe('group permissions controller', () => { response = await request(nestApp.getHttpServer()) .get(`/api/group_permissions/${groupPermissionId}/addable_apps`) - .set('Authorization', authHeaderForUser(adminUser)); + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); @@ -597,9 +693,13 @@ describe('group permissions controller', () => { const { organization: { defaultUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp, 'developer@tooljet.io'); + const response = await request(nestApp.getHttpServer()) .get('/api/group_permissions/id/users') - .set('Authorization', authHeaderForUser(defaultUser)); + .set('tj-workspace-id', defaultUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(403); }); @@ -609,6 +709,8 @@ describe('group permissions controller', () => { organization: { adminUser, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + const manager = getManager(); const adminGroupPermission = await manager.findOneOrFail(GroupPermission, { where: { @@ -619,7 +721,8 @@ describe('group permissions controller', () => { const response = await request(nestApp.getHttpServer()) .get(`/api/group_permissions/${adminGroupPermission.id}/users`) - .set('Authorization', authHeaderForUser(adminUser)); + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); @@ -640,9 +743,13 @@ describe('group permissions controller', () => { const { organization: { defaultUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp, 'developer@tooljet.io'); + const response = await request(nestApp.getHttpServer()) .get('/api/group_permissions/id/addable_users') - .set('Authorization', authHeaderForUser(defaultUser)); + .set('tj-workspace-id', defaultUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(403); }); @@ -655,6 +762,8 @@ describe('group permissions controller', () => { organization: adminUser.organization, }); + const loggedUser = await authenticateUser(nestApp); + const manager = getManager(); const adminGroupPermission = await manager.findOneOrFail(GroupPermission, { where: { @@ -665,7 +774,8 @@ describe('group permissions controller', () => { const groupPermissionId = adminGroupPermission.id; const response = await request(nestApp.getHttpServer()) .get(`/api/group_permissions/${groupPermissionId}/addable_users?input=userone@tooljet.io`) - .set('Authorization', authHeaderForUser(adminUser.user)); + .set('tj-workspace-id', adminUser.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); @@ -685,9 +795,13 @@ describe('group permissions controller', () => { const { organization: { defaultUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp, 'developer@tooljet.io'); + const response = await request(nestApp.getHttpServer()) .put('/api/group_permissions/id/app_group_permissions/id') - .set('Authorization', authHeaderForUser(defaultUser)) + .set('tj-workspace-id', defaultUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ read: true }); expect(response.statusCode).toBe(403); @@ -698,6 +812,8 @@ describe('group permissions controller', () => { organization: { adminUser, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + const manager = getManager(); const groupPermission = await manager.findOneOrFail(GroupPermission, { where: { @@ -718,7 +834,8 @@ describe('group permissions controller', () => { const response = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${groupPermissionId}/app_group_permissions/${appGroupPermissionId}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ actions: { read: false, update: true } }); expect(response.statusCode).toBe(200); @@ -735,6 +852,8 @@ describe('group permissions controller', () => { anotherOrganization: { anotherAdminUser }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp, anotherAdminUser.email); + const manager = getManager(); const groupPermission = await manager.findOneOrFail(GroupPermission, { where: { @@ -755,7 +874,8 @@ describe('group permissions controller', () => { const response = await request(nestApp.getHttpServer()) .put(`/api/group_permissions/${groupPermissionId}/app_group_permissions/${appGroupPermissionId}`) - .set('Authorization', authHeaderForUser(anotherAdminUser)) + .set('tj-workspace-id', anotherAdminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ actions: { read: false, update: true } }); expect(response.statusCode).toBe(400); @@ -767,9 +887,13 @@ describe('group permissions controller', () => { const { organization: { defaultUser }, } = await setupOrganizations(nestApp); + + const loggedUser = await authenticateUser(nestApp, defaultUser.email); + const response = await request(nestApp.getHttpServer()) .del('/api/group_permissions/id') - .set('Authorization', authHeaderForUser(defaultUser)) + .set('tj-workspace-id', defaultUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ read: true }); expect(response.statusCode).toBe(403); @@ -780,9 +904,12 @@ describe('group permissions controller', () => { organization: { adminUser, organization }, } = await setupOrganizations(nestApp); + const loggedUser = await authenticateUser(nestApp); + await request(nestApp.getHttpServer()) .post('/api/group_permissions') - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); const manager = getManager(); @@ -795,7 +922,8 @@ describe('group permissions controller', () => { const response = await request(nestApp.getHttpServer()) .del(`/api/group_permissions/${groupPermission.id}`) - .set('Authorization', authHeaderForUser(adminUser)) + .set('tj-workspace-id', adminUser.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie) .send({ group: 'avengers' }); expect(response.statusCode).toBe(200); diff --git a/server/test/controllers/library_apps.e2e-spec.ts b/server/test/controllers/library_apps.e2e-spec.ts index 33d7a280de..9b1913ea79 100644 --- a/server/test/controllers/library_apps.e2e-spec.ts +++ b/server/test/controllers/library_apps.e2e-spec.ts @@ -1,6 +1,6 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; -import { authHeaderForUser, clearDB, createUser, createNestAppInstance } from '../test.helper'; +import { clearDB, createUser, createNestAppInstance, authenticateUser } from '../test.helper'; describe('library apps controller', () => { let app: INestApplication; @@ -26,17 +26,25 @@ describe('library apps controller', () => { organization, }); + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + nonAdminUserData['tokenCookie'] = loggedUser.tokenCookie; + let response = await request(app.getHttpServer()) .post('/api/library_apps') .send({ identifier: 'github-contributors' }) - .set('Authorization', authHeaderForUser(nonAdminUserData.user)); + .set('tj-workspace-id', nonAdminUserData.user.defaultOrganizationId) + .set('Cookie', nonAdminUserData['tokenCookie']); expect(response.statusCode).toBe(403); response = await request(app.getHttpServer()) .post('/api/library_apps') .send({ identifier: 'github-contributors' }) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toBe(201); expect(response.body.name).toBe('GitHub Contributor Leaderboard'); @@ -48,10 +56,14 @@ describe('library apps controller', () => { groups: ['all_users', 'admin'], }); + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .post('/api/library_apps') .send({ identifier: 'non-existent-template' }) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); const { timestamp, ...restBody } = response.body; @@ -71,9 +83,13 @@ describe('library apps controller', () => { groups: ['all_users', 'admin'], }); + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .get('/api/library_apps') - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toBe(200); diff --git a/server/test/controllers/oauth/oauth-git-instance.e2e-spec.ts b/server/test/controllers/oauth/oauth-git-instance.e2e-spec.ts index a25d4fb9a8..797293b002 100644 --- a/server/test/controllers/oauth/oauth-git-instance.e2e-spec.ts +++ b/server/test/controllers/oauth/oauth-git-instance.e2e-spec.ts @@ -14,34 +14,7 @@ describe('oauth controller', () => { let orgRepository: Repository; let mockConfig; - const authResponseKeys = [ - 'id', - 'email', - 'first_name', - 'last_name', - 'auth_token', - 'admin', - 'organization_id', - 'organization', - 'group_permissions', - 'app_group_permissions', - ].sort(); - - const groupPermissionsKeys = [ - 'id', - 'organization_id', - 'group', - 'app_create', - 'app_delete', - 'updated_at', - 'created_at', - 'folder_create', - 'folder_update', - 'folder_delete', - 'org_environment_variable_create', - 'org_environment_variable_delete', - 'org_environment_variable_update', - ].sort(); + const authResponseKeys = ['id', 'email', 'first_name', 'last_name', 'current_organization_id'].sort(); beforeEach(async () => { await clearDB(); @@ -104,7 +77,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -138,7 +111,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -185,7 +158,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -324,7 +297,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -335,7 +308,7 @@ describe('oauth controller', () => { const response = await request(app.getHttpServer()).post('/api/oauth/sign-in/common/git').send({ token }); - const redirect_url = await generateRedirectUrl('ssoUserGit@tooljet.io'); + const redirect_url = await generateRedirectUrl('ssousergit@tooljet.io'); expect(response.statusCode).toBe(201); expect(response.body.redirect_url).toEqual(redirect_url); @@ -362,7 +335,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -375,7 +348,7 @@ describe('oauth controller', () => { .post('/api/oauth/sign-in/common/git') .send({ token, organizationId: current_organization.id }); - const redirect_url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization); + const redirect_url = await generateRedirectUrl('ssousergit@tooljet.io', current_organization); expect(response.statusCode).toBe(201); expect(response.body.redirect_url).toEqual(redirect_url); @@ -400,7 +373,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -411,7 +384,7 @@ describe('oauth controller', () => { const response = await request(app.getHttpServer()).post('/api/oauth/sign-in/common/git').send({ token }); - const redirect_url = await generateRedirectUrl('ssoUserGit@tooljet.io'); + const redirect_url = await generateRedirectUrl('ssousergit@tooljet.io'); expect(response.statusCode).toBe(201); expect(response.body.redirect_url).toEqual(redirect_url); @@ -440,7 +413,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -453,7 +426,7 @@ describe('oauth controller', () => { .post('/api/oauth/sign-in/common/git') .send({ token, organizationId: current_organization.id }); - const redirect_url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization); + const redirect_url = await generateRedirectUrl('ssousergit@tooljet.io', current_organization); expect(response.statusCode).toBe(201); expect(response.body.redirect_url).toEqual(redirect_url); @@ -481,7 +454,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -494,7 +467,7 @@ describe('oauth controller', () => { .post('/api/oauth/sign-in/common/git') .send({ token, organizationId: current_organization.id }); - const redirect_url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization); + const redirect_url = await generateRedirectUrl('ssousergit@tooljet.io', current_organization); expect(response.statusCode).toBe(201); expect(response.body.redirect_url).toEqual(redirect_url); @@ -504,7 +477,7 @@ describe('oauth controller', () => { await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'active', @@ -528,7 +501,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', }; }, }; @@ -542,34 +515,19 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); }); it('Workspace Login - should return login info when the user exist', async () => { await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'active', @@ -592,7 +550,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', }; }, }; @@ -608,34 +566,19 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); }); it('Common Login - should return login info when the user exist but invited status', async () => { const { orgUser } = await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'invited', @@ -659,7 +602,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', }; }, }; @@ -673,29 +616,12 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeTruthy(); - expect(organization_id).not.toBe(current_organization.id); - expect(organization).toBe('Untitled workspace'); - expect(group_permissions).toHaveLength(2); - expect([group_permissions[0].group, group_permissions[1].group]).toContain('all_users'); - expect([group_permissions[0].group, group_permissions[1].group]).toContain('admin'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(Object.keys(group_permissions[1]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).not.toBe(current_organization.id); await orgUser.reload(); expect(orgUser.status).toEqual('invited'); }); @@ -704,7 +630,7 @@ describe('oauth controller', () => { const { orgUser } = await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'invited', @@ -727,7 +653,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', }; }, }; @@ -743,27 +669,12 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); await orgUser.reload(); expect(orgUser.status).toEqual('active'); }); @@ -786,7 +697,7 @@ describe('oauth controller', () => { const { orgUser } = await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, }); @@ -809,7 +720,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', }; }, }; @@ -826,27 +737,12 @@ describe('oauth controller', () => { expect(gitGetUserResponse).toBeCalledWith('https://github.host.com/api/v3/user', expect.anything()); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); await orgUser.reload(); expect(orgUser.status).toEqual('active'); }); @@ -869,7 +765,7 @@ describe('oauth controller', () => { const { orgUser } = await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, }); @@ -892,7 +788,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', }; }, }; @@ -911,59 +807,17 @@ describe('oauth controller', () => { expect(gitGetUserResponse).toBeCalledWith('https://github.host.com/api/v3/user', expect.anything()); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); await orgUser.reload(); expect(orgUser.status).toEqual('active'); }); }); }); - - describe('Multi-Workspace Disabled', () => { - beforeEach(() => { - jest.spyOn(mockConfig, 'get').mockImplementation((key: string) => { - switch (key) { - case 'SSO_GOOGLE_OAUTH2_CLIENT_ID': - return 'google-client-id'; - case 'SSO_GIT_OAUTH2_CLIENT_ID': - return 'git-client-id'; - case 'SSO_GIT_OAUTH2_CLIENT_SECRET': - return 'git-secret'; - case 'DISABLE_MULTI_WORKSPACE': - return 'true'; - default: - return process.env[key]; - } - }); - }); - describe('sign in via Git OAuth', () => { - it('should return 403', async () => { - await request(app.getHttpServer()) - .post('/api/oauth/sign-in/common/git') - .send({ token: 'some-token' }) - .expect(403); - }); - }); - }); }); afterAll(async () => { diff --git a/server/test/controllers/oauth/oauth-git.e2e-spec.ts b/server/test/controllers/oauth/oauth-git.e2e-spec.ts index 5ebd346aa4..15f522ff7e 100644 --- a/server/test/controllers/oauth/oauth-git.e2e-spec.ts +++ b/server/test/controllers/oauth/oauth-git.e2e-spec.ts @@ -14,43 +14,15 @@ describe('oauth controller', () => { let app: INestApplication; let ssoConfigsRepository: Repository; let orgRepository: Repository; - let mockConfig; - const authResponseKeys = [ - 'id', - 'email', - 'first_name', - 'last_name', - 'auth_token', - 'admin', - 'organization_id', - 'organization', - 'group_permissions', - 'app_group_permissions', - ].sort(); - - const groupPermissionsKeys = [ - 'id', - 'organization_id', - 'group', - 'app_create', - 'app_delete', - 'updated_at', - 'created_at', - 'folder_create', - 'folder_update', - 'folder_delete', - 'org_environment_variable_create', - 'org_environment_variable_delete', - 'org_environment_variable_update', - ].sort(); + const authResponseKeys = ['id', 'email', 'first_name', 'last_name', 'current_organization_id'].sort(); beforeEach(async () => { await clearDB(); }); beforeAll(async () => { - ({ app, mockConfig } = await createNestAppInstanceWithEnvMock()); + ({ app } = await createNestAppInstanceWithEnvMock()); ssoConfigsRepository = app.get('SSOConfigsRepository'); orgRepository = app.get('OrganizationRepository'); }); @@ -112,7 +84,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -181,7 +153,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -196,7 +168,7 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization); + const url = await generateRedirectUrl('ssousergit@tooljet.io', current_organization); const { redirect_url } = response.body; expect(redirect_url).toEqual(url); @@ -224,7 +196,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -239,7 +211,7 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization); + const url = await generateRedirectUrl('ssousergit@tooljet.io', current_organization); const { redirect_url } = response.body; expect(redirect_url).toEqual(url); @@ -264,7 +236,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -279,7 +251,7 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization); + const url = await generateRedirectUrl('ssousergit@tooljet.io', current_organization); const { redirect_url } = response.body; expect(redirect_url).toEqual(url); @@ -303,7 +275,7 @@ describe('oauth controller', () => { json: () => { return { name: '', - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', }; }, }; @@ -318,7 +290,7 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization); + const url = await generateRedirectUrl('ssousergit@tooljet.io', current_organization); const { redirect_url } = response.body; expect(redirect_url).toEqual(url); @@ -353,7 +325,7 @@ describe('oauth controller', () => { json: () => { return [ { - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', primary: true, verified: true, }, @@ -377,7 +349,7 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization); + const url = await generateRedirectUrl('ssousergit@tooljet.io', current_organization); const { redirect_url } = response.body; expect(redirect_url).toEqual(url); @@ -386,7 +358,7 @@ describe('oauth controller', () => { await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'active', @@ -410,7 +382,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', }; }, }; @@ -426,33 +398,18 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); }); it('should return login info when the user exist with invited status', async () => { const { orgUser } = await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'invited', @@ -476,7 +433,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', }; }, }; @@ -492,27 +449,12 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); await orgUser.reload(); expect(orgUser.status).toEqual('active'); }); @@ -524,7 +466,7 @@ describe('oauth controller', () => { const { orgUser } = await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, }); @@ -547,7 +489,7 @@ describe('oauth controller', () => { json: () => { return { name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', }; }, }; @@ -566,27 +508,12 @@ describe('oauth controller', () => { expect(gitGetUserResponse).toBeCalledWith('https://github.host.com/api/v3/user', expect.anything()); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); await orgUser.reload(); expect(orgUser.status).toEqual('active'); }); @@ -623,12 +550,12 @@ describe('oauth controller', () => { json: () => { return [ { - email: 'ssoUserGit@tooljet.io', + email: 'ssousergit@tooljet.io', primary: true, verified: true, }, { - email: 'ssoUserGit2@tooljet.io', + email: 'ssousergit2@tooljet.io', primary: false, verified: true, }, @@ -656,643 +583,7 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization); - - const { redirect_url } = response.body; - expect(redirect_url).toEqual(url); - }); - }); - }); - - describe('Multi-Workspace Disabled', () => { - beforeEach(async () => { - jest.spyOn(mockConfig, 'get').mockImplementation((key: string) => { - if (key === 'DISABLE_MULTI_WORKSPACE') { - return 'true'; - } else { - return process.env[key]; - } - }); - }); - describe('sign in via Git OAuth', () => { - let sso_configs; - const token = 'some-Token'; - beforeEach(() => { - sso_configs = current_organization.ssoConfigs.find((conf) => conf.sso === 'git'); - }); - it('should return 401 if git sign in is disabled', async () => { - await ssoConfigsRepository.update(sso_configs.id, { enabled: false }); - await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }) - .expect(401); - }); - - it('should return 401 when the user does not exist and sign up is disabled', async () => { - await orgRepository.update(current_organization.id, { enableSignUp: false }); - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', - }; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }) - .expect(401); - }); - - it('should return 401 when the user does not exist domain mismatch', async () => { - await orgRepository.update(current_organization.id, { domain: 'tooljet.io,tooljet.com' }); - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: 'SSO UserGit', - email: 'ssoUserGit@tooljett.io', - }; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - - await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }) - .expect(401); - }); - - it('should return redirect url when the user does not exist and domain matches and sign up is enabled', async () => { - await orgRepository.update(current_organization.id, { domain: 'tooljet.io,tooljet.com' }); - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', - }; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(response.statusCode).toBe(201); - - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization, true); - - const { redirect_url } = response.body; - expect(redirect_url).toEqual(url); - }); - - it('should return redirect url when the user does not exist and domain includes spance matches and sign up is enabled', async () => { - await orgRepository.update(current_organization.id, { - domain: ' tooljet.io , tooljet.com, , , gmail.com', - }); - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', - }; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(response.statusCode).toBe(201); - - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization, true); - - const { redirect_url } = response.body; - expect(redirect_url).toEqual(url); - }); - - it('should return redirect url when the user does not exist and sign up is enabled', async () => { - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: 'SSO UserGit', - email: 'ssoUserGit@tooljet.io', - }; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(response.statusCode).toBe(201); - - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization, true); - - const { redirect_url } = response.body; - expect(redirect_url).toEqual(url); - }); - it('should return 401 when the user exist but archived and sign up is enabled', async () => { - await createUser(app, { - firstName: 'SSO', - lastName: 'userExist', - email: 'anotherUser1@tooljet.io', - groups: ['all_users'], - organization: current_organization, - status: 'archived', - }); - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: 'SSO UserGit', - email: 'anotherUser1@tooljet.io', - }; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(response.statusCode).toBe(401); - }); - it('should return redirect url when the user does not exist and name not available and sign up is enabled', async () => { - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: '', - email: 'ssoUserGit@tooljet.io', - }; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(response.statusCode).toBe(201); - - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization, true); - - const { redirect_url } = response.body; - expect(redirect_url).toEqual(url); - }); - it('should return redirect url when the user does not exist and email id not available and sign up is enabled', async () => { - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: '', - email: '', - }; - }, - }; - }); - const gitGetUserEmailResponse = jest.fn(); - gitGetUserEmailResponse.mockImplementation(() => { - return { - json: () => { - return [ - { - email: 'ssoUserGit@tooljet.io', - primary: true, - verified: true, - }, - { - email: 'ssoUserGit2@tooljet.io', - primary: false, - verified: true, - }, - ]; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - mockedGot.mockImplementationOnce(gitGetUserEmailResponse); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(response.statusCode).toBe(201); - - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization, true); - - const { redirect_url } = response.body; - expect(redirect_url).toEqual(url); - }); - it('should return login info when the user exist', async () => { - await createUser(app, { - firstName: 'SSO', - lastName: 'userExist', - email: 'anotherUser1@tooljet.io', - groups: ['all_users'], - organization: current_organization, - status: 'active', - }); - - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', - }; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(response.statusCode).toBe(201); - expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; - - expect(email).toEqual('anotherUser1@tooljet.io'); - expect(first_name).toEqual('SSO'); - expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); - }); - it('should return login info when the user exist with invited status', async () => { - const { orgUser } = await createUser(app, { - firstName: 'SSO', - lastName: 'userExist', - email: 'anotherUser1@tooljet.io', - groups: ['all_users'], - organization: current_organization, - status: 'invited', - }); - - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', - }; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(response.statusCode).toBe(201); - expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; - - expect(email).toEqual('anotherUser1@tooljet.io'); - expect(first_name).toEqual('SSO'); - expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); - await orgUser.reload(); - expect(orgUser.status).toEqual('active'); - }); - it('should return login info when the user exist and hostname exist in configs', async () => { - await ssoConfigsRepository.update(sso_configs.id, { - configs: { clientId: 'some-client-id', hostName: 'https://github.host.com' }, - }); - - const { orgUser } = await createUser(app, { - firstName: 'SSO', - lastName: 'userExist', - email: 'anotherUser1@tooljet.io', - groups: ['all_users'], - organization: current_organization, - }); - - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: 'SSO userExist', - email: 'anotherUser1@tooljet.io', - }; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(response.statusCode).toBe(201); - - expect(gitAuthResponse).toBeCalledWith('https://github.host.com/login/oauth/access_token', expect.anything()); - expect(gitGetUserResponse).toBeCalledWith('https://github.host.com/api/v3/user', expect.anything()); - expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; - - expect(email).toEqual('anotherUser1@tooljet.io'); - expect(first_name).toEqual('SSO'); - expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); - await orgUser.reload(); - expect(orgUser.status).toEqual('active'); - }); - it('should return redirect url when the user does not exist and email id not available and sign up is enabled, host name configured', async () => { - await ssoConfigsRepository.update(sso_configs.id, { - configs: { clientId: 'some-client-id', hostName: 'https://github.host.com' }, - }); - const gitAuthResponse = jest.fn(); - gitAuthResponse.mockImplementation(() => { - return { - json: () => { - return { - access_token: 'some-access-token', - scope: 'scope', - token_type: 'bearer', - }; - }, - }; - }); - const gitGetUserResponse = jest.fn(); - gitGetUserResponse.mockImplementation(() => { - return { - json: () => { - return { - name: '', - email: '', - }; - }, - }; - }); - const gitGetUserEmailResponse = jest.fn(); - gitGetUserEmailResponse.mockImplementation(() => { - return { - json: () => { - return [ - { - email: 'ssoUserGit@tooljet.io', - primary: true, - verified: true, - }, - { - email: 'ssoUserGit2@tooljet.io', - primary: false, - verified: true, - }, - ]; - }, - }; - }); - - mockedGot.mockImplementationOnce(gitAuthResponse); - mockedGot.mockImplementationOnce(gitGetUserResponse); - mockedGot.mockImplementationOnce(gitGetUserEmailResponse); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(response.statusCode).toBe(201); - - expect(gitAuthResponse).toBeCalledWith('https://github.host.com/login/oauth/access_token', expect.anything()); - expect(gitGetUserResponse).toBeCalledWith('https://github.host.com/api/v3/user', expect.anything()); - expect(gitGetUserEmailResponse).toBeCalledWith( - 'https://github.host.com/api/v3/user/emails', - expect.anything() - ); - - const url = await generateRedirectUrl('ssoUserGit@tooljet.io', current_organization, true); + const url = await generateRedirectUrl('ssousergit@tooljet.io', current_organization); const { redirect_url } = response.body; expect(redirect_url).toEqual(url); diff --git a/server/test/controllers/oauth/oauth-google-instance.e2e-spec.ts b/server/test/controllers/oauth/oauth-google-instance.e2e-spec.ts index 280d5df0b1..0463df9b2f 100644 --- a/server/test/controllers/oauth/oauth-google-instance.e2e-spec.ts +++ b/server/test/controllers/oauth/oauth-google-instance.e2e-spec.ts @@ -10,34 +10,7 @@ describe('oauth controller', () => { let orgRepository: Repository; let mockConfig; - const authResponseKeys = [ - 'id', - 'email', - 'first_name', - 'last_name', - 'auth_token', - 'admin', - 'organization_id', - 'organization', - 'group_permissions', - 'app_group_permissions', - ].sort(); - - const groupPermissionsKeys = [ - 'id', - 'organization_id', - 'group', - 'app_create', - 'app_delete', - 'updated_at', - 'created_at', - 'folder_create', - 'folder_update', - 'folder_delete', - 'org_environment_variable_create', - 'org_environment_variable_delete', - 'org_environment_variable_update', - ].sort(); + const authResponseKeys = ['id', 'email', 'first_name', 'last_name', 'current_organization_id'].sort(); beforeEach(async () => { await clearDB(); @@ -85,7 +58,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -102,7 +75,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -132,7 +105,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -159,7 +132,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljett.io', + email: 'ssouser@tooljett.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -187,7 +160,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljett.io', + email: 'ssouser@tooljett.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -217,7 +190,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -230,7 +203,7 @@ describe('oauth controller', () => { audience: 'google-client-id', }); - const redirect_url = await generateRedirectUrl('ssoUser@tooljet.io'); + const redirect_url = await generateRedirectUrl('ssouser@tooljet.io'); expect(response.statusCode).toBe(201); expect(response.body.redirect_url).toEqual(redirect_url); @@ -242,7 +215,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -257,7 +230,7 @@ describe('oauth controller', () => { audience: 'google-client-id', }); - const redirect_url = await generateRedirectUrl('ssoUser@tooljet.io', current_organization); + const redirect_url = await generateRedirectUrl('ssouser@tooljet.io', current_organization); expect(response.statusCode).toBe(201); expect(response.body.redirect_url).toEqual(redirect_url); @@ -268,7 +241,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -281,7 +254,7 @@ describe('oauth controller', () => { audience: 'google-client-id', }); - const redirect_url = await generateRedirectUrl('ssoUser@tooljet.io'); + const redirect_url = await generateRedirectUrl('ssouser@tooljet.io'); expect(response.statusCode).toBe(201); expect(response.body.redirect_url).toEqual(redirect_url); @@ -293,7 +266,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -308,7 +281,7 @@ describe('oauth controller', () => { audience: 'google-client-id', }); - const redirect_url = await generateRedirectUrl('ssoUser@tooljet.io', current_organization); + const redirect_url = await generateRedirectUrl('ssouser@tooljet.io', current_organization); expect(response.statusCode).toBe(201); expect(response.body.redirect_url).toEqual(redirect_url); @@ -318,7 +291,7 @@ describe('oauth controller', () => { await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'active', @@ -327,7 +300,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -343,34 +316,19 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); }); it('Workspace Login - should return login info when the user exist', async () => { await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'active', @@ -379,7 +337,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -397,34 +355,20 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, admin, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); }); it('Common Login - should return login info when the user exist but invited status', async () => { const { orgUser } = await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'invited', @@ -433,7 +377,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -449,29 +393,12 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeTruthy(); - expect(organization_id).not.toBe(current_organization.id); - expect(organization).toBe('Untitled workspace'); - expect(group_permissions).toHaveLength(2); - expect([group_permissions[0].group, group_permissions[1].group]).toContain('all_users'); - expect([group_permissions[0].group, group_permissions[1].group]).toContain('admin'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(Object.keys(group_permissions[1]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).not.toBe(current_organization.id); await orgUser.reload(); expect(orgUser.status).toEqual('invited'); }); @@ -480,7 +407,7 @@ describe('oauth controller', () => { const { orgUser } = await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'invited', @@ -489,7 +416,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -507,59 +434,17 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); await orgUser.reload(); expect(orgUser.status).toEqual('active'); }); }); }); - - describe('Multi-Workspace Disabled', () => { - beforeEach(() => { - jest.spyOn(mockConfig, 'get').mockImplementation((key: string) => { - switch (key) { - case 'SSO_GOOGLE_OAUTH2_CLIENT_ID': - return 'google-client-id'; - case 'SSO_GIT_OAUTH2_CLIENT_ID': - return 'git-client-id'; - case 'SSO_GIT_OAUTH2_CLIENT_SECRET': - return 'git-secret'; - case 'DISABLE_MULTI_WORKSPACE': - return 'true'; - default: - return process.env[key]; - } - }); - }); - describe('sign in via Google OAuth', () => { - it('should return 403', async () => { - await request(app.getHttpServer()) - .post('/api/oauth/sign-in/common/google') - .send({ token: 'some-token' }) - .expect(403); - }); - }); - }); }); afterAll(async () => { diff --git a/server/test/controllers/oauth/oauth-google.e2e-spec.ts b/server/test/controllers/oauth/oauth-google.e2e-spec.ts index cf50271d9d..122a99b644 100644 --- a/server/test/controllers/oauth/oauth-google.e2e-spec.ts +++ b/server/test/controllers/oauth/oauth-google.e2e-spec.ts @@ -10,43 +10,15 @@ describe('oauth controller', () => { let app: INestApplication; let ssoConfigsRepository: Repository; let orgRepository: Repository; - let mockConfig; - const authResponseKeys = [ - 'id', - 'email', - 'first_name', - 'last_name', - 'auth_token', - 'admin', - 'organization_id', - 'organization', - 'group_permissions', - 'app_group_permissions', - ].sort(); - - const groupPermissionsKeys = [ - 'id', - 'organization_id', - 'group', - 'app_create', - 'app_delete', - 'updated_at', - 'created_at', - 'folder_create', - 'folder_update', - 'folder_delete', - 'org_environment_variable_create', - 'org_environment_variable_delete', - 'org_environment_variable_update', - ].sort(); + const authResponseKeys = ['id', 'email', 'first_name', 'last_name', 'current_organization_id'].sort(); beforeEach(async () => { await clearDB(); }); beforeAll(async () => { - ({ app, mockConfig } = await createNestAppInstanceWithEnvMock()); + ({ app } = await createNestAppInstanceWithEnvMock()); ssoConfigsRepository = app.get('SSOConfigsRepository'); orgRepository = app.get('OrganizationRepository'); }); @@ -88,7 +60,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -105,7 +77,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljett.io', + email: 'ssouser@tooljett.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -122,7 +94,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -137,7 +109,7 @@ describe('oauth controller', () => { audience: sso_configs.configs.clientId, }); - const url = await generateRedirectUrl('ssoUser@tooljet.io', current_organization); + const url = await generateRedirectUrl('ssouser@tooljet.io', current_organization); const { redirect_url } = response.body; expect(redirect_url).toEqual(url); }); @@ -147,7 +119,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -162,7 +134,7 @@ describe('oauth controller', () => { audience: sso_configs.configs.clientId, }); - const url = await generateRedirectUrl('ssoUser@tooljet.io', current_organization); + const url = await generateRedirectUrl('ssouser@tooljet.io', current_organization); const { redirect_url } = response.body; expect(redirect_url).toEqual(url); @@ -172,7 +144,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'ssoUser@tooljet.io', + email: 'ssouser@tooljet.io', name: '', hd: 'tooljet.io', }), @@ -187,7 +159,7 @@ describe('oauth controller', () => { audience: sso_configs.configs.clientId, }); - const url = await generateRedirectUrl('ssoUser@tooljet.io', current_organization); + const url = await generateRedirectUrl('ssouser@tooljet.io', current_organization); const { redirect_url } = response.body; expect(redirect_url).toEqual(url); @@ -196,7 +168,7 @@ describe('oauth controller', () => { await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'active', @@ -205,7 +177,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -223,33 +195,18 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); }); it('should return login info when the user exist but invited status', async () => { const { orgUser } = await createUser(app, { firstName: 'SSO', lastName: 'userExist', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', groups: ['all_users'], organization: current_organization, status: 'invited', @@ -258,7 +215,7 @@ describe('oauth controller', () => { googleVerifyMock.mockImplementation(() => ({ getPayload: () => ({ sub: 'someSSOId', - email: 'anotherUser1@tooljet.io', + email: 'anotheruser1@tooljet.io', name: 'SSO User', hd: 'tooljet.io', }), @@ -276,303 +233,12 @@ describe('oauth controller', () => { expect(response.statusCode).toBe(201); expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; - expect(email).toEqual('anotherUser1@tooljet.io'); + expect(email).toEqual('anotheruser1@tooljet.io'); expect(first_name).toEqual('SSO'); expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); - await orgUser.reload(); - expect(orgUser.status).toEqual('active'); - }); - }); - }); - - describe('Multi-Workspace Disabled', () => { - beforeEach(async () => { - jest.spyOn(mockConfig, 'get').mockImplementation((key: string) => { - if (key === 'DISABLE_MULTI_WORKSPACE') { - return 'true'; - } else { - return process.env[key]; - } - }); - }); - describe('sign in via Google OAuth', () => { - let sso_configs; - const token = 'some-Token'; - beforeEach(() => { - sso_configs = current_organization.ssoConfigs.find((conf) => conf.sso === 'google'); - }); - it('should return 401 if google sign in is disabled', async () => { - await ssoConfigsRepository.update(sso_configs.id, { enabled: false }); - await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }) - .expect(401); - }); - - it('should return 401 when the user does not exist and sign up is disabled', async () => { - await orgRepository.update(current_organization.id, { enableSignUp: false }); - const googleVerifyMock = jest.spyOn(OAuth2Client.prototype, 'verifyIdToken'); - googleVerifyMock.mockImplementation(() => ({ - getPayload: () => ({ - sub: 'someSSOId', - email: 'ssoUser@tooljet.io', - name: 'SSO User', - hd: 'tooljet.io', - }), - })); - await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }) - .expect(401); - }); - - it('should return 401 when the user does not exist domain mismatch', async () => { - await orgRepository.update(current_organization.id, { domain: 'tooljet.io,tooljet.com' }); - const googleVerifyMock = jest.spyOn(OAuth2Client.prototype, 'verifyIdToken'); - googleVerifyMock.mockImplementation(() => ({ - getPayload: () => ({ - sub: 'someSSOId', - email: 'ssoUser@tooljett.io', - name: 'SSO User', - hd: 'tooljet.io', - }), - })); - await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }) - .expect(401); - }); - - it('should return redirect url when the user does not exist and domain matches and sign up is enabled', async () => { - await orgRepository.update(current_organization.id, { domain: 'tooljet.io,tooljet.com' }); - const googleVerifyMock = jest.spyOn(OAuth2Client.prototype, 'verifyIdToken'); - googleVerifyMock.mockImplementation(() => ({ - getPayload: () => ({ - sub: 'someSSOId', - email: 'ssoUser@tooljet.io', - name: 'SSO User', - hd: 'tooljet.io', - }), - })); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(googleVerifyMock).toHaveBeenCalledWith({ - idToken: token, - audience: sso_configs.configs.clientId, - }); - - const url = await generateRedirectUrl('ssoUser@tooljet.io', current_organization, true); - - const { redirect_url } = response.body; - expect(redirect_url).toEqual(url); - }); - - it('should return redirect url when the user does not exist and sign up is enabled', async () => { - const googleVerifyMock = jest.spyOn(OAuth2Client.prototype, 'verifyIdToken'); - googleVerifyMock.mockImplementation(() => ({ - getPayload: () => ({ - sub: 'someSSOId', - email: 'ssoUser@tooljet.io', - name: 'SSO User', - hd: 'tooljet.io', - }), - })); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(googleVerifyMock).toHaveBeenCalledWith({ - idToken: token, - audience: sso_configs.configs.clientId, - }); - - const url = await generateRedirectUrl('ssoUser@tooljet.io', current_organization, true); - - const { redirect_url } = response.body; - expect(redirect_url).toEqual(url); - }); - it('should return redirect url when the user does not exist and name not available and sign up is enabled', async () => { - const googleVerifyMock = jest.spyOn(OAuth2Client.prototype, 'verifyIdToken'); - googleVerifyMock.mockImplementation(() => ({ - getPayload: () => ({ - sub: 'someSSOId', - email: 'ssoUser@tooljet.io', - name: '', - hd: 'tooljet.io', - }), - })); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(googleVerifyMock).toHaveBeenCalledWith({ - idToken: token, - audience: sso_configs.configs.clientId, - }); - - const url = await generateRedirectUrl('ssoUser@tooljet.io', current_organization, true); - - const { redirect_url } = response.body; - expect(redirect_url).toEqual(url); - }); - it('should return 401 when the user exist but archived and sign up is enabled', async () => { - await createUser(app, { - firstName: 'SSO', - lastName: 'userExist', - email: 'anotherUser1@tooljet.io', - groups: ['all_users'], - organization: current_organization, - status: 'archived', - }); - const googleVerifyMock = jest.spyOn(OAuth2Client.prototype, 'verifyIdToken'); - googleVerifyMock.mockImplementation(() => ({ - getPayload: () => ({ - sub: 'someSSOId', - email: 'anotherUser1@tooljet.io', - name: '', - hd: 'tooljet.io', - }), - })); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(googleVerifyMock).toHaveBeenCalledWith({ - idToken: token, - audience: sso_configs.configs.clientId, - }); - - expect(response.statusCode).toBe(401); - }); - it('should return login info when the user exist', async () => { - await createUser(app, { - firstName: 'SSO', - lastName: 'userExist', - email: 'anotherUser1@tooljet.io', - groups: ['all_users'], - organization: current_organization, - status: 'active', - }); - const googleVerifyMock = jest.spyOn(OAuth2Client.prototype, 'verifyIdToken'); - googleVerifyMock.mockImplementation(() => ({ - getPayload: () => ({ - sub: 'someSSOId', - email: 'anotherUser1@tooljet.io', - name: 'SSO User', - hd: 'tooljet.io', - }), - })); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(googleVerifyMock).toHaveBeenCalledWith({ - idToken: token, - audience: sso_configs.configs.clientId, - }); - - expect(response.statusCode).toBe(201); - expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; - - expect(email).toEqual('anotherUser1@tooljet.io'); - expect(first_name).toEqual('SSO'); - expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); - }); - it('should return login info when the user exist with invited status', async () => { - const { orgUser } = await createUser(app, { - firstName: 'SSO', - lastName: 'userExist', - email: 'anotherUser1@tooljet.io', - groups: ['all_users'], - organization: current_organization, - status: 'invited', - }); - const googleVerifyMock = jest.spyOn(OAuth2Client.prototype, 'verifyIdToken'); - googleVerifyMock.mockImplementation(() => ({ - getPayload: () => ({ - sub: 'someSSOId', - email: 'anotherUser1@tooljet.io', - name: 'SSO User', - hd: 'tooljet.io', - }), - })); - - const response = await request(app.getHttpServer()) - .post('/api/oauth/sign-in/' + sso_configs.id) - .send({ token }); - - expect(googleVerifyMock).toHaveBeenCalledWith({ - idToken: token, - audience: sso_configs.configs.clientId, - }); - - expect(response.statusCode).toBe(201); - expect(Object.keys(response.body).sort()).toEqual(authResponseKeys); - - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; - - expect(email).toEqual('anotherUser1@tooljet.io'); - expect(first_name).toEqual('SSO'); - expect(last_name).toEqual('userExist'); - expect(admin).toBeFalsy(); - expect(organization_id).toBe(current_organization.id); - expect(organization).toBe(current_organization.name); - expect(group_permissions).toHaveLength(1); - expect(group_permissions[0].group).toEqual('all_users'); - expect(Object.keys(group_permissions[0]).sort()).toEqual(groupPermissionsKeys); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(current_organization.id); await orgUser.reload(); expect(orgUser.status).toEqual('active'); }); diff --git a/server/test/controllers/onboarding/form-auth.e2e-spec.ts b/server/test/controllers/onboarding/form-auth.e2e-spec.ts index 9579b064bb..119bc44857 100644 --- a/server/test/controllers/onboarding/form-auth.e2e-spec.ts +++ b/server/test/controllers/onboarding/form-auth.e2e-spec.ts @@ -4,12 +4,12 @@ import { Organization } from 'src/entities/organization.entity'; import { OrganizationUser } from 'src/entities/organization_user.entity'; import { User } from 'src/entities/user.entity'; import { - authHeaderForUser, clearDB, createNestAppInstanceWithEnvMock, createUser, verifyInviteToken, setUpAccountFromToken, + authenticateUser, } from '../../test.helper'; import { Repository } from 'typeorm'; @@ -19,6 +19,8 @@ describe('Form Onboarding', () => { let orgRepository: Repository; let orgUserRepository: Repository; let current_user: User; + let loggedUser: any; + let loggedOrgUser: any; let current_organization: Organization; let org_user: User; let org_user_organization: Organization; @@ -102,9 +104,11 @@ describe('Form Onboarding', () => { }); it('should allow user to view apps', async () => { + loggedUser = await authenticateUser(app, current_user.email); const response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); }); @@ -115,7 +119,8 @@ describe('Form Onboarding', () => { const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'org_user@tooljet.com', first_name: 'test', last_name: 'test' }) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); const { status } = response; expect(status).toBe(201); }); @@ -147,9 +152,11 @@ describe('Form Onboarding', () => { }); it('should allow user to view apps', async () => { + loggedOrgUser = await authenticateUser(app, org_user.email); const response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(org_user)); + .set('tj-workspace-id', org_user?.defaultOrganizationId) + .set('Cookie', loggedOrgUser.tokenCookie); expect(response.statusCode).toBe(200); }); @@ -163,7 +170,8 @@ describe('Form Onboarding', () => { const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'admin@tooljet.com' }) - .set('Authorization', authHeaderForUser(org_user)); + .set('tj-workspace-id', org_user?.defaultOrganizationId) + .set('Cookie', loggedOrgUser.tokenCookie); const { status } = response; expect(status).toBe(201); }); @@ -202,7 +210,8 @@ describe('Form Onboarding', () => { it('should allow the new user to view apps', async () => { const response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(invitedUser)); + .set('tj-workspace-id', invitedUser?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); }); @@ -220,6 +229,7 @@ describe('Form Onboarding', () => { }); current_user = user; current_organization = organization; + loggedUser = await authenticateUser(app, user.email); }); it('should signup user', async () => { const response = await request(app.getHttpServer()) @@ -247,7 +257,8 @@ describe('Form Onboarding', () => { const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'another_user@tooljet.com' }) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); const { status } = response; expect(status).toBe(201); }); @@ -284,6 +295,7 @@ describe('Form Onboarding', () => { }); current_user = user; current_organization = organization; + loggedUser = await authenticateUser(app, user.email); }); it('should signup user', async () => { const response = await request(app.getHttpServer()) @@ -311,7 +323,8 @@ describe('Form Onboarding', () => { const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'another_user@tooljet.com' }) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); const { status } = response; expect(status).toBe(201); }); @@ -352,12 +365,14 @@ describe('Form Onboarding', () => { }); current_user = user; current_organization = organization; + loggedUser = await authenticateUser(app, 'admin@tooljet.com'); }); it('should invite user to another workspace', async () => { const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'another_user@tooljet.com', first_name: 'another', last_name: 'user', password: 'password' }) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); const { status } = response; expect(status).toBe(201); @@ -420,12 +435,14 @@ describe('Form Onboarding', () => { }); current_user = user; current_organization = organization; + loggedUser = await authenticateUser(app, user.email); }); it('should invite user to another workspace', async () => { const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'another_user@tooljet.com', first_name: 'another', last_name: 'user', password: 'password' }) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); const { status } = response; expect(status).toBe(201); @@ -448,6 +465,7 @@ describe('Form Onboarding', () => { it('should not signup the same invited user', async () => { const response = await request(app.getHttpServer()) .post('/api/signup') + .set('tj-workspace-id', current_user?.defaultOrganizationId) .send({ email: 'another_user@tooljet.com', name: 'another user', password: 'password' }); expect(response.statusCode).toBe(406); }); diff --git a/server/test/controllers/onboarding/git-sso-auth.e2e-spec.ts b/server/test/controllers/onboarding/git-sso-auth.e2e-spec.ts index b92067c338..98205a2040 100644 --- a/server/test/controllers/onboarding/git-sso-auth.e2e-spec.ts +++ b/server/test/controllers/onboarding/git-sso-auth.e2e-spec.ts @@ -4,7 +4,7 @@ import { Organization } from 'src/entities/organization.entity'; import { OrganizationUser } from 'src/entities/organization_user.entity'; import { User } from 'src/entities/user.entity'; import { - authHeaderForUser, + authenticateUser, clearDB, createFirstUser, createNestAppInstanceWithEnvMock, @@ -34,6 +34,8 @@ describe('Git Onboarding', () => { let signupUrl: string; let ssoRedirectUrl: string; let mockConfig; + let loggedUser: any; + let loggedOrgUser: any; beforeAll(async () => { ({ app, mockConfig } = await createNestAppInstanceWithEnvMock()); @@ -116,9 +118,11 @@ describe('Git Onboarding', () => { }); it('should allow user to view apps', async () => { + loggedUser = await authenticateUser(app, current_user.email); const response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); }); @@ -129,7 +133,8 @@ describe('Git Onboarding', () => { const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'org_user@tooljet.com', first_name: 'test', last_name: 'test' }) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); const { status } = response; expect(status).toBe(201); }); @@ -159,12 +164,14 @@ describe('Git Onboarding', () => { source: 'sso', }; await setUpAccountFromToken(app, org_user, org_user_organization, payload); + loggedOrgUser = await authenticateUser(app, org_user.email); }); it('should allow user to view apps', async () => { const response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(org_user)); + .set('tj-workspace-id', org_user?.defaultOrganizationId) + .set('Cookie', loggedOrgUser.tokenCookie); expect(response.statusCode).toBe(200); }); @@ -178,7 +185,8 @@ describe('Git Onboarding', () => { const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'ssousergit@tooljet.com' }) - .set('Authorization', authHeaderForUser(org_user)); + .set('tj-workspace-id', org_user?.defaultOrganizationId) + .set('Cookie', loggedOrgUser.tokenCookie); const { status } = response; expect(status).toBe(201); }); @@ -217,7 +225,8 @@ describe('Git Onboarding', () => { it('should allow the new user to view apps', async () => { const response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(invitedUser)); + .set('tj-workspace-id', invitedUser?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); }); @@ -386,10 +395,12 @@ describe('Git Onboarding', () => { }); it('should send invitation link to the user', async () => { + loggedUser = await authenticateUser(app, current_user.email); const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'org_user@tooljet.com', first_name: 'test', last_name: 'test' }) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); const { status } = response; expect(status).toBe(201); }); diff --git a/server/test/controllers/onboarding/google-sso-auth.e2e-spec.ts b/server/test/controllers/onboarding/google-sso-auth.e2e-spec.ts index 666926e203..fc764709a9 100644 --- a/server/test/controllers/onboarding/google-sso-auth.e2e-spec.ts +++ b/server/test/controllers/onboarding/google-sso-auth.e2e-spec.ts @@ -4,7 +4,7 @@ import { Organization } from 'src/entities/organization.entity'; import { OrganizationUser } from 'src/entities/organization_user.entity'; import { User } from 'src/entities/user.entity'; import { - authHeaderForUser, + authenticateUser, clearDB, createFirstUser, createNestAppInstanceWithEnvMock, @@ -30,6 +30,8 @@ describe('Google SSO Onboarding', () => { let ssoRedirectUrl: string; let signupUrl: string; let mockConfig; + let loggedUser: any; + let loggedOrgUser: any; beforeAll(async () => { ({ app, mockConfig } = await createNestAppInstanceWithEnvMock()); @@ -95,9 +97,11 @@ describe('Google SSO Onboarding', () => { }); it('should allow user to view apps', async () => { + loggedUser = await authenticateUser(app, current_user.email); const response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); }); @@ -108,7 +112,8 @@ describe('Google SSO Onboarding', () => { const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'org_user@tooljet.com', first_name: 'test', last_name: 'test' }) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); const { status } = response; expect(status).toBe(201); }); @@ -141,9 +146,11 @@ describe('Google SSO Onboarding', () => { }); it('should allow user to view apps', async () => { + loggedOrgUser = await authenticateUser(app, org_user.email); const response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(org_user)); + .set('tj-workspace-id', org_user?.defaultOrganizationId) + .set('Cookie', loggedOrgUser.tokenCookie); expect(response.statusCode).toBe(200); }); @@ -157,7 +164,8 @@ describe('Google SSO Onboarding', () => { const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'ssouser@tooljet.com' }) - .set('Authorization', authHeaderForUser(org_user)); + .set('tj-workspace-id', org_user?.defaultOrganizationId) + .set('Cookie', loggedOrgUser.tokenCookie); const { status } = response; expect(status).toBe(201); }); @@ -196,7 +204,8 @@ describe('Google SSO Onboarding', () => { it('should allow the new user to view apps', async () => { const response = await request(app.getHttpServer()) .get(`/api/apps`) - .set('Authorization', authHeaderForUser(invitedUser)); + .set('tj-workspace-id', invitedUser?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); }); @@ -339,10 +348,12 @@ describe('Google SSO Onboarding', () => { }); it('should send invitation link to the user', async () => { + loggedUser = await authenticateUser(app, current_user.email); const response = await request(app.getHttpServer()) .post('/api/organization_users') .send({ email: 'org_user@tooljet.com', first_name: 'test', last_name: 'test' }) - .set('Authorization', authHeaderForUser(current_user)); + .set('tj-workspace-id', current_user?.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); const { status } = response; expect(status).toBe(201); }); diff --git a/server/test/controllers/org_environment_variables.e2e-spec.ts b/server/test/controllers/org_environment_variables.e2e-spec.ts index 2127c91174..e9f03277e3 100644 --- a/server/test/controllers/org_environment_variables.e2e-spec.ts +++ b/server/test/controllers/org_environment_variables.e2e-spec.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; -import { authHeaderForUser, clearDB, createUser, createNestAppInstance, createGroupPermission } from '../test.helper'; +import { clearDB, createUser, createNestAppInstance, createGroupPermission, authenticateUser } from '../test.helper'; import { getManager } from 'typeorm'; import { GroupPermission } from 'src/entities/group_permission.entity'; import { OrgEnvironmentVariable } from 'src/entities/org_envirnoment_variable.entity'; @@ -9,7 +9,8 @@ import { OrgEnvironmentVariable } from 'src/entities/org_envirnoment_variable.en const createVariable = async (app: INestApplication, adminUserData: any, body: any) => { return await request(app.getHttpServer()) .post(`/api/organization-variables/`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send(body); }; @@ -64,6 +65,15 @@ describe('organization environment variables controller', () => { }, ]; + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const variableArray = []; for (const body in bodyArray) { const result = await createVariable(app, adminUserData, body); @@ -72,19 +82,22 @@ describe('organization environment variables controller', () => { await request(app.getHttpServer()) .get(`/api/organization-variables/`) - .set('Authorization', authHeaderForUser(developerUserData.user)) + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']) .send() .expect(200); await request(app.getHttpServer()) .get(`/api/organization-variables/`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send() .expect(200); const listResponse = await request(app.getHttpServer()) .get(`/api/organization-variables/`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send() .expect(200); @@ -125,21 +138,33 @@ describe('organization environment variables controller', () => { orgEnvironmentVariableCreate: true, }); + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + await request(app.getHttpServer()) .post(`/api/organization-variables/`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('Cookie', adminUserData['tokenCookie']) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .send({ variable_name: 'email', variable_type: 'server', value: 'test@tooljet.io', encrypted: true }) .expect(201); await request(app.getHttpServer()) .post(`/api/organization-variables/`) - .set('Authorization', authHeaderForUser(developerUserData.user)) + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']) .send({ variable_name: 'name', variable_type: 'client', value: 'demo user', encrypted: false }) .expect(201); await request(app.getHttpServer()) .post(`/api/organization-variables/`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send({ variable_name: 'pi', variable_type: 'server', value: '3.14', encrypted: true }) .expect(403); }); @@ -163,6 +188,15 @@ describe('organization environment variables controller', () => { organization: adminUserData.organization, }); + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerGroup = await getManager().findOneOrFail(GroupPermission, { where: { group: 'developer' }, }); @@ -181,7 +215,8 @@ describe('organization environment variables controller', () => { for (const userData of [adminUserData, developerUserData]) { await request(app.getHttpServer()) .patch(`/api/organization-variables/${response.body.variable.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ variable_name: 'secret_email' }) .expect(200); @@ -192,7 +227,8 @@ describe('organization environment variables controller', () => { await request(app.getHttpServer()) .patch(`/api/organization-variables/${response.body.variable.id}`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send({ variable_name: 'email', value: 'test3@tooljet.io' }) .expect(403); }); @@ -216,6 +252,15 @@ describe('organization environment variables controller', () => { organization: adminUserData.organization, }); + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(app, 'dev@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerGroup = await getManager().findOneOrFail(GroupPermission, { where: { group: 'developer' }, }); @@ -236,7 +281,8 @@ describe('organization environment variables controller', () => { await request(app.getHttpServer()) .delete(`/api/organization-variables/${response.body.variable.id}`) - .set('Authorization', authHeaderForUser(userData.user)) + .set('tj-workspace-id', userData.user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send() .expect(200); @@ -253,7 +299,8 @@ describe('organization environment variables controller', () => { await request(app.getHttpServer()) .delete(`/api/organization-variables/${response.body.variable.id}`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send() .expect(403); }); diff --git a/server/test/controllers/organization_users.e2e-spec.ts b/server/test/controllers/organization_users.e2e-spec.ts index 66728fbb09..312e7e7399 100644 --- a/server/test/controllers/organization_users.e2e-spec.ts +++ b/server/test/controllers/organization_users.e2e-spec.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import * as request from 'supertest'; import { BadRequestException, INestApplication } from '@nestjs/common'; -import { authHeaderForUser, clearDB, createUser, createNestAppInstance } from '../test.helper'; +import { authHeaderForUser, clearDB, createUser, createNestAppInstance, authenticateUser } from '../test.helper'; describe('organization users controller', () => { let app: INestApplication; @@ -29,33 +29,45 @@ describe('organization users controller', () => { const organization = adminUserData.organization; + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const developerUserData = await createUser(app, { email: 'developer@tooljet.io', groups: ['developer', 'all_users'], organization, }); + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['viewer', 'all_users'], organization, }); + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + await request(app.getHttpServer()) .post(`/api/organization_users/`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .send({ email: 'test@tooljet.io' }) .expect(201); await request(app.getHttpServer()) .post(`/api/organization_users/`) - .set('Authorization', authHeaderForUser(developerUserData.user)) + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']) .send({ email: 'test2@tooljet.io' }) .expect(403); await request(app.getHttpServer()) .post(`/api/organization_users/`) - .set('Authorization', authHeaderForUser(viewerUserData.user)) + .set('tj-workspace-id', viewerUserData.user.defaultOrganizationId) + .set('Cookie', viewerUserData['tokenCookie']) .send({ email: 'test3@tooljet.io' }) .expect(403); }); @@ -71,6 +83,10 @@ describe('organization users controller', () => { groups: ['admin', 'all_users'], status: 'active', }); + + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const organization = adminUserData.organization; const anotherAdminUserData = await createUser(app, { email: 'another-admin@tooljet.io', @@ -88,12 +104,14 @@ describe('organization users controller', () => { await request(app.getHttpServer()) .post(`/api/organization_users/${anotherAdminUserData.orgUser.id}/archive/`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .expect(201); const response = await request(app.getHttpServer()) .post(`/api/organization_users/${adminUserData.orgUser.id}/archive/`) - .set('Authorization', authHeaderForUser(adminUserData.user)); + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']); expect(response.statusCode).toEqual(400); expect(response.body.message).toEqual('Atleast one active admin is required.'); @@ -104,12 +122,20 @@ describe('organization users controller', () => { email: 'admin@tooljet.io', groups: ['admin', 'all_users'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const organization = adminUserData.organization; const developerUserData = await createUser(app, { email: 'developer@tooljet.io', groups: ['developer', 'all_users'], organization, }); + + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', groups: ['viewer', 'all_users'], @@ -119,7 +145,8 @@ describe('organization users controller', () => { await request(app.getHttpServer()) .post(`/api/organization_users/${viewerUserData.orgUser.id}/archive/`) - .set('Authorization', authHeaderForUser(developerUserData.user)) + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']) .expect(403); await viewerUserData.orgUser.reload(); @@ -127,7 +154,8 @@ describe('organization users controller', () => { await request(app.getHttpServer()) .post(`/api/organization_users/${viewerUserData.orgUser.id}/archive/`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .expect(201); await viewerUserData.orgUser.reload(); @@ -146,6 +174,10 @@ describe('organization users controller', () => { status: 'active', groups: ['admin', 'all_users'], }); + + let loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const organization = adminUserData.organization; const developerUserData = await createUser(app, { email: 'developer@tooljet.io', @@ -153,6 +185,10 @@ describe('organization users controller', () => { groups: ['developer', 'all_users'], organization, }); + + loggedUser = await authenticateUser(app, 'developer@tooljet.io'); + developerUserData['tokenCookie'] = loggedUser.tokenCookie; + const viewerUserData = await createUser(app, { email: 'viewer@tooljet.io', status: 'archived', @@ -160,9 +196,13 @@ describe('organization users controller', () => { organization, }); + loggedUser = await authenticateUser(app, 'viewer@tooljet.io'); + viewerUserData['tokenCookie'] = loggedUser.tokenCookie; + await request(app.getHttpServer()) .post(`/api/organization_users/${viewerUserData.orgUser.id}/unarchive/`) - .set('Authorization', authHeaderForUser(developerUserData.user)) + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']) .expect(403); await viewerUserData.orgUser.reload(); @@ -170,7 +210,8 @@ describe('organization users controller', () => { await request(app.getHttpServer()) .post(`/api/organization_users/${viewerUserData.orgUser.id}/unarchive/`) - .set('Authorization', authHeaderForUser(developerUserData.user)) + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', developerUserData['tokenCookie']) .expect(403); await viewerUserData.orgUser.reload(); @@ -178,7 +219,8 @@ describe('organization users controller', () => { await request(app.getHttpServer()) .post(`/api/organization_users/${viewerUserData.orgUser.id}/unarchive/`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .expect(201); await viewerUserData.orgUser.reload(); @@ -194,6 +236,10 @@ describe('organization users controller', () => { status: 'active', groups: ['admin', 'all_users'], }); + + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + const organization = adminUserData.organization; const developerUserData = await createUser(app, { email: 'developer@tooljet.io', @@ -204,7 +250,8 @@ describe('organization users controller', () => { await request(app.getHttpServer()) .post(`/api/organization_users/${developerUserData.orgUser.id}/unarchive/`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .expect(400); await developerUserData.orgUser.reload(); @@ -225,9 +272,13 @@ describe('organization users controller', () => { organization, }); + const loggedUser = await authenticateUser(app); + adminUserData['tokenCookie'] = loggedUser.tokenCookie; + await request(app.getHttpServer()) .post(`/api/organization_users/${developerUserData.orgUser.id}/unarchive/`) - .set('Authorization', authHeaderForUser(adminUserData.user)) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) + .set('Cookie', adminUserData['tokenCookie']) .expect(400); await developerUserData.orgUser.reload(); diff --git a/server/test/controllers/organizations.e2e-spec.ts b/server/test/controllers/organizations.e2e-spec.ts index a0adee1936..c06d108900 100644 --- a/server/test/controllers/organizations.e2e-spec.ts +++ b/server/test/controllers/organizations.e2e-spec.ts @@ -1,6 +1,6 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; -import { authHeaderForUser, clearDB, createUser, createNestAppInstanceWithEnvMock } from '../test.helper'; +import { clearDB, createUser, createNestAppInstanceWithEnvMock, authenticateUser } from '../test.helper'; import { Repository } from 'typeorm'; import { SSOConfigs } from 'src/entities/sso_config.entity'; import { User } from 'src/entities/user.entity'; @@ -35,9 +35,13 @@ describe('organizations controller', () => { const userData = await createUser(app, { email: 'admin@tooljet.io' }); const { user, orgUser } = userData; + const loggedUser = await authenticateUser(app); + userData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .get('/api/organizations/users?page=1') - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(200); expect(response.body.users.length).toBe(1); @@ -65,70 +69,59 @@ describe('organizations controller', () => { const { user, organization } = await createUser(app, { email: 'admin@tooljet.io', }); + + const loggedUser = await authenticateUser(app); + const response = await request(app.getHttpServer()) .post('/api/organizations') .send({ name: 'My workspace' }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(201); - expect(response.body.organization_id).not.toBe(organization.id); - expect(response.body.organization).toBe('My workspace'); - expect(response.body.admin).toBeTruthy(); + expect(response.body.current_organization_id).not.toBe(organization.id); const newUser = await userRepository.findOneOrFail({ where: { id: user.id } }); - expect(newUser.defaultOrganizationId).toBe(response.body.organization_id); + expect(newUser.defaultOrganizationId).toBe(response.body.current_organization_id); }); it('should throw error if name is empty', async () => { const { user } = await createUser(app, { email: 'admin@tooljet.io' }); + const loggedUser = await authenticateUser(app); const response = await request(app.getHttpServer()) .post('/api/organizations') .send({ name: '' }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(400); }); it('should throw error if name is longer than 25 characters', async () => { const { user } = await createUser(app, { email: 'admin@tooljet.io' }); + const loggedUser = await authenticateUser(app); const response = await request(app.getHttpServer()) .post('/api/organizations') .send({ name: 'xxxxxxxxxxxxxxxxxxxxxxxxxx' }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(400); }); - it('should not create new organization if Multi-Workspace not supported', async () => { - jest.spyOn(mockConfig, 'get').mockImplementation((key: string) => { - switch (key) { - case 'DISABLE_MULTI_WORKSPACE': - return 'true'; - default: - return process.env[key]; - } - }); - const { user } = await createUser(app, { email: 'admin@tooljet.io' }); - await request(app.getHttpServer()) - .post('/api/organizations') - .send({ name: 'My workspace' }) - .set('Authorization', authHeaderForUser(user)) - .expect(403); - }); - it('should create new organization if Multi-Workspace supported and user logged in via SSO', async () => { const { user, organization } = await createUser(app, { email: 'admin@tooljet.io', }); + const loggedUser = await authenticateUser(app); const response = await request(app.getHttpServer()) .post('/api/organizations') .send({ name: 'My workspace' }) - .set('Authorization', authHeaderForUser(user, null, false)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(201); - expect(response.body.organization_id).not.toBe(organization.id); - expect(response.body.organization).toBe('My workspace'); - expect(response.body.admin).toBeTruthy(); + expect(response.body.current_organization_id).not.toBe(organization.id); }); }); describe('update organization', () => { @@ -136,10 +129,12 @@ describe('organizations controller', () => { const { user, organization } = await createUser(app, { email: 'admin@tooljet.io', }); + const loggedUser = await authenticateUser(app); const response = await request(app.getHttpServer()) .patch('/api/organizations') .send({ name: 'new name', domain: 'tooljet.io', enableSignUp: true }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); await organization.reload(); @@ -150,10 +145,13 @@ describe('organizations controller', () => { it('should throw error if name is longer than 25 characters', async () => { const { user } = await createUser(app, { email: 'admin@tooljet.io' }); + const loggedUser = await authenticateUser(app); + const response = await request(app.getHttpServer()) .post('/api/organizations') .send({ name: 'xxxxxxxxxxxxxxxxxxxxxxxxxx' }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(400); }); @@ -165,10 +163,12 @@ describe('organizations controller', () => { groups: ['all_users'], organization, }); + const loggedUser = await authenticateUser(app, 'developer@tooljet.io'); const response = await request(app.getHttpServer()) .patch('/api/organizations') .send({ name: 'new name', domain: 'tooljet.io', enableSignUp: true }) - .set('Authorization', authHeaderForUser(developerUserData.user)); + .set('tj-workspace-id', developerUserData.user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(403); }); @@ -178,10 +178,12 @@ describe('organizations controller', () => { const { user } = await createUser(app, { email: 'admin@tooljet.io', }); + const loggedUser = await authenticateUser(app); const response = await request(app.getHttpServer()) .patch('/api/organizations/configs') .send({ type: 'git', configs: { clientId: 'client-id', clientSecret: 'client-secret' }, enabled: true }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); const ssoConfigs = await ssoConfigsRepository.findOneOrFail({ where: { id: response.body.id } }); @@ -196,10 +198,12 @@ describe('organizations controller', () => { email: 'admin@tooljet.io', groups: ['all_users'], }); + const loggedUser = await authenticateUser(app); const response = await request(app.getHttpServer()) .patch('/api/organizations/configs') .send({ type: 'git', configs: { clientId: 'client-id', clientSecret: 'client-secret' }, enabled: true }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(403); }); @@ -209,16 +213,19 @@ describe('organizations controller', () => { const { user, organization } = await createUser(app, { email: 'admin@tooljet.io', }); + const loggedUser = await authenticateUser(app); const response = await request(app.getHttpServer()) .patch('/api/organizations/configs') .send({ type: 'git', configs: { clientId: 'client-id', clientSecret: 'client-secret' }, enabled: true }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); const getResponse = await request(app.getHttpServer()) .get('/api/organizations/configs') - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(getResponse.statusCode).toBe(200); @@ -240,113 +247,27 @@ describe('organizations controller', () => { email: 'admin@tooljet.io', groups: ['all_users'], }); + const loggedUser = await authenticateUser(app); const response = await request(app.getHttpServer()) .get('/api/organizations/configs') - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(403); }); }); describe('get public organization configs', () => { - it('should get organization details for all users for single organization', async () => { - jest.spyOn(mockConfig, 'get').mockImplementation((key: string) => { - switch (key) { - case 'DISABLE_MULTI_WORKSPACE': - return 'true'; - default: - return process.env[key]; - } - }); - const { user } = await createUser(app, { - email: 'admin@tooljet.io', - }); - const response = await request(app.getHttpServer()) - .patch('/api/organizations/configs') - .send({ type: 'git', configs: { clientId: 'client-id', clientSecret: 'client-secret' }, enabled: true }) - .set('Authorization', authHeaderForUser(user)); - - expect(response.statusCode).toBe(200); - - const authGetResponse = await request(app.getHttpServer()) - .get('/api/organizations/configs') - .set('Authorization', authHeaderForUser(user)); - - expect(authGetResponse.statusCode).toBe(200); - - const getResponse = await request(app.getHttpServer()).get('/api/organizations/public-configs'); - - expect(getResponse.statusCode).toBe(200); - expect(getResponse.body).toEqual({ - sso_configs: { - name: 'Test Organization', - enable_sign_up: false, - form: { - config_id: authGetResponse.body.organization_details.sso_configs.find((ob) => ob.sso === 'form').id, - sso: 'form', - configs: {}, - enabled: true, - }, - git: { - config_id: authGetResponse.body.organization_details.sso_configs.find((ob) => ob.sso === 'git').id, - sso: 'git', - configs: { client_id: 'client-id', client_secret: '' }, - enabled: true, - }, - }, - }); - }); - - it('should get organization details and should not consider instance level SSO for all users for single organization', async () => { - jest.spyOn(mockConfig, 'get').mockImplementation((key: string) => { - switch (key) { - case 'DISABLE_MULTI_WORKSPACE': - return 'true'; - case 'SSO_GOOGLE_OAUTH2_CLIENT_ID': - return 'google-client-id'; - case 'SSO_GIT_OAUTH2_CLIENT_ID': - return 'git-client-id'; - case 'SSO_GIT_OAUTH2_CLIENT_SECRET': - return 'git-secret'; - default: - return process.env[key]; - } - }); - const { user } = await createUser(app, { - email: 'admin@tooljet.io', - }); - - const authGetResponse = await request(app.getHttpServer()) - .get('/api/organizations/configs') - .set('Authorization', authHeaderForUser(user)); - - expect(authGetResponse.statusCode).toBe(200); - - const getResponse = await request(app.getHttpServer()).get('/api/organizations/public-configs'); - - expect(getResponse.statusCode).toBe(200); - expect(getResponse.body).toEqual({ - sso_configs: { - name: 'Test Organization', - enable_sign_up: false, - form: { - config_id: authGetResponse.body.organization_details.sso_configs.find((ob) => ob.sso === 'form').id, - sso: 'form', - configs: {}, - enabled: true, - }, - }, - }); - }); - it('should get organization specific details for all users for multiple organization deployment', async () => { const { user, organization } = await createUser(app, { email: 'admin@tooljet.io', }); + const loggedUser = await authenticateUser(app); const response = await request(app.getHttpServer()) .patch('/api/organizations/configs') .send({ type: 'git', configs: { clientId: 'client-id', clientSecret: 'client-secret' }, enabled: true }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); @@ -358,7 +279,8 @@ describe('organizations controller', () => { const authGetResponse = await request(app.getHttpServer()) .get('/api/organizations/configs') - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(authGetResponse.statusCode).toBe(200); @@ -400,10 +322,13 @@ describe('organizations controller', () => { email: 'admin@tooljet.io', }); + const loggedUser = await authenticateUser(app); + const response = await request(app.getHttpServer()) .patch('/api/organizations/configs') .send({ type: 'git', configs: { clientId: 'org-client-id', clientSecret: 'client-secret' }, enabled: true }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(response.statusCode).toBe(200); @@ -415,7 +340,8 @@ describe('organizations controller', () => { const authGetResponse = await request(app.getHttpServer()) .get('/api/organizations/configs') - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(authGetResponse.statusCode).toBe(200); @@ -462,6 +388,8 @@ describe('organizations controller', () => { email: 'admin@tooljet.io', }); + const loggedUser = await authenticateUser(app); + const getResponse = await request(app.getHttpServer()).get( `/api/organizations/${organization.id}/public-configs` ); @@ -470,7 +398,8 @@ describe('organizations controller', () => { const authGetResponse = await request(app.getHttpServer()) .get('/api/organizations/configs') - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', loggedUser.tokenCookie); expect(authGetResponse.statusCode).toBe(200); diff --git a/server/test/controllers/session.e2e-spec.ts b/server/test/controllers/session.e2e-spec.ts new file mode 100644 index 0000000000..f3fd9a9ecf --- /dev/null +++ b/server/test/controllers/session.e2e-spec.ts @@ -0,0 +1,106 @@ +import { INestApplication } from '@nestjs/common'; +import { clearDB, createUser, createNestAppInstance, logoutUser, authenticateUser } from '../test.helper'; +import * as request from 'supertest'; + +describe('session & new apis', () => { + let app: INestApplication; + let tokenCookie: string; + let orgId: string; + beforeEach(async () => { + await clearDB(); + const { organization } = await createUser(app, { + email: 'admin@tooljet.io', + firstName: 'user', + lastName: 'name', + }); + orgId = organization.id; + const { tokenCookie: tokenCookieData } = await authenticateUser(app); + tokenCookie = tokenCookieData; + }); + + beforeAll(async () => { + app = await createNestAppInstance(); + }); + + afterEach(async () => { + await logoutUser(app, tokenCookie, orgId); + }); + + it('Should return 403 if the auth token is invalid', async () => { + await request.agent(app.getHttpServer()).get('/api/authorize').set('tj-workspace-id', orgId).expect(403); + }); + + describe('GET /api/authorize', () => { + it("should return 401 if the organization-id isn't available in the auth token", async () => { + const response = await request(app.getHttpServer()) + .post('/api/organizations') + .send({ name: 'My workspace' }) + .set('Cookie', tokenCookie) + .set('tj-workspace-id', orgId); + + await request + .agent(app.getHttpServer()) + .get('/api/authorize') + .set('Cookie', tokenCookie) + .set('tj-workspace-id', response.body.current_organization_id) + .expect(401); + }); + + it('should return 404 if the user not in the specific organization', async () => { + const { organization } = await createUser(app, { + email: 'admin2@tooljet.io', + firstName: 'user', + lastName: 'name', + }); + + await request + .agent(app.getHttpServer()) + .get('/api/authorize') + .set('Cookie', tokenCookie) + .set('tj-workspace-id', organization.id) + .expect(401); + }); + + it('should return the organization details if the auth token have the organization id', async () => { + await request(app.getHttpServer()) + .get('/api/authorize') + .set('Cookie', tokenCookie) + .set('tj-workspace-id', orgId) + .expect(200); + }); + }); + + describe('GET /api/profile', () => { + it('should return the user details', async () => { + await request(app.getHttpServer()) + .get('/api/profile') + .set('Cookie', tokenCookie) + .set('tj-workspace-id', orgId) + .expect(200); + }); + }); + + describe('GET /api/profile', () => { + it('should return the user details', async () => { + await request(app.getHttpServer()) + .get('/api/profile') + .set('Cookie', tokenCookie) + .set('tj-workspace-id', orgId) + .expect(200); + }); + }); + + describe('GET /api/session', () => { + it('should return the current user details', async () => { + await request(app.getHttpServer()) + .get('/api/session') + .set('Cookie', tokenCookie) + .set('tj-workspace-id', orgId) + .expect(200); + }); + }); + + afterAll(async () => { + await app.close(); + }); +}); diff --git a/server/test/controllers/thread.e2e-spec.ts b/server/test/controllers/thread.e2e-spec.ts index c438423315..ceb411926f 100644 --- a/server/test/controllers/thread.e2e-spec.ts +++ b/server/test/controllers/thread.e2e-spec.ts @@ -1,13 +1,13 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; import { - authHeaderForUser, clearDB, createApplication, createUser, createNestAppInstance, createThread, createApplicationVersion, + authenticateUser, } from '../test.helper'; describe('thread controller', () => { @@ -44,10 +44,14 @@ describe('thread controller', () => { appVersionsId: version.id, }); + const loggedUser = await authenticateUser(app); + userData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .get(`/api/threads/${application.id}/all`) .query({ appVersionsId: version.id }) - .set('Authorization', authHeaderForUser(user)); + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']); expect(response.statusCode).toBe(200); expect(response.body).toHaveLength(1); diff --git a/server/test/controllers/tooljet_db.e2e-spec.ts b/server/test/controllers/tooljet_db.e2e-spec.ts index a6bd77f44e..4c1eca3564 100644 --- a/server/test/controllers/tooljet_db.e2e-spec.ts +++ b/server/test/controllers/tooljet_db.e2e-spec.ts @@ -54,6 +54,7 @@ describe.skip('Tooljet DB controller', () => { await request(nestApp.getHttpServer()) .get(`/api/tooljet_db/organizations/${archivedUserData.organization.id}/proxy/table_name`) + .set('tj-workspace-id', archivedUserData.user.defaultOrganizationId) .set('Authorization', authHeaderForUser(archivedUserData.user)) .expect(401); }); @@ -65,6 +66,7 @@ describe.skip('Tooljet DB controller', () => { const response = await request(nestApp.getHttpServer()) .get(`/api/tooljet_db/organizations/${adminUserData.organization.id}/proxy/\${table_name}`) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Authorization', authHeaderForUser(adminUserData.user)); const { message, statusCode } = response.body; @@ -115,6 +117,7 @@ describe.skip('Tooljet DB controller', () => { .get( `/api/tooljet_db/organizations/${adminUserData.organization.id}/proxy/\${actors}?select=first_name,last_name,\${films}(title)}` ) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Authorization', authHeaderForUser(adminUserData.user)); // expect(postgrestResponse).toBeCalledWith(`http://localhost:3001/${actorsTable.id}?select=first_name,last_name,${filmsTable.id}(title)`, expect.anything()); @@ -148,6 +151,7 @@ describe.skip('Tooljet DB controller', () => { await request(nestApp.getHttpServer()) .post(`/api/tooljet_db/organizations/${archivedUserData.organization.id}/table`) + .set('tj-workspace-id', archivedUserData.user.defaultOrganizationId) .set('Authorization', authHeaderForUser(archivedUserData.user)) .expect(401); }); @@ -159,6 +163,7 @@ describe.skip('Tooljet DB controller', () => { const { statusCode } = await request(nestApp.getHttpServer()) .post(`/api/tooljet_db/organizations/${adminUserData.organization.id}/table`) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Authorization', authHeaderForUser(adminUserData.user)) .send({ action: 'create_table', @@ -186,6 +191,7 @@ describe.skip('Tooljet DB controller', () => { await request(nestApp.getHttpServer()) .post(`/api/tooljet_db/organizations/${adminUserData.organization.id}/table`) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Authorization', authHeaderForUser(adminUserData.user)) .send({ action: 'create_table', @@ -195,6 +201,7 @@ describe.skip('Tooljet DB controller', () => { await request(nestApp.getHttpServer()) .post(`/api/tooljet_db/organizations/${adminUserData.organization.id}/table`) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Authorization', authHeaderForUser(adminUserData.user)) .send({ action: 'create_table', @@ -220,6 +227,7 @@ describe.skip('Tooljet DB controller', () => { await request(nestApp.getHttpServer()) .post(`/api/tooljet_db/organizations/${adminUserData.organization.id}/table`) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Authorization', authHeaderForUser(adminUserData.user)) .send({ action: 'create_table', @@ -237,6 +245,7 @@ describe.skip('Tooljet DB controller', () => { const { statusCode } = await request(nestApp.getHttpServer()) .post(`/api/tooljet_db/organizations/${adminUserData.organization.id}/table/test_table/column`) + .set('tj-workspace-id', adminUserData.user.defaultOrganizationId) .set('Authorization', authHeaderForUser(adminUserData.user)) .send({ action: 'add_column', diff --git a/server/test/controllers/users.e2e-spec.ts b/server/test/controllers/users.e2e-spec.ts index 447255e327..b333e44374 100644 --- a/server/test/controllers/users.e2e-spec.ts +++ b/server/test/controllers/users.e2e-spec.ts @@ -1,6 +1,6 @@ import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; -import { authHeaderForUser, clearDB, createUser, createNestAppInstance } from '../test.helper'; +import { clearDB, createUser, createNestAppInstance, authenticateUser } from '../test.helper'; import { getManager } from 'typeorm'; import { User } from 'src/entities/user.entity'; const path = require('path'); @@ -28,9 +28,13 @@ describe('users controller', () => { const oldPassword = user.password; + const loggedUser = await authenticateUser(app); + userData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .patch('/api/users/change_password') - .set('Authorization', authHeaderForUser(user)) + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ currentPassword: 'password', newPassword: 'new password' }); expect(response.statusCode).toBe(200); @@ -44,9 +48,13 @@ describe('users controller', () => { const oldPassword = user.password; + const loggedUser = await authenticateUser(app); + userData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .patch('/api/users/change_password') - .set('Authorization', authHeaderForUser(user)) + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ currentPassword: 'wrong password', newPassword: 'new password', @@ -66,9 +74,13 @@ describe('users controller', () => { const [firstName, lastName] = ['Daenerys', 'Targaryen']; + const loggedUser = await authenticateUser(app); + userData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .patch('/api/users/update') - .set('Authorization', authHeaderForUser(user)) + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .send({ first_name: firstName, last_name: lastName }); expect(response.statusCode).toBe(200); @@ -86,9 +98,13 @@ describe('users controller', () => { const { user } = userData; const filePath = path.join(__dirname, '../__mocks__/avatar.png'); + const loggedUser = await authenticateUser(app); + userData['tokenCookie'] = loggedUser.tokenCookie; + const response = await request(app.getHttpServer()) .post('/api/users/avatar') - .set('Authorization', authHeaderForUser(user)) + .set('tj-workspace-id', user.defaultOrganizationId) + .set('Cookie', userData['tokenCookie']) .attach('file', filePath); expect(response.statusCode).toBe(201); diff --git a/server/test/services/session.service.spec.ts b/server/test/services/session.service.spec.ts new file mode 100644 index 0000000000..68cc35b806 --- /dev/null +++ b/server/test/services/session.service.spec.ts @@ -0,0 +1,61 @@ +import { INestApplication, UnauthorizedException } from '@nestjs/common'; +import { SessionService } from '@services/session.service'; +import { clearDB, createNestAppInstance, setupOrganization } from '../test.helper'; +const uuid = require('uuid'); + +describe('Session Service', () => { + let service: SessionService; + let nestApp: INestApplication; + + beforeEach(async () => { + await clearDB(); + }); + + beforeAll(async () => { + nestApp = await createNestAppInstance(); + service = nestApp.get(SessionService); + }); + + describe('.createSession', () => { + it('should create a user session', async () => { + const { adminUser } = await setupOrganization(nestApp); + + const deviceId = uuid.v4(); + + const session = await service.createSession(adminUser.id, deviceId); + + expect(session.userId).toBe(adminUser.id); + expect(session.device).toBe(deviceId); + }); + }); + + describe('.validateUserSession', () => { + it.only('should throw error id session is invalid', async () => { + const { adminUser } = await setupOrganization(nestApp); + + const deviceId = uuid.v4(); + + const session = await service.createSession(adminUser.id, deviceId); + await expect(service.validateUserSession(uuid.v4(), session.id)).rejects.toThrow(UnauthorizedException); + await expect(service.validateUserSession(adminUser.id, uuid.v4())).rejects.toThrow(UnauthorizedException); + await expect(service.validateUserSession(adminUser.id, session.id)).resolves.not.toThrow(expect.any(Error)); + }); + }); + + describe('.terminateSession', () => { + it('should terminate session', async () => { + const { adminUser } = await setupOrganization(nestApp); + + const deviceId = uuid.v4(); + + const session = await service.createSession(adminUser.id, deviceId); + await expect(service.validateUserSession(uuid.v4(), session.id)).rejects.toThrow(UnauthorizedException); + await expect(service.validateUserSession(adminUser.id, uuid.v4())).rejects.toThrow(UnauthorizedException); + await expect(service.validateUserSession(adminUser.id, session.id)).resolves.not.toThrow(expect.any(Error)); + }); + }); + + afterAll(async () => { + await nestApp.close(); + }); +}); diff --git a/server/test/test.helper.ts b/server/test/test.helper.ts index 955766879e..fe4f606829 100644 --- a/server/test/test.helper.ts +++ b/server/test/test.helper.ts @@ -35,6 +35,7 @@ import * as request from 'supertest'; import { AppEnvironment } from 'src/entities/app_environments.entity'; import { defaultAppEnvironments } from 'src/helpers/utils.helper'; import { DataSourceOptions } from 'src/entities/data_source_options.entity'; +import * as cookieParser from 'cookie-parser'; export async function createNestAppInstance(): Promise { let app: INestApplication; @@ -46,6 +47,7 @@ export async function createNestAppInstance(): Promise { app = moduleRef.createNestApplication(); app.setGlobalPrefix('api'); + app.use(cookieParser()); app.useGlobalFilters(new AllExceptionsFilter(moduleRef.get(Logger))); app.useWebSocketAdapter(new WsAdapter(app)); app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true })); @@ -72,6 +74,7 @@ export async function createNestAppInstanceWithEnvMock(): Promise<{ app = moduleRef.createNestApplication(); app.setGlobalPrefix('api'); + app.use(cookieParser()); app.useGlobalFilters(new AllExceptionsFilter(moduleRef.get(Logger))); app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true })); app.useWebSocketAdapter(new WsAdapter(app)); @@ -629,44 +632,12 @@ export const setUpAccountFromToken = async (app: INestApplication, user: User, o const { status } = response; expect(status).toBe(201); - const { - email, - first_name, - last_name, - admin, - group_permissions, - app_group_permissions, - organization_id, - organization, - } = response.body; + const { email, first_name, last_name, current_organization_id } = response.body; expect(email).toEqual(user.email); expect(first_name).toEqual(user.firstName); expect(last_name).toEqual(user.lastName); - expect(admin).toBeTruthy(); - expect(organization_id).toBe(org.id); - expect(organization).toBe(org.name); - expect(group_permissions).toHaveLength(2); - expect(group_permissions.some((gp) => gp.group === 'all_users')).toBeTruthy(); - expect(group_permissions.some((gp) => gp.group === 'admin')).toBeTruthy(); - expect(Object.keys(group_permissions[0]).sort()).toEqual( - [ - 'id', - 'organization_id', - 'group', - 'app_create', - 'app_delete', - 'updated_at', - 'created_at', - 'folder_create', - 'org_environment_variable_create', - 'org_environment_variable_update', - 'org_environment_variable_delete', - 'folder_delete', - 'folder_update', - ].sort() - ); - expect(app_group_permissions).toHaveLength(0); + expect(current_organization_id).toBe(org.id); await user.reload(); expect(user.status).toBe('active'); expect(user.defaultOrganizationId).toBe(org.id); @@ -754,3 +725,22 @@ export const getAppWithAllDetails = async (id: string) => { return app; }; + +export const authenticateUser = async (app: INestApplication, email = 'admin@tooljet.io', password = 'password') => { + const sessionResponse = await request + .agent(app.getHttpServer()) + .post('/api/authenticate') + .send({ email, password }) + .expect(201); + + return { user: sessionResponse.body, tokenCookie: sessionResponse.headers['set-cookie'] }; +}; + +export const logoutUser = async (app: INestApplication, tokenCookie: any, organization_id: string) => { + return await request + .agent(app.getHttpServer()) + .get('/api/logout') + .set('tj-workspace-id', organization_id) + .set('Cookie', tokenCookie) + .expect(200); +}; From 542aa5b278ff8f55aebac72deb335136f0f76de2 Mon Sep 17 00:00:00 2001 From: vjaris42 Date: Thu, 6 Apr 2023 17:52:28 +0530 Subject: [PATCH 11/23] API Support for getting data source options under a datasource (#5948) * feature: multi env support for datasources * revert: datasources by env id api * revert: datasources by env id api:frontend * lint fixes --------- Co-authored-by: Midhun G S --- .../DataSourceManager/DataSourceManager.jsx | 40 ++++++++++++++----- .../GlobalDataSourcesPage/index.jsx | 17 +++++++- .../src/GlobalDatasources/LIstItem/index.jsx | 4 +- frontend/src/GlobalDatasources/index.jsx | 38 +++++++++++++----- .../src/_services/app_environment.service.js | 11 +++++ .../src/_services/globalDatasource.service.js | 11 ++--- frontend/src/_services/index.js | 1 + .../app_environments.controller.ts | 30 ++++++++++++++ .../global_data_sources.controller.ts | 4 +- .../app_environments.module.ts | 5 ++- .../global-datasource-ability.factory.ts | 4 +- 11 files changed, 135 insertions(+), 30 deletions(-) create mode 100644 frontend/src/_services/app_environment.service.js create mode 100644 server/src/controllers/app_environments.controller.ts diff --git a/frontend/src/Editor/DataSourceManager/DataSourceManager.jsx b/frontend/src/Editor/DataSourceManager/DataSourceManager.jsx index 54f933dcac..a65240f1ce 100644 --- a/frontend/src/Editor/DataSourceManager/DataSourceManager.jsx +++ b/frontend/src/Editor/DataSourceManager/DataSourceManager.jsx @@ -1,5 +1,6 @@ import React from 'react'; import { datasourceService, authenticationService, pluginsService, globalDatasourceService } from '@/_services'; +import cx from 'classnames'; import { Modal, Button, Tab, Row, Col, ListGroup } from 'react-bootstrap'; import { toast } from 'react-hot-toast'; import { getSvgIcon } from '@/_helpers/appUtils'; @@ -14,7 +15,7 @@ import { } from './SourceComponents'; import { CopyToClipboard } from 'react-copy-to-clipboard'; import config from 'config'; -import { isEmpty } from 'lodash'; +import { capitalize, isEmpty } from 'lodash'; import { Card } from '@/_ui/Card'; import { withTranslation, useTranslation } from 'react-i18next'; import { camelizeKeys, decamelizeKeys } from 'humps'; @@ -157,6 +158,7 @@ class DataSourceManagerComponent extends React.Component { const kind = selectedDataSource.kind; const pluginId = selectedDataSourcePluginId; const appVersionId = this.props.editingVersionId; + const currentEnvironment = this.props.currentEnvironment?.id; const scope = this.state?.scope || selectedDataSource?.scope; const parsedOptions = Object.keys(options).map((key) => { @@ -173,7 +175,7 @@ class DataSourceManagerComponent extends React.Component { if (selectedDataSource.id) { this.setState({ isSaving: true }); service - .save(selectedDataSource.id, name, parsedOptions, appId) + .save(selectedDataSource.id, name, parsedOptions, appId, currentEnvironment) .then(() => { this.setState({ isSaving: false }); this.hideModal(); @@ -181,7 +183,7 @@ class DataSourceManagerComponent extends React.Component { this.props.t('editor.queryManager.dataSourceManager.toast.success.dataSourceSaved', 'Datasource Saved'), { position: 'top-center' } ); - this.props.dataSourcesChanged(false, name); + this.props.dataSourcesChanged(false, selectedDataSource); this.props.globalDataSourcesChanged(); }) .catch(({ error }) => { @@ -193,14 +195,14 @@ class DataSourceManagerComponent extends React.Component { this.setState({ isSaving: true }); service .create(pluginId, name, kind, parsedOptions, appId, appVersionId, scope) - .then(() => { + .then((data) => { this.setState({ isSaving: false }); this.hideModal(); toast.success( this.props.t('editor.queryManager.dataSourceManager.toast.success.dataSourceAdded', 'Datasource Added'), { position: 'top-center' } ); - this.props.dataSourcesChanged(false, name); + this.props.dataSourcesChanged(false, data); this.props.globalDataSourcesChanged(); }) .catch(({ error }) => { @@ -599,6 +601,26 @@ class DataSourceManagerComponent extends React.Component { ); }; + renderEnvironmentsTab = (selectedDataSource) => { + return ( + selectedDataSource && + selectedDataSource?.id && + this.props.environment?.length > 1 && ( + + ) + ); + }; + render() { const { dataSourceMeta, @@ -624,10 +646,10 @@ class DataSourceManagerComponent extends React.Component { container={this.props.container} {...this.props.modalProps} > - + {selectedDataSource && this.props.showBackButton && (
    this.setState({ selectedDataSource: false }, () => this.onExit())} > @@ -640,7 +662,7 @@ class DataSourceManagerComponent extends React.Component { />
    )} - + {selectedDataSource && (
    {getSvgIcon(dataSourceMeta?.kind?.toLowerCase(), 35, 35, selectedDataSourceIcon)} @@ -673,8 +695,8 @@ class DataSourceManagerComponent extends React.Component { > + {this.renderEnvironmentsTab(selectedDataSource)} - {selectedDataSource &&
    {this.renderSourceComponent(selectedDataSource.kind, isPlugin)}
    } {!selectedDataSource && this.segregateDataSources(this.state.suggestingDatasources, this.props.darkMode)} diff --git a/frontend/src/GlobalDatasources/GlobalDataSourcesPage/index.jsx b/frontend/src/GlobalDatasources/GlobalDataSourcesPage/index.jsx index 995aa80e65..f867931e76 100644 --- a/frontend/src/GlobalDatasources/GlobalDataSourcesPage/index.jsx +++ b/frontend/src/GlobalDatasources/GlobalDataSourcesPage/index.jsx @@ -23,6 +23,9 @@ export const GlobalDataSourcesPage = ({ darkMode }) => { handleModalVisibility, isEditing, setEditing, + currentEnvironment, + environments, + setCurrentEnvironment, } = useContext(GlobalDataSourcesContext); useEffect(() => { @@ -50,6 +53,15 @@ export const GlobalDataSourcesPage = ({ darkMode }) => { } }; + const environmentChanged = (env, dataSourceId) => { + setCurrentEnvironment(env); + }; + + const dataSourcesChanged = (resetSelection, dataSource) => { + setCurrentEnvironment(environments[0]); + fetchDataSources(resetSelection, dataSource); + }; + return (
    @@ -66,9 +78,12 @@ export const GlobalDataSourcesPage = ({ darkMode }) => { darkMode={darkMode} hideModal={handleHideModal} scope="global" - dataSourcesChanged={fetchDataSources} + dataSourcesChanged={dataSourcesChanged} selectedDataSource={selectedDataSource} modalProps={modalProps} + currentEnvironment={currentEnvironment} + environments={environments} + environmentChanged={environmentChanged} container={selectedDataSource ? containerRef?.current : null} /> )} diff --git a/frontend/src/GlobalDatasources/LIstItem/index.jsx b/frontend/src/GlobalDatasources/LIstItem/index.jsx index 9671281874..3db7aee4b3 100644 --- a/frontend/src/GlobalDatasources/LIstItem/index.jsx +++ b/frontend/src/GlobalDatasources/LIstItem/index.jsx @@ -6,7 +6,8 @@ import { getSvgIcon } from '@/_helpers/appUtils'; import DeleteIcon from '../Icons/DeleteIcon.svg'; export const ListItem = ({ dataSource, key, active, onDelete }) => { - const { setSelectedDataSource, toggleDataSourceManagerModal } = useContext(GlobalDataSourcesContext); + const { setSelectedDataSource, toggleDataSourceManagerModal, environments, setCurrentEnvironment } = + useContext(GlobalDataSourcesContext); const getSourceMetaData = (dataSource) => { if (dataSource.pluginId) { @@ -35,6 +36,7 @@ export const ListItem = ({ dataSource, key, active, onDelete }) => { role="button" onClick={() => { setSelectedDataSource(dataSource); + setCurrentEnvironment(environments[0]); toggleDataSourceManagerModal(true); focusModal(); }} diff --git a/frontend/src/GlobalDatasources/index.jsx b/frontend/src/GlobalDatasources/index.jsx index 55d4919207..e4e0cbddab 100644 --- a/frontend/src/GlobalDatasources/index.jsx +++ b/frontend/src/GlobalDatasources/index.jsx @@ -1,7 +1,7 @@ import React, { createContext, useMemo, useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import Layout from '@/_ui/Layout'; -import { globalDatasourceService, authenticationService } from '@/_services'; +import { globalDatasourceService, appEnvironmentService, authenticationService } from '@/_services'; import { GlobalDataSourcesPage } from './GlobalDataSourcesPage'; export const GlobalDataSourcesContext = createContext({ @@ -12,39 +12,43 @@ export const GlobalDataSourcesContext = createContext({ }); export const GlobalDatasources = (props) => { - const { current_organization_id, admin } = authenticationService.currentSessionValue; - const [organizationId, setOrganizationId] = useState(current_organization_id); + const { admin } = authenticationService.currentSessionValue; const [selectedDataSource, setSelectedDataSource] = useState(null); const [dataSources, setDataSources] = useState([]); const [showDataSourceManagerModal, toggleDataSourceManagerModal] = useState(false); const [isEditing, setEditing] = useState(true); + const [environments, setEnvironments] = useState([]); + const [currentEnvironment, setCurrentEnvironment] = useState(null); const navigate = useNavigate(); useEffect(() => { if (!admin) { navigate('/'); } + fetchEnvironments(); }, [admin]); - const fetchDataSources = async (resetSelection = false, dsName = null) => { + const fetchDataSources = async (resetSelection = false, dataSource = null) => { globalDatasourceService - .getAll(organizationId) + .getAll() .then((data) => { const orderedDataSources = data.data_sources.sort((a, b) => a.name.localeCompare(b.name)); setDataSources([...(orderedDataSources ?? [])]); - const ds = dsName && orderedDataSources.find((ds) => ds.name === dsName); + const ds = dataSource && orderedDataSources.find((ds) => ds.id === dataSource.id); if (!resetSelection && ds) { + setEditing(true); setSelectedDataSource(ds); toggleDataSourceManagerModal(true); } - if (orderedDataSources.length && resetSelection) { setSelectedDataSource(orderedDataSources[0]); toggleDataSourceManagerModal(true); } }) - .catch(() => setDataSources([])); + .catch(() => { + setDataSources([]); + }); }; const handleToggleSourceManagerModal = () => { @@ -62,6 +66,17 @@ export const GlobalDatasources = (props) => { handleToggleSourceManagerModal(); }; + const fetchEnvironments = () => { + appEnvironmentService.getAllEnvironments().then((data) => { + const envArray = data?.environments; + setEnvironments(envArray); + if (envArray.length > 0) { + const env = envArray.find((env) => env.is_default === true); + setCurrentEnvironment(env); + } + }); + }; + const value = useMemo( () => ({ selectedDataSource, @@ -73,8 +88,13 @@ export const GlobalDatasources = (props) => { handleModalVisibility, isEditing, setEditing, + fetchEnvironments, + environments, + currentEnvironment, + setCurrentEnvironment, + setDataSources, }), - [selectedDataSource, dataSources, showDataSourceManagerModal, isEditing] + [selectedDataSource, dataSources, showDataSourceManagerModal, isEditing, environments, currentEnvironment] ); return ( diff --git a/frontend/src/_services/app_environment.service.js b/frontend/src/_services/app_environment.service.js new file mode 100644 index 0000000000..3a49a9f54f --- /dev/null +++ b/frontend/src/_services/app_environment.service.js @@ -0,0 +1,11 @@ +import config from 'config'; +import { authHeader, handleResponse } from '@/_helpers'; + +export const appEnvironmentService = { + getAllEnvironments, +}; + +function getAllEnvironments() { + const requestOptions = { method: 'GET', headers: authHeader() }; + return fetch(`${config.apiUrl}/app-environments`, requestOptions).then(handleResponse); +} diff --git a/frontend/src/_services/globalDatasource.service.js b/frontend/src/_services/globalDatasource.service.js index 85da897495..eb0f32bf02 100644 --- a/frontend/src/_services/globalDatasource.service.js +++ b/frontend/src/_services/globalDatasource.service.js @@ -9,10 +9,9 @@ export const globalDatasourceService = { convertToGlobal, }; -function getAll(organizationId) { +function getAll() { const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; - let searchParams = new URLSearchParams(`organization_id=${organizationId}`); - return fetch(`${config.apiUrl}/v2/data_sources?` + searchParams, requestOptions).then(handleResponse); + return fetch(`${config.apiUrl}/v2/data_sources`, requestOptions).then(handleResponse); } function create(plugin_id, name, kind, options, app_id, app_version_id, scope) { @@ -28,14 +27,16 @@ function create(plugin_id, name, kind, options, app_id, app_version_id, scope) { return fetch(`${config.apiUrl}/v2/data_sources`, requestOptions).then(handleResponse); } -function save(id, name, options) { +function save(id, name, options, appId, environment_id) { const body = { name, options, }; const requestOptions = { method: 'PUT', headers: authHeader(), body: JSON.stringify(body), credentials: 'include' }; - return fetch(`${config.apiUrl}/v2/data_sources/${id}`, requestOptions).then(handleResponse); + return fetch(`${config.apiUrl}/v2/data_sources/${id}?environment_id=${environment_id}`, requestOptions).then( + handleResponse + ); } function deleteDataSource(id) { diff --git a/frontend/src/_services/index.js b/frontend/src/_services/index.js index ea66ca6f8a..7f3daa3fac 100644 --- a/frontend/src/_services/index.js +++ b/frontend/src/_services/index.js @@ -18,3 +18,4 @@ export * from './plugins.service'; export * from './marketplace.service'; export * from './tooljetDatabase.service'; export * from './globalDatasource.service'; +export * from './app_environment.service'; diff --git a/server/src/controllers/app_environments.controller.ts b/server/src/controllers/app_environments.controller.ts new file mode 100644 index 0000000000..6735298ec3 --- /dev/null +++ b/server/src/controllers/app_environments.controller.ts @@ -0,0 +1,30 @@ +import { Controller, Get, UseGuards } from '@nestjs/common'; +import { decamelizeKeys } from 'humps'; +import { JwtAuthGuard } from '../modules/auth/jwt-auth.guard'; +import { ForbiddenException } from '@nestjs/common'; +import { User } from 'src/decorators/user.decorator'; +import { AppEnvironmentService } from '@services/app_environments.service'; +import { GlobalDataSourceAbilityFactory } from 'src/modules/casl/abilities/global-datasource-ability.factory'; +import { DataSource } from 'src/entities/data_source.entity'; + +@Controller('app-environments') +export class AppEnvironmentsController { + constructor( + private appEnvironmentServices: AppEnvironmentService, + private globalDataSourcesAbilityFactory: GlobalDataSourceAbilityFactory + ) {} + + @UseGuards(JwtAuthGuard) + @Get() + async index(@User() user) { + const ability = await this.globalDataSourcesAbilityFactory.globalDataSourceActions(user); + const { organizationId } = user; + + if (!ability.can('fetchEnvironments', DataSource)) { + throw new ForbiddenException('You do not have permissions to perform this action'); + } + + const environments = await this.appEnvironmentServices.getAll(organizationId); + return decamelizeKeys({ environments }); + } +} diff --git a/server/src/controllers/global_data_sources.controller.ts b/server/src/controllers/global_data_sources.controller.ts index 9370d33a80..d05bbf3df6 100644 --- a/server/src/controllers/global_data_sources.controller.ts +++ b/server/src/controllers/global_data_sources.controller.ts @@ -14,7 +14,6 @@ import { import { JwtAuthGuard } from '../../src/modules/auth/jwt-auth.guard'; import { decamelizeKeys } from 'humps'; import { GlobalDataSourceAbilityFactory } from 'src/modules/casl/abilities/global-datasource-ability.factory'; -import { DataQueriesService } from '@services/data_queries.service'; import { DataSourcesService } from '@services/data_sources.service'; import { CreateDataSourceDto, UpdateDataSourceDto } from '@dto/data-source.dto'; import { decode } from 'js-base64'; @@ -29,8 +28,7 @@ import { DataSourceScopes } from 'src/helpers/data_source.constants'; export class GlobalDataSourcesController { constructor( private globalDataSourceAbilityFactory: GlobalDataSourceAbilityFactory, - private dataSourcesService: DataSourcesService, - private dataQueriesService: DataQueriesService + private dataSourcesService: DataSourcesService ) {} @UseGuards(JwtAuthGuard) diff --git a/server/src/modules/app_environments/app_environments.module.ts b/server/src/modules/app_environments/app_environments.module.ts index 0f11c34d2c..e37e8dc3aa 100644 --- a/server/src/modules/app_environments/app_environments.module.ts +++ b/server/src/modules/app_environments/app_environments.module.ts @@ -1,11 +1,14 @@ +import { AppEnvironmentsController } from '@controllers/app_environments.controller'; import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AppEnvironmentService } from '@services/app_environments.service'; import { AppEnvironment } from 'src/entities/app_environments.entity'; import { DataSourceOptions } from 'src/entities/data_source_options.entity'; +import { CaslModule } from '../casl/casl.module'; @Module({ - imports: [TypeOrmModule.forFeature([AppEnvironment, DataSourceOptions])], + controllers: [AppEnvironmentsController], + imports: [TypeOrmModule.forFeature([AppEnvironment, DataSourceOptions]), CaslModule], providers: [AppEnvironmentService], }) export class AppEnvironmentsModule {} diff --git a/server/src/modules/casl/abilities/global-datasource-ability.factory.ts b/server/src/modules/casl/abilities/global-datasource-ability.factory.ts index 7ae4fe98c9..c2640ab3f8 100644 --- a/server/src/modules/casl/abilities/global-datasource-ability.factory.ts +++ b/server/src/modules/casl/abilities/global-datasource-ability.factory.ts @@ -8,7 +8,8 @@ type Actions = | 'createGlobalDataSource' | 'updateGlobalDataSource' | 'deleteGlobalDataSource' - | 'authorizeOauthForSource'; + | 'authorizeOauthForSource' + | 'fetchEnvironments'; type Subjects = InferSubjects | 'all'; @@ -25,6 +26,7 @@ export class GlobalDataSourceAbilityFactory { if (await this.usersService.userCan(user, 'create', 'GlobalDataSource')) { can('createGlobalDataSource', DataSource); + can('fetchEnvironments', DataSource); } if (await this.usersService.userCan(user, 'update', 'GlobalDataSource')) { From a2c2aaec54c821c8b55f0f20f8922674c05a5e5a Mon Sep 17 00:00:00 2001 From: gsmithun4 Date: Thu, 6 Apr 2023 17:57:33 +0530 Subject: [PATCH 12/23] bump version v2.4.0 --- .version | 2 +- server/.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.version b/.version index 276cbf9e28..197c4d5c2d 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.3.0 +2.4.0 diff --git a/server/.version b/server/.version index 276cbf9e28..197c4d5c2d 100644 --- a/server/.version +++ b/server/.version @@ -1 +1 @@ -2.3.0 +2.4.0 From 774fb9e43757f76e483f0825d73bce28199bff1a Mon Sep 17 00:00:00 2001 From: gsmithun4 Date: Thu, 6 Apr 2023 18:15:51 +0530 Subject: [PATCH 13/23] Fix for app-environments API service --- frontend/src/_services/app_environment.service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/_services/app_environment.service.js b/frontend/src/_services/app_environment.service.js index 3a49a9f54f..ca1517ba3d 100644 --- a/frontend/src/_services/app_environment.service.js +++ b/frontend/src/_services/app_environment.service.js @@ -6,6 +6,6 @@ export const appEnvironmentService = { }; function getAllEnvironments() { - const requestOptions = { method: 'GET', headers: authHeader() }; + const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; return fetch(`${config.apiUrl}/app-environments`, requestOptions).then(handleResponse); } From e8675f0a4c97feff54e0faa97ec695b047152127 Mon Sep 17 00:00:00 2001 From: Shubhendra Singh Chauhan Date: Thu, 6 Apr 2023 19:09:47 +0530 Subject: [PATCH 14/23] [docs] Added docs version 2.4.0 (#5956) * minor url fix * added docs version 2.4.0 * default version set to 2.4 --- docs/docs/tutorial/workspace_overview.md | 2 +- docs/docusaurus.config.js | 2 +- .../version-2.4.0/Enterprise/_category_.json | 5 + .../version-2.4.0/Enterprise/audit_logs.md | 84 + .../version-2.4.0/Enterprise/superadmin.md | 130 + .../version-2.4.0/Enterprise/white-label.md | 39 + .../version-2.4.0/actions/_category_.json | 5 + .../version-2.4.0/actions/close-modal.md | 19 + .../actions/control-component.md | 98 + .../actions/copy-to-clipboard.md | 18 + .../version-2.4.0/actions/generate-file.md | 42 + .../version-2.4.0/actions/go-to-app.md | 20 + .../version-2.4.0/actions/logout.md | 18 + .../version-2.4.0/actions/open-webpage.md | 18 + .../version-2.4.0/actions/run-query.md | 18 + .../version-2.4.0/actions/set-localstorage.md | 59 + .../version-2.4.0/actions/set-page-var.md | 20 + .../version-2.4.0/actions/set-table-page.md | 24 + .../version-2.4.0/actions/set-variable.md | 24 + .../version-2.4.0/actions/show-alert.md | 23 + .../version-2.4.0/actions/show-modal.md | 18 + .../version-2.4.0/actions/switch-page.md | 18 + .../version-2.4.0/actions/unset-page-var.md | 18 + .../version-2.4.0/actions/unset-variable.md | 23 + .../version-2.4.0/app-builder/canvas.md | 55 + .../version-2.4.0/app-builder/left-sidebar.md | 68 + .../version-2.4.0/app-builder/overview.md | 20 + .../version-2.4.0/app-builder/query-panel.md | 177 + .../app-builder/right-sidebar.md | 29 + .../version-2.4.0/app-builder/toolbar.md | 133 + .../contributing-guide/_category_.json | 5 + .../contributing-guide/code-of-conduct.md | 81 + .../version-2.4.0/contributing-guide/l10n.md | 69 + .../contributing-guide/setup/_category_.json | 5 + .../contributing-guide/setup/architecture.md | 25 + .../contributing-guide/setup/docker.md | 182 + .../contributing-guide/setup/macos.md | 134 + .../contributing-guide/setup/ubuntu.md | 126 + .../contributing-guide/slackcoc.md | 90 + .../contributing-guide/testing.md | 57 + .../troubleshooting/eslint.md | 43 + .../tutorials/_category_.json | 5 + .../tutorials/create-widget.md | 27 + .../tutorials/creating-a-plugin.md | 226 + .../data-sources/_category_.json | 5 + .../version-2.4.0/data-sources/airtable.md | 229 + .../version-2.4.0/data-sources/amazonses.md | 61 + .../version-2.4.0/data-sources/appwrite.md | 160 + .../version-2.4.0/data-sources/athena.md | 67 + .../version-2.4.0/data-sources/baserow.md | 269 + .../version-2.4.0/data-sources/bigquery.md | 160 + .../version-2.4.0/data-sources/clickhouse.md | 211 + .../version-2.4.0/data-sources/cosmosdb.md | 91 + .../version-2.4.0/data-sources/couchdb.md | 311 + .../version-2.4.0/data-sources/custom-js.md | 56 + .../version-2.4.0/data-sources/dynamodb.md | 38 + .../data-sources/elasticsearch.md | 80 + .../version-2.4.0/data-sources/firestore.md | 163 + .../version-2.4.0/data-sources/gcs.md | 41 + .../data-sources/google.sheets.md | 112 + .../version-2.4.0/data-sources/graphql.md | 55 + .../version-2.4.0/data-sources/influxdb.md | 129 + .../version-2.4.0/data-sources/mailgun.md | 64 + .../version-2.4.0/data-sources/mariadb.md | 49 + .../version-2.4.0/data-sources/minio.md | 51 + .../version-2.4.0/data-sources/mongodb.md | 109 + .../version-2.4.0/data-sources/mssql.md | 42 + .../version-2.4.0/data-sources/mysql.md | 65 + .../version-2.4.0/data-sources/n8n.md | 51 + .../version-2.4.0/data-sources/notion.md | 234 + .../version-2.4.0/data-sources/openapi.md | 25 + .../version-2.4.0/data-sources/oracledb.md | 53 + .../version-2.4.0/data-sources/overview.md | 42 + .../version-2.4.0/data-sources/postgresql.md | 57 + .../version-2.4.0/data-sources/redis.md | 44 + .../version-2.4.0/data-sources/restapi.md | 46 + .../version-2.4.0/data-sources/rethinkdb.md | 52 + .../version-2.4.0/data-sources/run-py.md | 55 + .../version-2.4.0/data-sources/s3.md | 137 + .../version-2.4.0/data-sources/saphana.md | 48 + .../version-2.4.0/data-sources/sendgrid.md | 62 + .../version-2.4.0/data-sources/slack.md | 81 + .../version-2.4.0/data-sources/smtp.md | 48 + .../version-2.4.0/data-sources/snowflake.md | 52 + .../version-2.4.0/data-sources/stripe.md | 192 + .../version-2.4.0/data-sources/twilio.md | 54 + .../version-2.4.0/data-sources/typesense.md | 92 + .../version-2.4.0/data-sources/woocommerce.md | 64 + .../version-2.4.0/data-sources/zendesk.md | 96 + .../version-2.4.0/getting-started.md | 249 + .../version-2.4.0/how-to/_category_.json | 5 + .../how-to/access-cellvalue-rowdata.md | 115 + .../how-to/access-users-groups.md | 54 + .../how-to/access-users-location.md | 85 + .../how-to/build-plugin-for-marketplace.md | 381 + .../bulk-update-multiple-rows-in-table.md | 115 + .../how-to/import-external-lib-js.md | 96 + .../how-to/import-external-lib-py.md | 98 + .../how-to/loading-image-pdf-from-db.md | 45 + .../how-to/oauth2-authorization.md | 66 + .../how-to/run-action-from-runjs.md | 206 + .../run-query-at-specified-intervals.md | 51 + .../how-to/s3-custom-endpoint.md | 18 + .../version-2.4.0/how-to/upload-files-aws.md | 137 + .../version-2.4.0/how-to/upload-files-gcs.md | 73 + .../version-2.4.0/how-to/use-axios.md | 62 + .../how-to/use-form-component.md | 90 + .../version-2.4.0/how-to/use-inspector.md | 112 + .../version-2.4.0/marketplace.md | 120 + .../org-management/permissions.md | 21 + .../release-management/multi-env.md | 32 + docs/versioned_docs/version-2.4.0/security.md | 23 + .../version-2.4.0/setup/_category_.json | 5 + .../version-2.4.0/setup/client.md | 96 + .../version-2.4.0/setup/digitalocean.md | 64 + .../version-2.4.0/setup/docker-local.md | 29 + .../version-2.4.0/setup/docker.md | 149 + .../versioned_docs/version-2.4.0/setup/ec2.md | 78 + .../versioned_docs/version-2.4.0/setup/ecs.md | 77 + .../version-2.4.0/setup/env-vars.md | 297 + .../version-2.4.0/setup/google-cloud-run.md | 151 + .../version-2.4.0/setup/heroku.md | 142 + .../version-2.4.0/setup/http-proxy.md | 12 + .../version-2.4.0/setup/index.md | 12 + .../version-2.4.0/setup/kubernetes-aks.md | 53 + .../version-2.4.0/setup/kubernetes-gke.md | 79 + .../version-2.4.0/setup/kubernetes.md | 61 + .../version-2.4.0/setup/openshift.md | 68 + .../version-2.4.0/setup/tooljet-subpath.md | 21 + .../version-2.4.0/setup/try-tooljet.md | 38 + .../version-2.4.0/setup/v2-migration.md | 33 + .../version-2.4.0/tooljet_database.md | 302 + docs/versioned_docs/version-2.4.0/tracking.md | 23 + .../version-2.4.0/tutorial/_category_.json | 5 + .../version-2.4.0/tutorial/actions.md | 31 + .../tutorial/adding-a-datasource.md | 36 + .../version-2.4.0/tutorial/adding-widget.md | 66 + .../tutorial/app-menu-options.md | 69 + .../tutorial/building-queries.md | 53 + .../version-2.4.0/tutorial/creating-app.md | 31 + .../version-2.4.0/tutorial/debugger.md | 19 + .../tutorial/keyboard-shortcuts.md | 122 + .../tutorial/manage-users-groups.md | 184 + .../version-2.4.0/tutorial/mobile-layout.md | 26 + .../version-2.4.0/tutorial/pages.md | 205 + .../tutorial/sharing-and-deploying.md | 55 + .../version-2.4.0/tutorial/transformations.md | 93 + .../tutorial/versioning-and-release.md | 67 + .../tutorial/workspace-variables.md | 65 + .../tutorial/workspace_overview.md | 42 + .../user-authentication/general-settings.md | 38 + .../user-authentication/password-login.md | 32 + .../user-authentication/sso/_category_.json | 5 + .../user-authentication/sso/github.md | 67 + .../user-authentication/sso/google.md | 85 + .../user-authentication/sso/openid/azuread.md | 67 + .../sso/openid/google-openid.md | 82 + .../user-authentication/sso/openid/okta.md | 53 + .../user-authentication/sso/openid/setup.md | 33 + .../user-authentication/user-lifecycle.md | 100 + .../version-2.4.0/widgets/_category_.json | 5 + .../version-2.4.0/widgets/bounded-box.md | 100 + .../version-2.4.0/widgets/button-group.md | 95 + .../version-2.4.0/widgets/button.md | 96 + .../version-2.4.0/widgets/calendar.md | 199 + .../version-2.4.0/widgets/chart.md | 389 + .../version-2.4.0/widgets/checkbox.md | 108 + .../widgets/circular-progressbar.md | 78 + .../version-2.4.0/widgets/code-editor.md | 209 + .../version-2.4.0/widgets/color-picker.md | 84 + .../version-2.4.0/widgets/container.md | 60 + .../version-2.4.0/widgets/custom-component.md | 105 + .../widgets/date-range-picker.md | 81 + .../version-2.4.0/widgets/datepicker.md | 108 + .../version-2.4.0/widgets/divider.md | 56 + .../version-2.4.0/widgets/dropdown.md | 140 + .../version-2.4.0/widgets/file-picker.md | 172 + .../version-2.4.0/widgets/form.md | 76 + .../version-2.4.0/widgets/html.md | 72 + .../version-2.4.0/widgets/icon.md | 64 + .../version-2.4.0/widgets/iframe.md | 67 + .../version-2.4.0/widgets/image.md | 107 + .../version-2.4.0/widgets/kanban-board.md | 137 + .../version-2.4.0/widgets/link.md | 68 + .../version-2.4.0/widgets/listview.md | 140 + .../version-2.4.0/widgets/map.md | 87 + .../version-2.4.0/widgets/modal.md | 101 + .../version-2.4.0/widgets/multiselect.md | 89 + .../version-2.4.0/widgets/number-input.md | 97 + .../version-2.4.0/widgets/overview.md | 85 + .../version-2.4.0/widgets/package-lock.json | 32216 ++++++++++++++++ .../version-2.4.0/widgets/pagination.md | 69 + .../version-2.4.0/widgets/password-input.md | 82 + .../version-2.4.0/widgets/pdf.md | 56 + .../version-2.4.0/widgets/qr-scanner.md | 71 + .../version-2.4.0/widgets/radio-button.md | 101 + .../version-2.4.0/widgets/range-slider.md | 76 + .../version-2.4.0/widgets/rich-text-editor.md | 56 + .../version-2.4.0/widgets/spinner.md | 49 + .../version-2.4.0/widgets/star-rating.md | 85 + .../version-2.4.0/widgets/statistics.md | 93 + .../version-2.4.0/widgets/steps.md | 92 + .../version-2.4.0/widgets/svg-image.md | 59 + .../version-2.4.0/widgets/table.md | 329 + .../version-2.4.0/widgets/tabs.md | 116 + .../version-2.4.0/widgets/tags.md | 60 + .../version-2.4.0/widgets/text-input.md | 111 + .../version-2.4.0/widgets/text.md | 77 + .../version-2.4.0/widgets/textarea.md | 70 + .../version-2.4.0/widgets/timeline.md | 63 + .../version-2.4.0/widgets/timer.md | 80 + .../version-2.4.0/widgets/toggle-switch.md | 76 + .../version-2.4.0/widgets/tree-select.md | 157 + .../version-2.4.0/widgets/vertical-divider.md | 57 + .../version-2.4.0-sidebars.json | 370 + docs/versions.json | 1 + 216 files changed, 50225 insertions(+), 2 deletions(-) create mode 100644 docs/versioned_docs/version-2.4.0/Enterprise/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/Enterprise/audit_logs.md create mode 100644 docs/versioned_docs/version-2.4.0/Enterprise/superadmin.md create mode 100644 docs/versioned_docs/version-2.4.0/Enterprise/white-label.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/actions/close-modal.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/control-component.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/copy-to-clipboard.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/generate-file.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/go-to-app.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/logout.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/open-webpage.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/run-query.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/set-localstorage.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/set-page-var.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/set-table-page.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/set-variable.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/show-alert.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/show-modal.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/switch-page.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/unset-page-var.md create mode 100644 docs/versioned_docs/version-2.4.0/actions/unset-variable.md create mode 100644 docs/versioned_docs/version-2.4.0/app-builder/canvas.md create mode 100644 docs/versioned_docs/version-2.4.0/app-builder/left-sidebar.md create mode 100644 docs/versioned_docs/version-2.4.0/app-builder/overview.md create mode 100644 docs/versioned_docs/version-2.4.0/app-builder/query-panel.md create mode 100644 docs/versioned_docs/version-2.4.0/app-builder/right-sidebar.md create mode 100644 docs/versioned_docs/version-2.4.0/app-builder/toolbar.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/code-of-conduct.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/l10n.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/setup/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/setup/architecture.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/setup/docker.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/setup/macos.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/setup/ubuntu.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/slackcoc.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/testing.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/troubleshooting/eslint.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/create-widget.md create mode 100644 docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/creating-a-plugin.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/airtable.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/amazonses.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/appwrite.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/athena.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/baserow.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/bigquery.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/clickhouse.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/cosmosdb.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/couchdb.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/custom-js.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/dynamodb.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/elasticsearch.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/firestore.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/gcs.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/google.sheets.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/graphql.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/influxdb.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/mailgun.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/mariadb.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/minio.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/mongodb.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/mssql.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/mysql.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/n8n.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/notion.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/openapi.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/oracledb.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/overview.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/postgresql.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/redis.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/restapi.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/rethinkdb.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/run-py.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/s3.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/saphana.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/sendgrid.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/slack.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/smtp.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/snowflake.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/stripe.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/twilio.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/typesense.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/woocommerce.md create mode 100644 docs/versioned_docs/version-2.4.0/data-sources/zendesk.md create mode 100644 docs/versioned_docs/version-2.4.0/getting-started.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/how-to/access-cellvalue-rowdata.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/access-users-groups.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/access-users-location.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/build-plugin-for-marketplace.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/bulk-update-multiple-rows-in-table.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/import-external-lib-js.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/import-external-lib-py.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/loading-image-pdf-from-db.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/oauth2-authorization.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/run-action-from-runjs.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/run-query-at-specified-intervals.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/s3-custom-endpoint.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/upload-files-aws.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/upload-files-gcs.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/use-axios.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/use-form-component.md create mode 100644 docs/versioned_docs/version-2.4.0/how-to/use-inspector.md create mode 100644 docs/versioned_docs/version-2.4.0/marketplace.md create mode 100644 docs/versioned_docs/version-2.4.0/org-management/permissions.md create mode 100644 docs/versioned_docs/version-2.4.0/release-management/multi-env.md create mode 100644 docs/versioned_docs/version-2.4.0/security.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/setup/client.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/digitalocean.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/docker-local.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/docker.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/ec2.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/ecs.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/env-vars.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/google-cloud-run.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/heroku.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/http-proxy.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/index.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/kubernetes-aks.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/kubernetes-gke.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/kubernetes.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/openshift.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/tooljet-subpath.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/try-tooljet.md create mode 100644 docs/versioned_docs/version-2.4.0/setup/v2-migration.md create mode 100644 docs/versioned_docs/version-2.4.0/tooljet_database.md create mode 100644 docs/versioned_docs/version-2.4.0/tracking.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/actions.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/adding-a-datasource.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/adding-widget.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/app-menu-options.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/building-queries.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/creating-app.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/debugger.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/keyboard-shortcuts.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/manage-users-groups.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/mobile-layout.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/pages.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/sharing-and-deploying.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/transformations.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/versioning-and-release.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/workspace-variables.md create mode 100644 docs/versioned_docs/version-2.4.0/tutorial/workspace_overview.md create mode 100644 docs/versioned_docs/version-2.4.0/user-authentication/general-settings.md create mode 100644 docs/versioned_docs/version-2.4.0/user-authentication/password-login.md create mode 100644 docs/versioned_docs/version-2.4.0/user-authentication/sso/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/user-authentication/sso/github.md create mode 100644 docs/versioned_docs/version-2.4.0/user-authentication/sso/google.md create mode 100644 docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/azuread.md create mode 100644 docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/google-openid.md create mode 100644 docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/okta.md create mode 100644 docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/setup.md create mode 100644 docs/versioned_docs/version-2.4.0/user-authentication/user-lifecycle.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/_category_.json create mode 100644 docs/versioned_docs/version-2.4.0/widgets/bounded-box.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/button-group.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/button.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/calendar.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/chart.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/checkbox.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/circular-progressbar.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/code-editor.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/color-picker.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/container.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/custom-component.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/date-range-picker.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/datepicker.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/divider.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/dropdown.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/file-picker.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/form.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/html.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/icon.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/iframe.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/image.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/kanban-board.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/link.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/listview.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/map.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/modal.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/multiselect.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/number-input.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/overview.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/package-lock.json create mode 100644 docs/versioned_docs/version-2.4.0/widgets/pagination.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/password-input.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/pdf.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/qr-scanner.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/radio-button.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/range-slider.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/rich-text-editor.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/spinner.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/star-rating.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/statistics.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/steps.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/svg-image.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/table.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/tabs.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/tags.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/text-input.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/text.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/textarea.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/timeline.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/timer.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/toggle-switch.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/tree-select.md create mode 100644 docs/versioned_docs/version-2.4.0/widgets/vertical-divider.md create mode 100644 docs/versioned_sidebars/version-2.4.0-sidebars.json diff --git a/docs/docs/tutorial/workspace_overview.md b/docs/docs/tutorial/workspace_overview.md index d731054ea1..cba6a9aa33 100644 --- a/docs/docs/tutorial/workspace_overview.md +++ b/docs/docs/tutorial/workspace_overview.md @@ -37,6 +37,6 @@ Please check the detailed doc on **[Permissions](/docs/org-management/permission - User can directly login to a workspace using workspace login URL, Administrator can view the URL **Manage SSO -> General Settings -> Login URL**. ### When disabled (Super Admin) -- Only **[Super Admins](/docs/Enterprise/superadmin#allow-users-to-create-personal-workspace)** can disable the option for creating personal workspaces for a user. +- Only **[Super Admins](/docs//Enterprise/superadmin#restrict-creation-of-personal-workspace-of-users)** can disable the option for creating personal workspaces for a user. - If creating personal workspaces is disabled, Create workspace feature won’t be available. - No separate login page for workspace and SSO configured for the workspace will be reflected to the main login page/login. \ No newline at end of file diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 9b5861745d..86608dc31b 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -127,7 +127,7 @@ module.exports = { // Please change this to your repo. editUrl: 'https://github.com/ToolJet/Tooljet/blob/develop/docs/', includeCurrentVersion: false, - lastVersion: '2.3.0', + lastVersion: '2.4.0', }, theme: { customCss: require.resolve('./src/css/custom.css'), diff --git a/docs/versioned_docs/version-2.4.0/Enterprise/_category_.json b/docs/versioned_docs/version-2.4.0/Enterprise/_category_.json new file mode 100644 index 0000000000..b9b132f890 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/Enterprise/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Enterprise", + "position": 9, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/Enterprise/audit_logs.md b/docs/versioned_docs/version-2.4.0/Enterprise/audit_logs.md new file mode 100644 index 0000000000..a18980d1b1 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/Enterprise/audit_logs.md @@ -0,0 +1,84 @@ +--- +id: audit_logs +title: Audit logs +--- + +
    Available on: Enterprise Edition
    + + +The audit log is the report of all the activities done in your ToolJet account. It will capture and display events automatically by recording who performed an activity, what when, and where the activity was performed, along with other information such as IP address. + +
    + +Audit logs + +
    + +### Filter audit logs + +Audited events can be filtered using the below characteristics: + +#### Select Users + +Select a specific user from this dropdown to check all their activities. + +#### Select Apps + +The dropdown will list all the apps present in your account. Choose an app to filter the logs associated with that app. + +#### Select Resources + +| Resources | description | +| ----------- | ----------- | +| User | Filter all the User events like `USER_LOGIN`, `USER_SIGNUP`, `USER_INVITE`, AND `USER_INVITE_REDEEM`. | +| App | Filter all the App events like `APP_CREATE`, `APP_UPDATE`,`APP_VIEW`,`APP_DELETE`,`APP_IMPORT`,`APP_EXPORT`,`APP_CLONE`. | +| Data Query | Filters the events associated with Data Query like `DATA_QUERY_RUN`. | +| Group Permission | All the events associated with Group Permissions will be filtered. Group Permissions include `GROUP_CREATE`, `GROUP_UPDATE`, `GROUP_DELETE`. | +| App Group Permission | Within each group, you can set apps for read or edit privileges. These events get recorded as App Group Permissions. | + +#### Select Actions + +| Actions | description | +| ----------- | ----------- | +| USER_LOGIN | This event is recorded everytime a user logins. | +| USER_SIGNUP | This event is recorded everytime a new signup is made. | +| USER_INVITE | You can invite users to your account from `Manage Users` section and an event is audited everytime an invite is sent. | +| USER_INVITE_REDEEM | This event is recorded whenever an invite is redeemed. | +| APP_CREATE | This event is recorded when a user creates a new app. | +| APP_UPDATE | This event is recorded whenever actions like renaming the app, making the app public, editing shareable link, or deploying the app are made. | +| APP_VIEW | This event is logged when someone views the launched app. (public apps aren't accounted for) | +| APP_DELETE | This event is recorded whenever a user deletes an app from the dashboard. | +| APP_IMPORT | This event is recorded whenever a user imports an app. | +| APP_EXPORT | This event is recorded whenever an app is exported. | +| APP_CLONE | This event is recorded whenever a clone of the existing app is created. | +| DATA_QUERY_RUN | This event is logged whenever a data source is added, a query is created, or whenever a query is run either from the query editor or from the launched app. | +| GROUP_PERMISSION_CREATE | This event is recorded whenever a group is created. | +| GROUP_PERMISSION_UPDATE | This event is recorded whenever an app or user is added to or removed from a group, or the permissions for a group are updated. | +| GROUP_PERMISSION_DELETE | This event is recorded whenever a user group is deleted from an account. | +| APP_GROUP_PERMISSION_UPDATE | For every app added in to user group, you can set privileges like `View` or `Edit` and whenever these privileges are updated this event is recorded. By default, the permission of an app for a user group is set to `View`. | + +:::info +It is mandatory to set a Data Range in `From` and `To` to filter audit logs. +::: + +### Understanding information from logs + +
    + +Audit logs + +
    + + +| Property | description | +| ----------- | ----------- | +| action_type | It is the type of action that was logged in this event. Refer [this](#select-actions) to know about actions. | +| created_at | Displays the date and time of a logged event. | +| id | Every event logged has a specific event id associated with it. | +| ip_address | Displays the IP address from where the event was logged. | +| metadata | Metadata includes two sub-properties - `tooljet_version` and `user_agent`. `tooljet_version` displays the version of ToolJet used for the logged event and `user_agent` contains information about the device and browser used for that event. | +| organization_id | Every organization in ToolJet has an id associated with it and is recorded when an event occurs. | +| resource_id | There are several [resources](#select-resources) and for each resource that is created, an id gets associated with it.| +| resource_name | Displays the name of the [resources](#select-resources) that were logged in the event. For example, if an app was created or deleted then it will display the name of the app. | +| resource_type | Displays the type of the [resources](#select-resources) that were logged in the event. | +| user_id | Every user account in ToolJet has an id associated with it and is recorded when an event occurs. | diff --git a/docs/versioned_docs/version-2.4.0/Enterprise/superadmin.md b/docs/versioned_docs/version-2.4.0/Enterprise/superadmin.md new file mode 100644 index 0000000000..63262b98e9 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/Enterprise/superadmin.md @@ -0,0 +1,130 @@ +--- +id: superadmin +title: Super Admin +--- + +
    Available on: Enterprise Edition
    + +A Super Admin is the user who has full access to all the Workspaces, Users, and Groups of an instance. An instance can have more than one Super Admin. A Super Admin has full control over other users' workspaces and can create users, groups, and other super admins. + +The user details entered while setting up ToolJet will have Super Admin privileges. + +## How is Super Admin different from Admin + +| Privilege | Admin | Super Admin | +| --------- | ----- | ----------- | +| Manage Users in their workspace (Invite/Archive/Unarchive) | ✅ | ✅ | +| Manage Groups in their workspace (Create Group/Add or Delete Users from groups/ Modify Group Permissions) | ✅ | ✅ | +| Manage SSO in their workspace | ✅ | ✅ | +| Manage Workspace Variables in their workspace | ✅ | ✅ | +| [Access any user's personal workspace (create, edit or delete apps)](#access-any-workspace) | ❌ | ✅ | +| [Archive Admin or any user of any workspace](#archiveunarchive-users) | ❌ | ✅ | +| [Access any user's ToolJet database (create, edit or delete database)](#access-tooljet-db-in-any-workspace) | ❌ | ✅ | +| [Manage any workspace's setting (Groups/SSO/Workspace Variables)](#manage-workspace-setting-groupsssoworkspace-variables) | ❌ | ✅ | +| [Manage all users from all the workspaces in the instance](#checking-all-the-users-in-the-instance) | ❌ | ✅ | +| [Make any user Super Admin](#make-the-user-super-admin) | ❌ | ✅ | +| [Restrict creation of personal workspace of users](#restrict-creation-of-personal-workspace-of-users) | ❌ | ✅ | + +
    + +Super Admin: Enterprise + +
    + +## Super Admin features + +### Access any workspace + +If a user is a Super Admin then they can switch to any workspace created by any user in the instance from the dropdown on the top-left of dashboard that is used to switch between workspaces. + +The dropdown will list all the workspaces including workspaces created by the Super Admin or Any User. + +
    + +Super Admin: Enterprise + +
    + +### Create Edit or Delete apps from any user's personal workspace + +Once the Super Admin accesses the workspace of any other user, they can create, edit or delete app on the workspace. + +This also includes - modifying folders and importing, exporting, or cloning apps to any user's workspace. + +### Archive/Unarchive Users + +Super Admin can not only archive/unarchive users/admins on their workspace but also from the workspaces of any other user. + +If a user is Super Admin, they just need to open the workspace in which they want to archive or unarchive a user. Then go to the **Workspace Settings** from the sidebar -> **Manage Users** -> **Archive/Unarchive** any user/admin + +
    + +Super Admin: Enterprise + +
    + +### Access ToolJet DB in any workspace + +Super Admins have access to the database of any user's workspace - just like Super Admins can access any application in any workspace. They have full access to modify or create any table in the ToolJet DB of any workspace. + +### Manage Workspace Settings (Groups/SSO/Workspace Variables) + +Super Admins have all the privileges that an Admin of a workspace have, Super Admins can: +- **✅ Manage Groups**: Creating/Deleting/Updating a Group in any workspace +- **✅ Manage SSO**: Full control over General Settings, Password login and other SSO options +- **✅ Workspace Variables**: Adding, updating or deleting workspace variables + +## Instance Settings + +Only Super Admins can access the Instance Settings: + +- **Manage All Users** +- **Manage Instance Settings** + +### Checking all the users in the instance + +**Manage All Users** can be used to check all the users that are there - altogether from all the workspaces in an instance. + +
    + +Super Admin: Enterprise + +
    + +### Archiving a user from workspace + +Super Admins have the privilege to remove any user from any of the workspace they belong. + +Super Admins can go to **Manage All Users** page, Under the **Workspaces** column they'll see the number of workspaces a user belongs to. Click on the **`View(n)`**, a modal will pop up that will have the list of **`n`** number the workspaces, click on the **Archive/Unarchive** button next to the workspace name to remove the user from the workspace. + +
    + +Super Admin: Enterprise + +
    + +### Make the user super admin + +Super Admins can make any user as Super Admin or remove any Super Admin from the **Manage All Users** in the Instance Settings page. + +Click on the **Edit** button next to any user, **Enable** the **Make the user Super Admin** option, and then **Save** it. + +The user will become Super Admin and the Type column will update from **`workspace`** to **`instance`**. + +
    + +Super Admin: Enterprise + +
    + +### Restrict creation of personal workspace of users + +When a user joins a workspace, they are provided with their own personal workspace and option to create new workspaces. + +Super Admins can **control** this behavior from the Manage Instance Settings page, they can **toggle off** the option to **Allow personal workspace**. Now whenever a user joins a workspace they won't be provided a personal workspace nor they will be able to create a new workspace in the instance. + +
    + +Super Admin: Enterprise + +
    diff --git a/docs/versioned_docs/version-2.4.0/Enterprise/white-label.md b/docs/versioned_docs/version-2.4.0/Enterprise/white-label.md new file mode 100644 index 0000000000..6848686df6 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/Enterprise/white-label.md @@ -0,0 +1,39 @@ +--- +id: white-label +title: White Label +--- + +
    Available on: Enterprise Edition
    + +White Label feature will allow you to remove the ToolJet branding from the ToolJet platform and add your own custom logo and text. + +This feature allows you to rebrand the following: +- **App logo** (Logo on login screen, dashboard, and app-editor) +
    + + ToolJet - Enterprise - White label + +
    + +
    + + ToolJet - Enterprise - White label + +
    + +- **Favicon** + +- **Page Title** (next to Favicon) +
    + + ToolJet - Enterprise - White label + +
    + +## Configuration + +To enable white labelling, you'll need to set the below mentioned **environment variables** in the .env file: + +- `WHITE_LABEL_LOGO`: URL of the logo. Preferred dimensions of the logo are: width 130px and height 26px +- `WHITE_LABEL_TEXT`: The text that you want to display as Page Title +- `WHITE_LABEL_FAVICON`: URL of the favicon. Preferred dimensions of the logo are: 16x16px or 32x32px \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/actions/_category_.json b/docs/versioned_docs/version-2.4.0/actions/_category_.json new file mode 100644 index 0000000000..f5b2dfe045 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Actions Reference", + "position": 7, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/actions/close-modal.md b/docs/versioned_docs/version-2.4.0/actions/close-modal.md new file mode 100644 index 0000000000..bb772142f9 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/close-modal.md @@ -0,0 +1,19 @@ +--- +id: close-modal +title: Close modal +--- + +Use this action to close the modal that is already shown. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Close modal + +
    + diff --git a/docs/versioned_docs/version-2.4.0/actions/control-component.md b/docs/versioned_docs/version-2.4.0/actions/control-component.md new file mode 100644 index 0000000000..3a959c2921 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/control-component.md @@ -0,0 +1,98 @@ +--- +id: control-component +title: Control component (Component Specific Actions) +--- + +Control component action invokes the component specific actions. Component specific actions are the actions that are exclusive actions for a particular widget. Component specific actions can be triggered either through the event handlers or from the Run JavaScript code query. + +:::info +Check out the **[live demo](https://youtu.be/JIhSH3YeM3E)** of Component specific actions demonstrated in one of our community call. +::: + +## Available Component Specific Actions + +| Widget | Component Specific Actions | +|--------|---------------------------| +| Button | Click, Set label, Disable, Visibility, Loading | +| Checkbox | Set checked | +| Color picker | Set color | +| Dropdown | Select option | +| File picker | Clear files | +| Kanban | Add card, Delete card, Move card, Update card data | +| Map | Set location | +| Modal | Show, Close | +| Multiselect | Select option, Deselect option, Clear selection | +| Radio button | Select option | +| Tabs | Set tab | +| Table | Set page, Select row, Deselect Row, Discard changes | +| Text | Set text, Set Visibility | +| Text Area | Set text, Clear | +| Text Input | Set text, Clear, Set Focus, Set Blur, Disable, Visibility | + +:::info +Currently, Component specific actions are supported only by the above listed widgets. We are working on bringing component specific actions for the remaining widgets. +::: + +## Using Component Specific Actions + +### Set a value for text input widget using button's event handler + +- Drag a **Text Input** and a **Button** widget onto the canvas. + +- Go to the **Inspector** on the left sidebar to check the exposed variables available for the `textinput1` widget under the `components`. You'll see that the variable `value` is an empty string because the field value of the text input widget is empty right now. + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/inspector.png) + +
    + +- Now enter some value in the text input widget and you'll see that the `value` in inspector has been updated. + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/updated.png) + +
    + +- Now, click on the button's widget handler to open up its properties in the right sidebar and then add a event handler for **On Click** event to trigger **Control Component** action. Select `textinput1` in component dropdown, `Set text` as Action, and in `Text` field enter the text that you want to update in the field value. + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/button.png) + +
    + +- Now when you'll click on the button you'll see that the field value of the text input widget has been updated with value that you set. + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/set.png) + +
    + + +### Clear value of text input widget using JavaScript query + +- Let's clear the value that we set in the previous section, using Run JavaScript code. Create a new Run JavaScript Code query and call the component and the CSA that component provides. + +**Syntax:** +```js +await components.textinput1.clear() +``` + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/jsoption.png) + +
    + + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/clear.png) + +
    + +- Finally, hit the **save and run** query button to fire up the query, and you'll see that the field value of the text input widget has been cleared. + diff --git a/docs/versioned_docs/version-2.4.0/actions/copy-to-clipboard.md b/docs/versioned_docs/version-2.4.0/actions/copy-to-clipboard.md new file mode 100644 index 0000000000..81f97c360e --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/copy-to-clipboard.md @@ -0,0 +1,18 @@ +--- +id: copy-to-clipboard +title: Copy to clipboard +--- + +Use this action to copy the text to the clipboard. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Copy to clipboard + +
    diff --git a/docs/versioned_docs/version-2.4.0/actions/generate-file.md b/docs/versioned_docs/version-2.4.0/actions/generate-file.md new file mode 100644 index 0000000000..8484d291a5 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/generate-file.md @@ -0,0 +1,42 @@ +--- +id: generate-file +title: Generate file +--- + +# Generate file + +This action allows you to construct files on the fly and let users download it. +Presently, the only file type supported is `CSV`. + +## Options + +| Option | Description | +|--------|-------------| +| Type | Type of file to be generated | +| File name | Name of the file to be generated | +| Data | Data that will be used to construct the file. Its format will depend on the file type, as specified in the following section | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +### Data format for CSV + +For `CSV` file type, the data field should be supplied with an array objects. ToolJet assumes that the keys of each of +these objects are the same and that they represent the column headers of the csv file. + +Example: + +```javascript +{{ + [ + { name: 'John', email: 'john@tooljet.com' }, + { name: 'Sarah', email: 'sarah@tooljet.com' }, + ] +}} +``` + +Supplying the above snippet will generate a csv file which looks like this: + +```csv +name,email +John,john@tooljet.com +Sarah,sarah@tooljet.com +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/actions/go-to-app.md b/docs/versioned_docs/version-2.4.0/actions/go-to-app.md new file mode 100644 index 0000000000..02d15e6aef --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/go-to-app.md @@ -0,0 +1,20 @@ +--- +id: go-to-app +title: Go to app +--- + +This action allows you to open any ToolJet application when an event occurs. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Open webpage + +
    + + diff --git a/docs/versioned_docs/version-2.4.0/actions/logout.md b/docs/versioned_docs/version-2.4.0/actions/logout.md new file mode 100644 index 0000000000..0e3187471c --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/logout.md @@ -0,0 +1,18 @@ +--- +id: logout +title: Logout +--- + +This action allows you to log out of the application (ToolJet). + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference -  Logout + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/actions/open-webpage.md b/docs/versioned_docs/version-2.4.0/actions/open-webpage.md new file mode 100644 index 0000000000..749b205eb9 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/open-webpage.md @@ -0,0 +1,18 @@ +--- +id: open-webpage +title: Open webpage +--- + +You can use this action to open a webpage(on a new tab) for any event. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Open webpage + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/actions/run-query.md b/docs/versioned_docs/version-2.4.0/actions/run-query.md new file mode 100644 index 0000000000..55eb1f16aa --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/run-query.md @@ -0,0 +1,18 @@ +--- +id: run-query +title: Run Query +--- + +This action allows you to fire queries when an event occurs. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference -  Run Query + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/actions/set-localstorage.md b/docs/versioned_docs/version-2.4.0/actions/set-localstorage.md new file mode 100644 index 0000000000..3dead574aa --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/set-localstorage.md @@ -0,0 +1,59 @@ +--- +id: set-localstorage +title: Set localStorage +--- + +# Set localStorage + +This action allows you to specify a `key` and its corresponding `value` to be stored in localStorage. + +## Example: App that stores a name in localStorage and displays it on reload + +1. Add an input field, button and a text as shown + +
    + +![ToolJet - Action reference -Set local storage sample app](/img/actions/localstorage/1.png) + +
    + +2. Select the button and add a `Set localStorage` action with `key` set to `name` and value pointing at the value of the text field + +
    + +![ToolJet - Action reference -Set local storage sample app](/img/actions/localstorage/2.png) + +
    + +3. Select the text label we've added and set its value to the name item from localStorage. + +:::info +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` +::: + +
    + +![ToolJet - Action reference -Set local storage sample app](/img/actions/localstorage/debounce.png) + +
    + + +4. Now save the application, this is important as we're about to reload the page. + +5. Type in anything you wish on the input box and click on the button + +
    + +![ToolJet - Action reference -Set local storage sample app](/img/actions/localstorage/5.png) + +
    + + +6. Reload the page, you'll see that the value stored in local storage is persisted and it is displayed on screen! + +
    + +![ToolJet - Action reference -Set local storage sample app](/img/actions/localstorage/6.png) + +
    + diff --git a/docs/versioned_docs/version-2.4.0/actions/set-page-var.md b/docs/versioned_docs/version-2.4.0/actions/set-page-var.md new file mode 100644 index 0000000000..1129a32e96 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/set-page-var.md @@ -0,0 +1,20 @@ +--- +id: set-page-variable +title: Set page variable +--- + +Page variables can only be accessed within a page on which they are created, unlike normal variables that can be accessed throughout the application. + +Use this action to create a variable and assign a `value` to it in the [Multipage Apps](/docs/tutorial/pages). + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Switch page + +
    diff --git a/docs/versioned_docs/version-2.4.0/actions/set-table-page.md b/docs/versioned_docs/version-2.4.0/actions/set-table-page.md new file mode 100644 index 0000000000..6c6414650c --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/set-table-page.md @@ -0,0 +1,24 @@ +--- +id: set-table-page +title: Set Table Page +--- + +Use this action to change the page index in the table widget. + +## Options + +| Option | Description | +|--------|-------------| +| Table | Select table from the dropdown | +| Page Index | Numerical value for the page index. ex: `{{2}}` | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Open webpage + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/actions/set-variable.md b/docs/versioned_docs/version-2.4.0/actions/set-variable.md new file mode 100644 index 0000000000..ef611d43ba --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/set-variable.md @@ -0,0 +1,24 @@ +--- +id: set-variable +title: Set variable +--- + +This action allows you to create a variable and assign a `value` to it. + +## Options + +| Option | Description | +|--------|-------------| +| Key | Name(String) of the variable through which you can access the value | +| Value | A value can be a string, number, boolean expression, array, or object | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference -Set variable + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/actions/show-alert.md b/docs/versioned_docs/version-2.4.0/actions/show-alert.md new file mode 100644 index 0000000000..f92ec12cd7 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/show-alert.md @@ -0,0 +1,23 @@ +--- +id: show-alert +title: Show alert +--- + +This action allows you to display an alert message. + +You can set a custom **message** for the alert and choose a particular alert type. + +There are 4 types of alert messages - **Info**, **Success**, **Warning**, and **Error**. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference -  Show Alert + +
    + diff --git a/docs/versioned_docs/version-2.4.0/actions/show-modal.md b/docs/versioned_docs/version-2.4.0/actions/show-modal.md new file mode 100644 index 0000000000..10f5d9ab17 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/show-modal.md @@ -0,0 +1,18 @@ +--- +id: show-modal +title: Show modal +--- + +Use this action to show the modal for an event. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Show modal + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/actions/switch-page.md b/docs/versioned_docs/version-2.4.0/actions/switch-page.md new file mode 100644 index 0000000000..db07767412 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/switch-page.md @@ -0,0 +1,18 @@ +--- +id: switch-page +title: Switch Page +--- + +Use this action with different events to switch to a different page in the [Multipage App](/docs/tutorial/pages). + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Switch page + +
    diff --git a/docs/versioned_docs/version-2.4.0/actions/unset-page-var.md b/docs/versioned_docs/version-2.4.0/actions/unset-page-var.md new file mode 100644 index 0000000000..16dcfb84bf --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/unset-page-var.md @@ -0,0 +1,18 @@ +--- +id: unset-page-variable +title: Unset page variable +--- + +Use this action to clear the variable that was created using the set page variable action. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Switch page + +
    diff --git a/docs/versioned_docs/version-2.4.0/actions/unset-variable.md b/docs/versioned_docs/version-2.4.0/actions/unset-variable.md new file mode 100644 index 0000000000..1e6b35f99f --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/actions/unset-variable.md @@ -0,0 +1,23 @@ +--- +id: unset-variable +title: Unset variable +--- + +This action allows you to remove the variable variable that was created using the set variable action. + +## Options + +| Option | Description | +|--------|-------------| +| Key | Name(String) of the variable through which you can access the value | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference -Unset variable + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/app-builder/canvas.md b/docs/versioned_docs/version-2.4.0/app-builder/canvas.md new file mode 100644 index 0000000000..73e5a253d8 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/app-builder/canvas.md @@ -0,0 +1,55 @@ +--- +id: canvas +title: Canvas +--- + +Canvas is the center area of the ToolJet app builder where the application is built. You arrange the **components** by dragging them from the Components library(right-sidebar). + +
    + +App Builder: Canvas + +
    + +### Arrange Components + +All the components are fully interactive in editor mode - to prevent interaction you can **click and hold** the **[Component Handle](docs/app-builder/components-library)** to change component's position. + +
    + +App Builder: Canvas + +
    + +### Resize Components + +Components on the canvas can be resized from the edges. + +You can precisely set the position of selected components using keyboard arrow keys after clicking the component handle. + +
    + +App Builder: Canvas + +
    + +### Group Components + +ToolJet comes with flexible components to group other components together, such as **Container** and **Form**. When you drag and drop components in containers/forms they create a group of nested components. All components can be nested in this way. + +### Hide or Disable Components + +Hide or Disable a component by setting its **Visibility** or **Disabled** property to `true`. Click on the component handle to open **config inspector** on right side. These values can also evaluate to true based on a truthy value. For example, you can use the property of one component to toggle the Visibility property of another component dynamically, you just need to write a conditional statement. + +For example: We want to disable a button when a checkbox is checked so we can simple use `{{components.checkbox1.value}}` in **Disable** property of the button. `{{components.checkbox1.value}}` evaluates to `true` when the checkbox is checked, and false when unchecked. + +
    + +App Builder: Canvas + +
    + +### Clone Components + +You can clone existing components on the canvas by **cmd/ctrl + d**. Check other **[Keyboard Shortcuts](/docs/tutorial/keyboard-shortcuts)** + diff --git a/docs/versioned_docs/version-2.4.0/app-builder/left-sidebar.md b/docs/versioned_docs/version-2.4.0/app-builder/left-sidebar.md new file mode 100644 index 0000000000..c67d7ec43f --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/app-builder/left-sidebar.md @@ -0,0 +1,68 @@ +--- +id: left-sidebar +title: Left-sidebar +--- + +Left-sidebar has the following options: + +- **[Pages](#pages)** +- **[Inspector](#inspector)** +- **[Datasources Manager](#datasources-manager)** +- **[Debugger](#debugger)** +- **[Theme switch](#theme-switch)** + +
    + +App Builder: Left-sidebar + +
    + +## Pages + +Pages allows you to have multiple pages in a single application, making your ToolJet applications more robust and user-friendly. + +Check the detailed documentation for **[Pages](/docs/tutorial/pages)**. + +
    + +App Builder: Left-sidebar + +
    + +## Inspector + +The Inspector can be used to inspect the data of the **queries**, properties and values of the **components** that are there on the canvas, ToolJet's global variables and the variables that have been set by the user. + +Check the detailed guide on **[using Inspector](/docs/how-to/use-inspector)**. + +
    + +App Builder: Left-sidebar + +
    + +## Datasources Manager + +Datasources Manager is used to connect or remove the datasources. + +Check the detailed **[Datasources documentation](/docs/data-sources/overview)**. + +
    + +App Builder: Left-sidebar + +
    + +## Debugger + +The debugger captures errors that happens while running the queries. For example, when a database query fails due to the unavailability of a database or when a REST API query fails due to an incorrect URL, the errors will be displayed on the debugger. The debugger also displays relevant data related to the error along with the error message. + +
    + +App Builder: Left-sidebar + +
    + +## Theme switch + +Switch ToolJet into light or dark mode from this button. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/app-builder/overview.md b/docs/versioned_docs/version-2.4.0/app-builder/overview.md new file mode 100644 index 0000000000..f2c53bdcb1 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/app-builder/overview.md @@ -0,0 +1,20 @@ +--- +id: overview +title: Overview +--- + +# App-Builder: Overview + +ToolJet's App Builder allows you to build applications. ToolJet's app builder has the following major components: + +- **[Toolbar](/docs/app-builder/toolbar)**: configure app settings +- **[Canvas](/docs/app-builder/canvas)**: Arrange the components to build the interface of app +- **[Left-sidebar](/docs/app-builder/left-sidebar)**: Add **[pages](/docs/tutorial/pages)**, **[datasources](/docs/data-sources/overview)**, **[inspect](/docs/how-to/use-inspector)** the components, queries or variables, and **[debug](#debugger)** the errors. +- **[Components library](/docs/app-builder/components-library)**(right sidebar): Drag any component or modify the property or styling +- **[Query Panel](/docs/app-builder/query-panel)**: Create, edit or manage the queries + +
    + +App Builder: Overview + +
    diff --git a/docs/versioned_docs/version-2.4.0/app-builder/query-panel.md b/docs/versioned_docs/version-2.4.0/app-builder/query-panel.md new file mode 100644 index 0000000000..1b54f3634b --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/app-builder/query-panel.md @@ -0,0 +1,177 @@ +--- +id: query-panel +title: Query Panel +--- + +The Query Panel is present at the bottom of the app-builder, this is where you create queries to interact with connected datasources. You can perform API requests, query **[databases](/docs/data-sources/overview)**, or **[transform](/docs/tutorial/transformations)** or manipulate data with **[JavaScript](/docs/data-sources/run-js)** & **[Python](/docs/data-sources/run-py)**. + +The Query Panel has two sections: +- **[Query Manager](#query-manager)** on the right that includes a list of all the created queries +- **[Query Editor](#query-editor)** is used to configure the selected query + +
    + +App Builder: Component library- right sidebar + +
    + +## Query Manager + +Query Manager will list all the queries that has been created in the application. Query Manager is used to: + +### Search + +On the top of the query manager is search box that can be used to search for a specific query. + +
    + +App Builder: Component library- right sidebar + +
    + +### Add + +Add button is used to add more queries in the application. When Add button is clicked, the Query Editor will show you a list of options for creating a query from: **Rest API**, connected **[datasources](/docs/data-sources/overview)**, **[ToolJet Database](/docs/tooljet-database)**, **[JavaScript Code](/docs/data-sources/run-js)**, **[Python Code](/docs/data-sources/run-py)** or Add a new datasource. + +
    + +App Builder: Component library- right sidebar + +
    + +### Delete + +Delete button will delete the selected query, the button will only show up when you hover over the query name. + +
    + +App Builder: Component library- right sidebar + +
    + +### Edit + +Edit button is used edit the name of the selected query, the button will only show up when you hover over the query name. + +
    + +App Builder: Component library- right sidebar + +
    + +## Query Editor + +Query editor used to configure the query parameters, preview or transform the data return by the query. + +
    + +App Builder: Component library- right sidebar + +
    + +### Topbar + +On the top of the query panel there are a few options: + +#### Query Name editor + +Edit the name of the query by clicking on the edit button next to the default query name. + +
    + +App Builder: Component library- right sidebar + +
    + +#### Preview + +Preview gives you a quick look at the data returned by the query without triggering the query in the app. + +The Preview of data is returned in two different formats: + +**Raw** + +
    + +App Builder: Component library- right sidebar + +
    + +**JSON** + +
    + +App Builder: Component library- right sidebar + +
    + +#### Save + +Save is used to save the changes whenever a change is made in query. + +
    + +App Builder: Component library- right sidebar + +
    + +#### Run + +Run is used to trigger the query, running the query will interact with the application unlike `Preview`. + +
    + +App Builder: Component library- right sidebar + +
    + +### Query Parameters + +Query Parameters are the values required for the query to return a response from the server. Parameters include **endpoints**, **methods**, or **operations**. Query Parameters are different for each datasource. + +
    + +App Builder: Component library- right sidebar + +
    + +### Transformation + +Transformations can be enabled on queries to transform the query results. ToolJet allows you to transform the query results using two programming languages JavaScript & Python. Check the detailed documentation on **[Transformations](/docs/tutorial/transformations)**. + +
    + +App Builder: Component library- right sidebar + +
    + +### Advanced options + +#### Run this query on application load? + +Enabling this option will fire the query every time the app is loaded. + +#### Request confirmation before running the query? + +Enabling this option show a confirmation modal to confirm `Yes` or `No` if you want to fire that query. + +#### Run this query on application load? + +Enabling this option show a success toast notification when the query is successfully triggered. + +#### Event Handlers + +Event Handler are used to add some action when a particular event happens. You can add event handlers to the query for the following events: + +- **Query Success** +- **Query Failure** + +:::info +Learn more about [Event Handlers and Actions](/docs/widgets/overview#component-event-handlers). +::: + +
    + +App Builder: Component library- right sidebar + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/app-builder/right-sidebar.md b/docs/versioned_docs/version-2.4.0/app-builder/right-sidebar.md new file mode 100644 index 0000000000..3b371a8641 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/app-builder/right-sidebar.md @@ -0,0 +1,29 @@ +--- +id: components-library +title: Components Library +--- + +The **Components Library** on the right sidebar contains all of the available components. Use this to drag-and-drop a component from the library to the canvas. It organizes components into sections and you can enter a search term to quickly find a component you need. + +
    + +App Builder: Component library- right sidebar + +
    + +:::tip +Check the **[Components Catalog](/docs/widgets/overview)** here to know more about specific component. +::: + +## Component Config Inspector + +The Component Config Inspector is also called as component inspector. It contains all the available settings for the selected component and is where you **set values**, **update component names**, and **create event handlers**. The Compoenent Inspector organizes settings into different sections, such as **Property** and **Styles**. + +To open the Component Config Inspector, click on the component handle that is present on the top of the component including **⚙️ + Component Name** and the component inspector will open up on the right side: + +
    + +App Builder: Component library- right sidebar + +
    + diff --git a/docs/versioned_docs/version-2.4.0/app-builder/toolbar.md b/docs/versioned_docs/version-2.4.0/app-builder/toolbar.md new file mode 100644 index 0000000000..03a26077f0 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/app-builder/toolbar.md @@ -0,0 +1,133 @@ +--- +id: toolbar +title: Toolbar +--- + +Toolbar is present at the top of the app-builder, and is used to configure the app settings. + +
    + +App Builder: Toolbar + +
    + +### App name + +App name can be edited from the left side of the toolbar next to the ToolJet logo. + +When a new app is created, by default its name is set to **Untitled app** + +
    + +App Builder: Toolbar + +
    + +### Global Settings + +To configure the app's global settings, click on the kebab menu(three vertical dots) on the left of the app name. Global settings include: + +- **Hide heaeder for launched apps**: Toggle this on to the hide the tooljet's header when the applications are launched +- **Maintenance mode**: Toggle this on to put the application in maintenance mode. When in **maintenance mode**, on launching the app, the user will get an error message that **the app is under maintenance**. +- **Max width of canvas**: Modify the width of the canvas in **px** or **%**. The default width is 1292 px. +- **Max height of canvas**: Modify the width of the canvas in **px** or **%**. The default height is 2400 px and currently it is the maximum height limit. +- **Background color of canvas**: Enter the hex color code or choose a color from the picker to change the background color of the canvas. You can also click on the **Fx** to programmatically set the value. + +
    + +App Builder: Toolbar + +
    + +### Desktop or Mobile layout + +Switch the canvas mode in Mobile or Desktop layout from the toolbar. + +#### Adding existing component to mobile layout + +Click on the component handle to open component config inspector on the right side. Scroll down to the **Layout** section and enable Mobile Layout. The width of the widget will be adjusted to fit the Mobile Layout. + +#### Adding a new component to mobile layout + +Switch the layout to mobile by clicking the button on the toolbar. Drag and drop a component to the canvas. This widget will not be shown on desktop layout unless **Show on desktop** is enabled from the component config inspector. + +:::info +Width of the component will be automatically adjusted to fit the screen while viewing the application in app viewer. +::: + +
    + +App Builder: Toolbar + +
    + +### Undo or Redo + +Use the undo or redo buttons from the toolbar to undo or redo any change on the canvas. + +You can also **[Keyboard Shortcuts](/docs/tutorial/keyboard-shortcuts)** to perform such actions. + +
    + +App Builder: Toolbar + +
    + +### Version Manager + +Create or Remove Versions of the applications from the Version Manager. You can also edit the version name from the edit button. + +When many developers are working on an app, **Versioning** allows them to save their own version of the app. This also prevents developers from overwriting the other developer's work. + +
    + +App Builder: Toolbar + +
    + +### Comments + +Comment anywhere on the canvas and collaborate with other users in the workspace. Click on the comments button to enable it and then drop comment anywhere on the canvas. + +
    + +App Builder: Toolbar + +
    + +### Share + +Share your applications with a unique URL generated automatically or edit the URL slug to personalize it. + +- When **Make the application public** is off and URL is shared then the users will have to login to ToolJet to use the application. Toggle on the option then anyone on the internet will be able to access the application without logging in to ToolJet. +- ToolJet generates the **Embedded link** which can be used to embed application on the webpages. + +
    + +App Builder: Toolbar + +
    + +### Preview + +Clicking on **Preview** button will open up the currently opened version of the app in the new tab. This is really handy when the app developer wants to immediately check the app preview in production. + +
    + +App Builder: Toolbar + +
    + +### Release + +Release the app to publish the current version of the app and push the changes into the production. + +:::caution +ToolJet will block editing of the Released version of an app and will display a prompt to create a new version to make the changes. This is to prevent accidentally pushing an unfinished app to the live version. +::: + +
    + +App Builder: Toolbar + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/_category_.json b/docs/versioned_docs/version-2.4.0/contributing-guide/_category_.json new file mode 100644 index 0000000000..317067020d --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Contributing Guide", + "position": 11, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/code-of-conduct.md b/docs/versioned_docs/version-2.4.0/contributing-guide/code-of-conduct.md new file mode 100644 index 0000000000..03f7184d51 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/code-of-conduct.md @@ -0,0 +1,81 @@ +--- +id: code-of-conduct +title: Contributor Code of Conduct +--- + +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at hello@tooljet.com . All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/l10n.md b/docs/versioned_docs/version-2.4.0/contributing-guide/l10n.md new file mode 100644 index 0000000000..196a10aba2 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/l10n.md @@ -0,0 +1,69 @@ +--- +id: l10n +title: Localization +--- + +Welcome to ToolJet Localization Guide. The goal of the Localization is to make ToolJet easy to use and close to all countries, languages, and general cultural groups. On this page, you will find instructions on how to contribute to ToolJet through Localization and make a more friendly ToolJet for all regions. + +## Adding Translations + +- For adding the translations of your language in ToolJet, you'll need to create a new **languagecode.json** file which will include all the translations for the keywords in your language, and then list the language in the **languages.json** file for the language to be listed in the dashboard of the ToolJet. + +- Go to the **frontend** directory which is at the root of ToolJet, then go to the **assets** and inside assets, you'll find the **translations** directory. You have created a new json file with the **language code** as the file name. The language code should follow [ISO 639-1 Code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes). + + ``` + \frontend + |--\assets + |--\--\translations + |--\--\--\languages.json + |--\--\--\en.json + ``` + +
    + + files + +
    + +- Let's localize ToolJet in the **French** language. Create a new json file inside the translations directory and name it **fr.json**. `fr` is the language code for French. + +- After creating the new file, open the **en.json** file and copy all the contents of the file to the newly created **fr.json**. + +
    + + files + +
    + +- Once copied, you can now start adding the translations for the keywords in the french language. + +- After completing the translation, all you need to do is list the language in **languages.json** file. You'll need to add an object with three key-value pairs. **lang** - the name of the language that you added, **code** - the language code, and the **nativeLang** - name of language in the native. + + ```js + { + "languageList": + [ + { "lang": "English", "code": "en", "nativeLang": "English" }, + { "lang": "French", "code": "fr", "nativeLang": "Français" } + ] + } + ``` + + + +:::note +Feel free to reach us on [Slack](https://tooljet.com/slack) for any help related to Localization. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/setup/_category_.json b/docs/versioned_docs/version-2.4.0/contributing-guide/setup/_category_.json new file mode 100644 index 0000000000..90bb09deae --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/setup/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Setup", + "position": 1, + "collapsed": true +} diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/setup/architecture.md b/docs/versioned_docs/version-2.4.0/contributing-guide/setup/architecture.md new file mode 100644 index 0000000000..763ddcd622 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/setup/architecture.md @@ -0,0 +1,25 @@ +--- +id: architecture +title: Architecture +--- +# Introduction + +ToolJet has two main components: **ToolJet Server** and **ToolJet Client**. + +### 1. ToolJet Server + +ToolJet server is a Node.js API application. Server is responsible for authentication, authorization, persisting application definitions, running queries, storing data source credentials securely and more. + +**Dependencies:** +- **PostgreSQL** - ToolJet server persists data to a postgres database. +- **Email service** (SMTP/Sendgrid/Mailgun/etc) - Required to send user invitations and password reset emails. +- **PostgREST (Optional)** - Standalone web server that converts PostgreSQL database into queryable RESTful APIs for Tooljet Database. + +### 2. ToolJet Client + +ToolJet client is a ReactJS application. Client is responsible for visually editing the applications, building & editing queries, rendering applications, executing events and their trigger, etc. + +## Requirements + +1. **Node version 18.3.0** +2. **npm version 8.11.0** diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/setup/docker.md b/docs/versioned_docs/version-2.4.0/contributing-guide/setup/docker.md new file mode 100644 index 0000000000..f2f2c7bdde --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/setup/docker.md @@ -0,0 +1,182 @@ +--- +id: docker +title: Docker +--- + +# Docker + +Docker compose is the easiest way to setup ToolJet server and client locally. + +:::info +If you rather want to try out ToolJet locally with docker, you can follow the steps [here](https://docs.tooljet.com/docs/setup/docker-local). +::: + +## Prerequisites + +Make sure you have the latest version of `docker` and `docker-compose` installed. + +[Official docker installation guide](https://docs.docker.com/desktop/) + +[Official docker-compose installation guide](https://docs.docker.com/compose/install/) + +We recommend: + +```bash +docker --version +Docker version 19.03.12, build 48a66213fe + +docker-compose --version +docker-compose version 1.26.2, build eefe0d31 +``` + +## Setting up + +:::tip +If you are setting up on a Windows machine, we advise you to setup Docker desktop with WSL2. +Please find more information [here](https://docs.docker.com/desktop/windows/wsl/). +::: + +1. Clone the repository + ```bash + git clone https://github.com/tooljet/tooljet.git + ``` + +2. Create a `.env` file by copying `.env.example`. More information on the variables that can be set is given in the [environment variables reference](/docs/setup/env-vars) + ```bash + cp .env.example .env + cp .env.example .env.test + ``` + +3. Populate the keys in the `.env` and `.env.test` file + :::info + `SECRET_KEY_BASE` requires a 64 byte key. (If you have `openssl` installed, run `openssl rand -hex 64` to create a 64 byte secure random key) + + `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) + ::: + :::tip + If you are setting up on a Windows machine. Please make sure that .env file line endings to be LF as it will be CRLF by default unless configured for Windows machine. + ::: + + Example: + + ```bash + cat .env + TOOLJET_HOST=http://localhost:8082 + LOCKBOX_MASTER_KEY=13c9b8364ae71f714774c82498ba328813069e48d80029bb29f49d0ada5a8e40 + SECRET_KEY_BASE=ea85064ed42ad02cfc022e66d8bccf452e3fa1142421cbd7a13592d91a2cbb866d6001060b73a98a65be57e65524357d445efae00a218461088a706decd62dcb + NODE_ENV=development + # DATABASE CONFIG + PG_HOST=postgres + PG_PORT=5432 + PG_USER=postgres + PG_PASS=postgres + PG_DB=tooljet_development + ORM_LOGGING=all + ``` + + ```bash + cat .env.test + TOOLJET_HOST=http://localhost:8082 + LOCKBOX_MASTER_KEY=13c9b8364ae71f714774c82498ba328813069e48d80029bb29f49d0ada5a8e40 + SECRET_KEY_BASE=ea85064ed42ad02cfc022e66d8bccf452e3fa1142421cbd7a13592d91a2cbb866d6001060b73a98a65be57e65524357d445efae00a218461088a706decd62dcb + NODE_ENV=test + # DATABASE CONFIG + PG_HOST=postgres + PG_PORT=5432 + PG_USER=postgres + PG_PASS=postgres + PG_DB=tooljet_test + ORM_LOGGING=error + ``` + +4. Build docker images + + ```bash + docker-compose build + docker-compose run --rm plugins npm run build:plugins + ``` + +5. Run ToolJet + + ```bash + docker-compose up + ``` + ToolJet should now be served locally at `http://localhost:8082`. + +8. To shut down the containers, + ```bash + docker-compose stop + ``` + +## Making changes to the codebase + +If you make any changes to the codebase/pull the latest changes from upstream, the tooljet server container would hot reload the application without you doing anything. + +Caveat: + +1. If the changes include database migrations or new npm package additions in the package.json, you would need to restart the ToolJet server container by running `docker-compose restart server`. + +2. If you need to add a new binary or system library to the container itself, you would need to add those dependencies in `docker/server.Dockerfile.dev` and then rebuild the ToolJet server image. You can do that by running `docker-compose build server`. Once that completes you can start everything normally with `docker-compose up`. + +Example: +Let's say you need to install the `imagemagick` binary in your ToolJet server's container. You'd then need to make sure that `apt` installs `imagemagick` while building the image. The Dockerfile at `docker/server.Dockerfile.dev` for the server would then look something like this: + +``` +FROM node:18.3.0-buster AS builder + +RUN apt update && apt install -y \ + build-essential \ + postgresql \ + freetds-dev \ + imagemagick + +RUN mkdir -p /app +WORKDIR /app + +COPY ./server/package.json ./server/package-lock.json ./ +RUN npm install + +ENV NODE_ENV=development + +COPY ./server/ ./ + +COPY ./docker/ ./docker/ + +COPY ./.env ../.env + +RUN ["chmod", "755", "entrypoint.sh"] + +``` + +Once you've updated the Dockerfile, rebuild the image by running `docker-compose build server`. After building the new image, start the services by running `docker-compose up`. + +## Running tests + +Test config picks up config from `.env.test` file at the root of the project. + +Run the following command to create and migrate data for test db + +```bash +docker-compose run --rm -e NODE_ENV=test server npm run db:create +docker-compose run --rm -e NODE_ENV=test server npm run db:migrate +``` + +To run the unit tests +```bash +docker-compose run --rm server npm run --prefix server test +``` + +To run e2e tests +```bash +docker-compose run --rm server npm run --prefix server test:e2e +``` + +To run a specific unit test + +```bash +docker-compose run --rm server npm --prefix server run test +``` + +## Troubleshooting + +Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our [Slack Community](https://tooljet.com/slack) if you encounter any issues when trying to run ToolJet locally. diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/setup/macos.md b/docs/versioned_docs/version-2.4.0/contributing-guide/setup/macos.md new file mode 100644 index 0000000000..b317f3a592 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/setup/macos.md @@ -0,0 +1,134 @@ +--- +id: macos +title: Mac OS +--- + +# Mac OS +Follow these steps to setup and run ToolJet on macOS for development purposes. Open terminal and run the commands below. We recommend reading our guide on [architecture](/docs/contributing-guide/setup/architecture) of ToolJet before proceeding. + +## Setting up + +1. Set up the environment + + 1.1 Install Homebrew + ```bash + /bin/bash -c "(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" + ``` + 1.2 Install Node.js ( version: v18.3.0 ) and npm (version: v8.11.0) + ```bash + brew install nvm + export NVM_DIR=~/.nvm + source $(brew --prefix nvm)/nvm.sh + nvm install 18.3.0 + nvm use 18.3.0 + npm install -g npm@8.11.0 + ``` + + 1.3 Install Postgres + :::tip + ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. We do not plan to support other databases such as MySQL. + ::: + + ```bash + brew install postgresql + ``` + + 1.4 Install PostgREST(optional) + + :::info + Required only if Tooljet Database is being used. + + Please use PostgREST version 10.1.1.x + ::: + + ```bash + brew install postgrest --version 10.1.1.20221215 + ``` + + 1.5 Clone the repository + ```bash + git clone https://github.com/tooljet/tooljet.git + ``` + +2. Set up environment variables + + Create a `.env` file by copying `.env.example`. More information on the variables that can be set is given in the [environment variables reference](/docs/setup/env-vars) + ```bash + cp .env.example .env + ``` + +3. Populate the keys in the env file + :::info + `SECRET_KEY_BASE` requires a 64 byte key. (If you have `openssl` installed, run `openssl rand -hex 64` to create a 64 byte secure random key) + + `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) + ::: + + Example: + ```bash + cat .env + TOOLJET_HOST=http://localhost:8082 + LOCKBOX_MASTER_KEY=1d291a926ddfd221205a23adb4cc1db66cb9fcaf28d97c8c1950e3538e3b9281 + SECRET_KEY_BASE=4229d5774cfe7f60e75d6b3bf3a1dbb054a696b6d21b6d5de7b73291899797a222265e12c0a8e8d844f83ebacdf9a67ec42584edf1c2b23e1e7813f8a3339041 + NODE_ENV=development + # DATABASE CONFIG + PG_HOST=postgres + PG_PORT=5432 + PG_USER=postgres + PG_PASS=postgres + PG_DB=tooljet_development + ORM_LOGGING=all + ``` + +4. Install and build dependencies + ```bash + npm install + npm install --prefix server + npm install --prefix frontend + npm run build:plugins + ``` + +5. Set up database + ```bash + npm run --prefix server db:reset + ``` + +6. Run plugins compilation in watch mode + ```bash + cd ./plugins && npm start + ``` + +7. Run the server + ```bash + cd ./server && npm run start:dev + ``` + +8. Run the client + ```bash + cd ./frontend && npm start + ``` + + The client will start on the port 8082, you can access the client by visiting: [https://localhost:8082](https://localhost:8082) + +9. Create login credentials + + Visiting [https://localhost:8082](https://localhost:8082) should redirect you to the login page, click on the signup link and enter your email. The emails sent by the server in development environment are captured and are opened in your default browser. Click the invitation link in the email preview to setup the account. + +## Running tests + +Test config requires the presence of `.env.test` file at the root of the project. + +To run the unit tests +```bash +npm run --prefix server test +``` + +To run e2e tests +```bash +npm run --prefix server test:e2e +``` + +To run a specific unit test +```bash +npm run --prefix server test +``` diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/setup/ubuntu.md b/docs/versioned_docs/version-2.4.0/contributing-guide/setup/ubuntu.md new file mode 100644 index 0000000000..171b95a914 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/setup/ubuntu.md @@ -0,0 +1,126 @@ +--- +id: ubuntu +title: Ubuntu +--- + +# Ubuntu +Follow these steps to setup and run ToolJet on Ubuntu. Open terminal and run the commands below. + +## Setting up + +1. Set up the environment + + 1.1 Install NVM + ```bash + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash + ``` + + Close and reopen your terminal to start using nvm + ```bash + nvm install 18.3.0 + ``` + + Ensure you have the correct version of npm, or it will cause an error about fsevents. + ```bash + npm i -g npm@8.11.0 + ``` + + 1.2 Install Postgres + ```bash + sudo apt install postgresql postgresql-contrib + sudo apt-get install libpq-dev + ``` + + 1.3 Install PostgREST (optional) + + :::info + Required only if Tooljet Database is being used. + + Please use PostgREST version 10.1.1.x + ::: + + Please follow the installation [PostgREST](https://postgrest.org/en/stable/install.html) guide + + **Note:** Clone the GitHub repo locally using: + + ```bash + git clone https://github.com/ToolJet/ToolJet.git + ``` + + +2. Set up environment variables + + Create a `.env` file by copying `.env.example`. More information on the variables that can be set is given in the [environment variables reference](/docs/setup/env-vars) + ```bash + cp .env.example .env + ``` + +3. Populate the keys in the env file + :::info + `SECRET_KEY_BASE` requires a 64 byte key. (If you have `openssl` installed, run `openssl rand -hex 64` to create a 64 byte secure random key) + + `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) + ::: + + Example: + ```bash + cat .env + TOOLJET_HOST=http://localhost:8082 + LOCKBOX_MASTER_KEY=1d291a926ddfd221205a23adb4cc1db66cb9fcaf28d97c8c1950e3538e3b9281 + SECRET_KEY_BASE=4229d5774cfe7f60e75d6b3bf3a1dbb054a696b6d21b6d5de7b73291899797a222265e12c0a8e8d844f83ebacdf9a67ec42584edf1c2b23e1e7813f8a3339041 + ``` + +4. Install and build dependencies + ```bash + npm install + npm install --prefix server + npm install --prefix frontend + npm run build:plugins + ``` + +5. Set up database + ```bash + npm run --prefix server db:reset + ``` + +6. Run plugins compilation in watch mode + ```bash + cd ./plugins && npm start + ``` + +7. Run the server + ```bash + cd ./server && npm run start:dev + ``` + +8. Run the client + ```bash + cd ./frontend && npm start + ``` + + + The client will start running on the port 8082, you can access the client by visiting: [https://localhost:8082](https://localhost:8082) + +9. Create login credentials + + Visiting https://localhost:8082 should redirect you to the login page, click on the signup link and enter your email. The emails sent by the server in development environment are captured and are opened in your default browser. Click the invitation link in the email preview to setup the account. + + +## Running tests + +Test config requires the presence of `.env.test` file at the root of the project. + +To run the unit tests +```bash +npm run --prefix server test +``` + +To run e2e tests +```bash +npm run --prefix server test:e2e +``` + +To run a specific unit test +```bash +npm run --prefix server test +``` diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/slackcoc.md b/docs/versioned_docs/version-2.4.0/contributing-guide/slackcoc.md new file mode 100644 index 0000000000..aa38cddbc7 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/slackcoc.md @@ -0,0 +1,90 @@ +--- +id: slackcoc +title: Slack Code of Conduct +--- + +# Slack Code of Conduct + +This code of conduct governs ToolJet's Slack Community events and discussions. + +--- + +## Introduction + +- Diversity and inclusion make our community strong. We encourage participation from the most varied and diverse backgrounds possible and want to be very clear about where we stand. + +- Our goal is to maintain a safe, helpful and friendly community for everyone, regardless of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other defining characteristic. + +- This code and related procedures apply to unacceptable behavior occurring in all community venues, including behavior outside the scope of community activities — online and in-person— as well as in all one-on-one communications, and anywhere such behavior has the potential to adversely affect the safety and well-being of community members. + +## Expected behavior + +- Be welcoming. +- Be kind. +- Look out for each other. + +## Unacceptable Behavior + +- Conduct or speech which might be considered sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory or offensive in nature. + - Do not use unwelcome, suggestive, derogatory or inappropriate nicknames or terms. + - Do not show disrespect towards others. (Jokes, innuendo, dismissive attitudes.) +- Intimidation or harassment (online or in-person). +- Disrespect towards differences of opinion. +- Inappropriate attention or contact. Be aware of how your actions affect others. If it makes someone uncomfortable, stop. +- Not understanding the differences between constructive criticism and disparagement. +- Sustained disruptions. +- Violence, threats of violence or violent language. + +## Where does the Code of Conduct apply? + +This Code of Conduct applies to all spaces managed by ToolJet. This includes: + +- Conferences (including social events and peripheral activities) +- Unconferences and sprints +- Meetups, including their discussion boards +- Workshops +- Presentation materials used in talks or sessions +- Slack +- GitHub +- Twitter hashtag and mentions +- Any forums created by the ToolJet which the community uses for communication. + +The Code of Conduct does not exclusively apply to slack or events on an official agenda. For example, if after a scheduled social event you go to a bar with a group of fellow participants, and someone harasses you there, we would still treat that as a CoC violation. Similarly, harassment in Twitter direct messages related to ToolJet can still be covered under this Code of Conduct. + +In addition, violations of this code outside our spaces may affect a person’s ability to participate in them. + +## Enforcement + +- Understand that speech and actions have consequences, and unacceptable behavior will not be tolerated. +- If you are the subject of, or witness to any violations of this Code of Conduct, please contact us via email at hello@tooljet.com or dm @navaneeth on slack. +- If violations occur, organizers will take any action they deem appropriate for the infraction, up to and including expulsion. + +:::info +Portions derived from the [Django Code of Conduct](https://www.djangoproject.com/conduct/), [The Rust Code of Conduct](https://www.rust-lang.org/conduct.html) and [The Ada Initiative](http://adainitiative.org/2014/02/18/howto-design-a-code-of-conduct-for-your-community/) under a Creative Commons Attribution-ShareAlike license. +::: + +--- + +## Etiquettes to follow + +#### 1. Be nice to everyone + +#### 2. Check off your resolved questions + +If you have received a useful reply to your question, please drop a ✅ reaction or a reply for affirmation. + +#### 3. Try not to repost question + +If you have asked a question and have not got a response in 24hrs, please review your question for clarity and revise it. If you still feel you haven't received adequate response, feel free to ping @navaneeth. + +#### 4. Post in public + +Please don't direct message any individual member of ToolJet community without their explicit permission, independent of reason. Your question might be helpful for other community members. + +#### 5. Don't spam tags + +ToolJet's community of volunteer is very active and helpful, generally avoid tagging members unless it is urgent. + +#### 6. Use threads for discussion + +To keep the main channel area clear, we request to use threads to keep an ongoing conversation organized. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/testing.md b/docs/versioned_docs/version-2.4.0/contributing-guide/testing.md new file mode 100644 index 0000000000..d50589d75e --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/testing.md @@ -0,0 +1,57 @@ +--- +id: testing +title: Testing +--- + +Follow the steps below to setup and run the test specifications using Cypress. We recommend [setting up ToolJet locally](/docs/contributing-guide/setup/macos) before proceeding. + +## Setting up + +- Navigate to the `cypress-tests` directory and enter the following command: + ```bash + npm install + ``` + +## Running Tests +#### Headed mode +- To run cypress in **headed** mode, run the following command: + ```bash + npm run cy:open + ``` +- In **headed** mode, the user will be able to choose the test specs from the test runner: +
    + + Cypress headed mode + +
    + +#### Headless mode + +- To run cypress in **headless** mode, run the following command: + ```bash + npm run cy:run + ``` + +- For running specific spec in headless mode, run for specific spec + ```bash + npm run cy:run -- --spec "cypress/e2e/dashboard/multi-workspace/manageSSO.cy.js + ``` + +
    + + Cypress headless mode + +
    + + :::caution + If some test specs need the environment variables, the user can pass them similar to the following command: + ```bash + npm run cy:open -- --env='{"pg_host":"localhost","pg_user":"postgres", "pg_password":"postgres"}' + ``` + or the user can add env-vars in the **cypress.config.js** file + ::: + + +:::info +Check all the Cypress commands [here](https://docs.cypress.io/guides/guides/command-line#Commands) +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/troubleshooting/eslint.md b/docs/versioned_docs/version-2.4.0/contributing-guide/troubleshooting/eslint.md new file mode 100644 index 0000000000..465ba553c3 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/troubleshooting/eslint.md @@ -0,0 +1,43 @@ +--- +id: eslint +title: EsLint +--- + +# ESLint + +ESLint as a code quality tool is a tool that checks your code for errors and helps you to fix them and enforces a coding style. + + +## Setup + + +1. Install the [ESLint extension](https://eslint.org/docs/latest/user-guide/integrations) for your code editor. +2. Set your editor's default formatter to `ESLint`. + +:::tip +For VSCode users, you can set the formatter to `ESLint` in the [**settings.json**](https://code.visualstudio.com/docs/getstarted/settings#_settingsjson). +::: + +3. Install the dependencies. + ```bash + npm install + npm install --prefix server + npm install --prefix frontend + ``` +4. Run the linter. + ```bash + npm run --prefix server lint + npm run --prefix frontend lint + ``` +5. Fix the ESlint errors and warnings. + ```bash + npm run --prefix server format + npm run --prefix frontend format + ``` + + +## Requirements + +1. **Node version 18.3.0** +2. **npm version 8.11.0** + diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/_category_.json b/docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/_category_.json new file mode 100644 index 0000000000..0d7c9bc587 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tutorials", + "position": 2, + "collapsed": true +} diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/create-widget.md b/docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/create-widget.md new file mode 100644 index 0000000000..999e1999db --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/create-widget.md @@ -0,0 +1,27 @@ +--- +id: creating-widget +title: Creating Widgets +--- + +# Creating Widgets + +These are some of the most useful properties and functions passed to the widget + +### properties + +The `properties` object will contain the configurable properties of a widget, initially obtained from its definition on `widgetConfig.js`. +The values inside `properties` change whenever the developer makes changes to the inspector panel of ToolJet editor. + +### exposedVariables + +The `exposedVariables` object will contain the values of all exposed variables as configured in `widgetConfig.js`. + +### setExposedVariable('exposedVariableName', newValue) + +This function allows you to update the value of an exposed variable to `newValue`. + +### validate(value) + +This function validates the `value` passed based on the validation settings configured on the inspector panel for the widget. +It returns an array `[isValid, validationError]`, which represents respectively, whether the `value` passed is valid, +and the error message if there is one. diff --git a/docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/creating-a-plugin.md b/docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/creating-a-plugin.md new file mode 100644 index 0000000000..3192928987 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/contributing-guide/tutorials/creating-a-plugin.md @@ -0,0 +1,226 @@ +--- +id: creating-a-plugin +title: Creating Plugins +--- + +# Creating plugins for ToolJet + +## What are plugins + +ToolJet is built with extensibility in mind. Plugins allows developers to extend the functionalities of ToolJet using JavaScript. Plugins can only be connectors at this moment. For example, the data source connectors such as PostgreSQL, MySQL, Twilio, Stripe, etc are built as plugins. + +In this guide, we will walk you through building plugins for ToolJet with the help of `tooljet` cli. + +`tooljet` cli is a commandline tool built for building plugins easily. We will build a simple plugin for BigQuery in this guide. + +### What does a plugin look like? + +All the plugins live under the `/plugins` directory. The structure of a plugin looks like this: + +``` + my-awesome-plugin/ + package.json + lib/ + icon.svg + index.ts + operations.json + manifest.json +``` + +- manifest.json should include information such as the name of plugin, description, etc. +- operations.json should include the metadata of all the operations supported by the plugin. +- index.ts is the main file. It defines a `QueryService` for the plugin. The `QueryService` handles running of queries, testing connections, caching connections, etc. +- icon.svg is the icon for the plugin. +- package.json is auto generated by the cli. + +## Getting Started + +1. Install [tooljet-cli](https://www.npmjs.com/package/@tooljet/cli): + ```bash + $ npm i -g @tooljet/cli + ``` + +2. Bootstrap a new plugin using cli + ```bash + $ tooljet plugin create bigquery + ``` + + ```bash + creating plugin... done + Plugin: bigquery created successfully + └─ plugins + └─ packages + └─ bigquery + ``` + +3. Add the npm package of BigQuery to the plugin dependencies + ```bash + $ tooljet plugin install @google-cloud/bigquery --plugin bigquery + ``` + +4. Now the directory for our new plugin should looks something like below: + + ```bash + plugins/ + package.json + packages/ + bigquery/ + __tests__ + bigquery.test.js + package.json + lib/ + icon.svg + index.ts + operations.json + manifest.json + ``` + +5. Add data source config paramets to manifest.json + + Our BigQuery plugin needs private key of a GCP service account to connect to BigQuery. Let's add `private_key` as a property for the data source. + + ```json + { + "$schema": "https://json-schema.org/", + "$id": "https://tooljet.io/BigQuery.schema.json", + "title": "BigQuery datasource", + "description": "A schema defining BigQuery datasource", + "type": "api", + "source": { + "name": "BigQuery", + "kind": "bigquery", + "exposedVariables": { + "isLoading": false, + "data": {}, + "rawData": {} + }, + "options": { + "private_key": { "encrypted": true } + } + }, + "defaults": { + "private_key": { "value": "" } + }, + "properties": { + "private_key": { + "label": "Private key", + "key": "private_key", + "type": "textarea", + "description": "Enter JSON private key for service account" + } + }, + "required": ["private_key"] + } + + ``` + +6. Import npm package BigQuery to index.ts + ```javascript + const { BigQuery } = require('@google-cloud/bigquery'); + ``` + +6. Edit index.ts to include the logic for creating a connection. + ```javascript + async getConnection(sourceOptions: any, _options?: object): Promise { + const privateKey = JSON.parse(sourceOptions['private_key']); + const client = new BigQuery({ + projectId: privateKey['project_id'], + credentials: { + client_email: privateKey['client_email'], + private_key: privateKey['private_key'], + }, + }); + + return client; + } + ``` + +7. Edit index.ts to include the logic for testing connection. + When a new data source is being added to a ToolJet application, the connection can be tested. + + :::info + NOTE: Every data source might not have a way to test connection. If not applicable for your data source, you can disable the test connection feature by adding `"customTesting": true,` to the `manifest.json` of your plugin. + ::: + +8. Add manifest entry for operations + + In this example, let's add two operations for our BigQuery plugin. + - *List databases* - Lists all the databases. + - *Query database* - Query a specific database. + + We need to make the entries to `operations.json`. The `operations.json` should look like this now: + ```json + { + "$schema": "https://json-schema.org/", + "$id": "https://tooljet.io/dataqueries/Bigquery.schema.json", + "title": "Dynamodb datasource", + "description": "Operations for BigQuery plugin", + "type": "object", + "defaults": {}, + "properties": { + "operation": { + "label": "Operation", + "key": "operation", + "type": "dropdown-component-flip", + "description": "Single select dropdown for operation", + "list": [ + { + "value": "list_datasets", + "name": "List Datasets" + }, + { + "value": "query", + "name": "Query" + } + ] + }, + "query": { + "query": { + "label": "Query", + "key": "query", + "type": "codehinter", + "description": "", + "height": "150px" + } + } + } + } + + ``` + +8. Handle the logic for running queries in `index.ts` + + `QueryService` receives the metadata of the data source including the credentials and configs for connecting and parameters for the query that was run. In our example, `sourceOptions` will have the `private_key` of BigQuery datasource associated with the query. `queryOptions` will have the configs and parameters for the specific query. For example, `queryOption.operation` will give the id of current operation. + + ```javascript + export default class BigQueryQueryService implements QueryService { + async run(sourceOptions: any, queryOptions: any, _dataSourceId: string): Promise { + const operation = queryOptions.operation; + const client = await this.getConnection(sourceOptions); + let result = {}; + + try { + switch (operation) { + case 'list_datasets': + result = await client.getDatasets(); + break; + } + } catch (error) { + throw new QueryError('Query could not be completed', error.message, {}); + } + + return { + status: 'ok', + data: result, + }; + } + } + ``` + +9. Since it is a smiliar step for adding the logic for handling `query` operation, skipping it. + +10. Test files are generated by the cli when a plugin is created. You can use `jest` for writing the tests. + +Tests for a specific plugin can be run using the command `tooljet plugin test --bigquery` + +13. The plugin is now ready! diff --git a/docs/versioned_docs/version-2.4.0/data-sources/_category_.json b/docs/versioned_docs/version-2.4.0/data-sources/_category_.json new file mode 100644 index 0000000000..c6ad9ffd74 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Datasource Reference", + "position": 5, + "collapsed": true +} diff --git a/docs/versioned_docs/version-2.4.0/data-sources/airtable.md b/docs/versioned_docs/version-2.4.0/data-sources/airtable.md new file mode 100644 index 0000000000..5c1beb12aa --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/airtable.md @@ -0,0 +1,229 @@ +--- +id: airtable +title: Airtable +--- + +# Airtable + + +ToolJet can connect to your Airtable account to read and write data. **Airtable API key** is required to create an Airtable data source on ToolJet. You can generate API key by visiting [Airtable account page](https://airtable.com/account). + + +irtable record + + +:::info +Airtable API has a rate limit, and at the time of writing this documentation, the limit is five(5) requests per second per base. You can read more about rate limits here **[Airtable API]( https://airtable.com/api )**. +::: + +:::tip +This guide assumes that you have already gone through [Adding a data source](/docs/tutorial/adding-a-datasource) tutorial. +::: + +## Supported queries + +- **[Listing records](#listing-records)** +- **[Retrieving a record](#retrieving-a-record)** +- **[Creating a record](#creating-a-record)** +- **[Updating a record](#updating-a-record)** +- **[Deleting a record](#deleting-a-record)** + +### Listing records + +This query lists all the records in a table. The results are paginated and each page can have up to 100 records. + +#### Required parameters: + +- **Base ID:** To find the Base ID, first visit **airtable.com/api**. Select from the list of bases the base whose ID you'd like to find out. Example Base ID: `appDT3UCPffPiSmFd` +- **Table name:** Enter the table name whose data you want to fetch. + +#### Optional parameters: + +- **Page size:** The number of records returned in each request. Must be less than or equal to 100. Default is 100. +- **offset:** If there are more records, the response will contain an offset. To fetch the next page of records, include offset in the next request's parameters. + + +List airtable record + + +Example response from Airtable: + +```json +{ + "records": [ + { + "id": "recu9xMnUdr2n2cw8", + "fields": { + "Notes": "sdfdsf", + "Name": "dsfdsf" + }, + "createdTime": "2021-05-12T14:30:33.000Z" + }, + { + "id": "recyIdR7bVdQvmKXa", + "fields": { + "Notes": "sdfdsf", + "Name": "dfds" + }, + "createdTime": "2021-05-12T14:30:33.000Z" + }, + { + "id": "recAOzdIHaRpvRaGE", + "fields": { + "Notes": "sdfsdfsd", + "Name": "sdfdsf" + }, + "createdTime": "2021-05-12T14:30:33.000Z" + } + ], + "offset": "recAOzdIHaRpvRaGE" +} +``` + +### Retrieving a record + +#### Required parameters: + +- **Base ID** +- **Table name** +- **Record ID** + + +Retrieve airtable record + + +Example response from Airtable: + +```json +{ + "id": "recu9xMnUdr2n2cw8", + "fields": { + "Notes": "sdfdsf", + "Name": "dsfdsf" + }, + "createdTime": "2021-05-12T14:30:33.000Z" +} +``` + +### Creating a record + +#### Required parameters: +- **Base ID** +- **Table name** +- **Records** + + +Create airtable record + +#### Example Records: + +```json +[ + { + "fields": { + "Notes": "sdfdsf", + "Name": "dsfdsf" + } + }, + { + "fields": { + "Notes": "note1", + "Name": "dsfdsf" + } + } +] + + +``` + + +Click on the `run` button to run the query. + +:::info +NOTE: Query must be saved before running. +::: + +Example response from Airtable: +```json +{ + "records": [ + { + "id": "rec5RuZ1COoZGtGDY", + "fields": { + "Notes": "sdfdsf", + "Name": "dsfdsf" + }, + "createdTime": "2022-02-07T20:25:27.000Z" + }, + { + "id": "recaYbFPonNNu6Cwj", + "fields": { + "Notes": "note1", + "Name": "dsfdsf" + }, + "createdTime": "2022-02-07T20:25:27.000Z" + } + ] +} +``` + +### Updating a record + +#### Required parameters: +- **Base ID** +- **Table name** +- **Record ID** + + +Update airtable record + +#### Example body: + +
    + +Airtable update body + +
    + +Click on the `run` button to run the query. + +:::info +NOTE: Query must be saved before running. +::: + +Example response from Airtable: +```json +{ + "id": "recu9xMnUdr2n2cw8", + "fields": { + "Notes": "Example Notes", + "Name": "change" + }, + "createdTime": "2021-08-08T17:27:17.000Z" +} +``` + +### Deleting a record + +#### Required parameters: +- **Base ID** +- **Table name** +- **Record ID** + +Delete airtable record + + +Click on the `run` button to run the query. + +:::info +NOTE: Query must be saved before running. +::: + +Example response from Airtable: + +```json +{ + deleted: true + id: "recIKsyZgqI4zoqS7" +} +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/data-sources/amazonses.md b/docs/versioned_docs/version-2.4.0/data-sources/amazonses.md new file mode 100644 index 0000000000..3d3d886574 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/amazonses.md @@ -0,0 +1,61 @@ +--- +id: amazonses +title: Amazon SES +--- + +# Amazon SES + +ToolJet can connect to your Amazon SES account to send emails. + +## Connection +To add a new Amazon SES API datasource, click the **Datasource manager** icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select Amazon SES from the modal that pops up. + +ToolJet requires the following to connect to Amazon SES: + +- **Region** +- **Access key** +- **Secret key** + +It is recommended to create a new IAM user for the database so that you can control the access levels of ToolJet. + +Click on the 'Save' button to save the data source. + +
    + +Amazon SES + +
    + +## Supported operations +1. Email service + +### Email service +Required parameters: +- Send email to +- Send email from +- Subject +- Body as text + + +Optional parameters: +- Body as HTML +- CC Addresses +- BCC Addresses + + +:::info +**Send mail to** - accepts an array/list of emails separated by comma. +For example: +`{{["dev@tooljet.io", "admin@tooljet.io"]}}`. + +**Send mail from** - accepts a string. +For example: `admin@tooljet.io` +::: + +:::tip +**Send a single email to multiple recipients** - The `Send mail to` field can contain an array of recipients, which will send a single email with all of the recipients in the field. +::: + +:::info Note +Query should be saved before running. +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/appwrite.md b/docs/versioned_docs/version-2.4.0/data-sources/appwrite.md new file mode 100644 index 0000000000..dc11572625 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/appwrite.md @@ -0,0 +1,160 @@ +--- +id: appwrite +title: Appwrite Database +--- + +# Appwrite Database + +Now build applications on top of your Appwrite database. + +## Connection + +ToolJet connects to your Appwrite app using : +- **Host (API endpoint)** +- **Project ID** +- **Secret key** + +You'll find the Secret key and other credentials on your Appwrite's project settings page. You may need to create a new key if you don't have one already. + +:::info +You should also set the scope for access to a particular resource. Learn more about the **API keys and scopes** [here](https://appwrite.io/docs/keys). +::: + +To connect Appwrite datasource to your ToolJet application, go to the data source manager on the left-sidebar and click on the `+` button. Select Appwrite from the list of available datasources, provide the credentials and click **Save**. It is recommended to check the connection by clicking on 'Test connection' button to verify if the service account can access Appwrite from the ToolJet server. + +
    + +Appwrite intro + +
    + +## Querying Appwrite + +After setting up the Appwrite datasource, you can click on the `+` button of the query manager at the bottom panel of the editor and select the Appwrite data source that you added in the previous step. + +
    + +Appwrite intro + +
    + +After selecting Appwrite datasource, select the operation that you want to perform on the Appwrite database and click **Save** to save the query. + +:::tip +Query results can be transformed using Transformations. Read our **Transformation documentation** [here](/docs/tutorial/transformations) +::: + +## Supported operations + +1. **[List documents](#list-documents)** +2. **[Get document](#get-document)** +3. **[Create document](#create-document)** +4. **[Update document](#update-document)** +5. **[Delete document](#delete-document)** +6. **[Bulk update using document id](#bulk-update-using-document-id)** + +### List documents + +This operation can be used to get a list of all the user documents. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The value for collection ID field should be of `String` type. + +#### Optional parameters: + +- **Limit:** Maximum number of documents to return in the response. By default, it will return a maximum of 25 results. A maximum of 100 results is allowed per request. The Limit value should be of `integer` type. +- **Order fields:** Array of attributes used to sort results. The order field value should be an `array`. +- **Order types:** Array of order directions for sorting attributes. Possible values are DESC for descending order or ASC for ascending order. The order field value should be an `array`. +- **Field, Operator, and Value:** For filtering the results, you can enter a field(attribute) name, use the appropriate operator from the dropdown, and set a value. + +
    + +Appwrite List + +
    + +### Get document + +Use this operation to get a document from a collection by its unique ID. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The value for collection ID should be of `String` type. + +- **Document ID:** Enter the document ID of the document that you want to get. The document ID should be of `String` type. + +
    + +Appwrite get + +
    + +### Add Document to Collection + +Use this operation to create a new document in a collection. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The collection ID should be of `String` type. + +- **Body:** Enter the document data as a JSON object. + +
    + +Appwrite add + +
    + +### Update document + +Use this operation to update a document. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The value for collection ID should be of `String` type. + +- **Document ID:** Enter the document ID of the document that you want to get. The document ID should be of `String` type. + +- **Body:** Enter the document data as a JSON object. + +
    + +Appwrite update + +
    + +### Delete document + +Use this operation for deleting a document in the collection. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The value for collection ID should be of `String` type. + +- **Document ID:** Enter the document ID of the document that you want to get. The document ID should be of `String` type. + +
    + +Appwrite delete + +
    + +### Bulk update using document id + +Use this operation for bulk updating a document in a collection. + +#### Required parameters: + +- **Collection ID:** You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/database#createCollection) or appwrite console. The value for collection ID should be of `String` type. + +- **Key for document ID:** Enter the key or attribute name that can be used to identify each record. + +- **Records:** The array of objects that will contain the data for updating each record in the database +and these objects must contain a key-value pair to point unique record in the database (key for document) + +
    + +Appwrite bulk update + +
    diff --git a/docs/versioned_docs/version-2.4.0/data-sources/athena.md b/docs/versioned_docs/version-2.4.0/data-sources/athena.md new file mode 100644 index 0000000000..4536b35596 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/athena.md @@ -0,0 +1,67 @@ + +# Athena + +ToolJet can connect to Amazon Athena which is an interactive query service that makes it easy to analyze data in Amazon S3 using standard SQL. + +- [Connection](#connection) +- [Querying-athena](#querying-amazon-athena) +- [Basic Operation](#basic-queries) + +## Connection + +ToolJet requires the following to connect to your Athena. + +- **Database** +- **S3 output location** +- **Access key** +- **Secret key** +- **Region** + +:::info +You can also configure for **[additional optional parameters](https://github.com/ghdna/athena-express)**. +::: + + +Athena connection + + +## Querying Amazon Athena + +- Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the datasource. Query manager then can be used to write SQL queries. + + +Athena query + + +- Click on the `run` button to run the query. + +**NOTE:** Query should be saved before running. + +:::tip +**Refer amazon athena docs here for more info:** [link](https://docs.aws.amazon.com/athena/latest/ug/what-is.html) +::: + +### Basic queries + +#### Creating table + + +```sql +CREATE EXTERNAL TABLE student ( + name STRING, + age INT +) LOCATION 's3://athena-express-akiatfa53s-2022/'; +``` + +#### Inserting to table + +```sql +INSERT INTO student +VALUES ('Lansing',1) +``` + +#### Select operation + +```sql +SELECT * from student WHERE AGE=1 +``` diff --git a/docs/versioned_docs/version-2.4.0/data-sources/baserow.md b/docs/versioned_docs/version-2.4.0/data-sources/baserow.md new file mode 100644 index 0000000000..749fa676d9 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/baserow.md @@ -0,0 +1,269 @@ +--- +id: baserow +title: Baserow +--- + +# Baserow + +## Connection + +ToolJet can connect to your Baserow account to read and write data. +Select the hosted version of Baserow or the self-host option. + +For [**self-hosted**](https://baserow.io/docs/index#installation) option, base URL is required to connect. + +Baserow API token is required to create an Baserow data source on ToolJet. You can follow the steps to create API token from [this link](https://baserow.io/api-docs). + + +Baserow intro + + +:::tip +This guide assumes that you have already gone through [Adding a data source](/docs/tutorial/adding-a-datasource) tutorial. +::: + +## Supported queries + +- [List fields](#list-fields) +- [List rows](#list-rows) +- [Get row](#get-row) +- [Create row](#create-row) +- [Update row](#update-row) +- [Move row](#move-row) +- [Delete row](#delete-row) + +### List fields + +This query lists all the fields in a table. + +#### Required parameters: + +- **Table ID** + + +Baserow list fields + + +Example response from Baserow: + +```json +[ + { + "id": 331156, + "table_id": 57209, + "name": "Name", + "order": 0, + "type": "text", + "primary": true, + "text_default": "" + }, + { + "id": 331157, + "table_id": 57209, + "name": "Last name", + "order": 1, + "type": "text", + "primary": false, + "text_default": "" + }, + { + "id": 331158, + "table_id": 57209, + "name": "Notes", + "order": 2, + "type": "long_text", + "primary": false + }, + { + "id": 331159, + "table_id": 57209, + "name": "Active", + "order": 3, + "type": "boolean", + "primary": false + } +] +``` + +### List rows + +This query lists all the rows in a table. + +#### Required parameters: + +- **Table ID** + + +Baserow list + + +Example response from Baserow: + +```json +{ + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 2, + "order": "0.99999999999999999991", + "Name": "Bill", + "Last name": "Gates", + "Notes": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce dignissim, urna eget rutrum sollicitudin, sapien diam interdum nisi, quis malesuada nibh eros a est.", + "Active": false + }, + { + "id": 3, + "order": "0.99999999999999999992", + "Name": "Mark", + "Last name": "Zuckerburg", + "Notes": null, + "Active": true + }, + { + "id": 1, + "order": "0.99999999999999999997", + "Name": "Elon", + "Last name": "Musk", + "Notes": null, + "Active": true + } + ] +} +``` + +### Get row + +#### Required parameters: + +- **Table ID** +- **Row ID** + + +Baserow get + + +Example response from Baserow: + +```json +{ + "id": 1, + "order": "0.99999999999999999997", + "Name": "Elon", + "Last name": "Musk", + "Notes": null, + "Active": true +} +``` + +### Create row + +#### Required parameters: + +- **Table ID** +- **Records** + + +Bserow create + + +#### Example Records: + +```json +{ + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true +} +``` + +Example response from Baserow: + +```json +{ + "id": 19, + "order": "0.99999999999999999996", + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true +} +``` + +### Update row + +#### Required parameters: + +- **Table ID** +- **Row ID** +- **Records** + + +Baserow update + +#### Example Records: + +```json +{ + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true +} +``` + +Example response from Baserow: + +```json +{ + "id": 19, + "order": "0.99999999999999999996", + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true +} +``` + +### Move row + +#### Required parameters: + +- **Table ID** +- **Row ID** + +#### Optional parameters: + +- **Before ID** (The row will be moved before the entered ID. If not provided, then the row will be moved to the end ) + + +Baserow move row + + +Example response from Baserow: + +```json +{ + "id": 3, + "order": "2.00000000000000000000", + "Name": "Mark", + "Last name": "Zuckerburg", + "Notes": null, + "Active": true +} +``` + +### Delete row + +#### Required parameters: + +- **Table ID** +- **Row ID** + + +Baserow delete + + +While deleting a row, the response will be either success or failure from Baserow diff --git a/docs/versioned_docs/version-2.4.0/data-sources/bigquery.md b/docs/versioned_docs/version-2.4.0/data-sources/bigquery.md new file mode 100644 index 0000000000..e3e29b8d4c --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/bigquery.md @@ -0,0 +1,160 @@ +--- +id: bigquery +title: BigQuery +--- + +# BigQuery + +ToolJet can connect to BigQuery databases to run BigQuery queries. + +## Connection + +Please refer [this](https://cloud.google.com/bigquery/docs/bigquery-web-ui) link to enable BigQuery API in Google Cloud Console. + +Create **Service Account** and **key**, then get your configs downloaded as **JSON** + +To add a new BigQuery, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select BigQuery from the modal that pops up. + +ToolJet requires the config json downloaded from your account to connect to BigQuery. Paste the json into the `Private key` field. + +**The json looks like**: + + ```json + { + "type": "service_account", + "project_id": "tooljet-279812", + "private_key_id": "ea6e234sdfsdf3242b91525626edeef74a14e58761", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADAAhdh67sidfnIUWWWBAQC8V+z0vaM/rFiA\nrq8fzVjSpEu7Cietjn82SVtguAlAUP9YpRepzi4rDmRgVQiXe4KES7VGQhmg3hUj\nbBASbdI5WRCvAC2ujzrxv3rbfjYRWfm+OqzpUBWaEKbwSGc6rNkhmirvhjiFdl5k\nn7aK7w3bmQfBlnNM6+WiQdT09g2qx3lmRDoUUpuCngkhbWOs3gN/U6wlm0cHKtbF\nWUOwKdyeZrm3UORUDkFvq6rVSF8vob+FQxf24FuvpBmXi2o2dqqglle8rlm8Lz83\ns4kAVbqVjtGrVXm6QUcnLISqJCJUnFkSuFpo60GCcgAVrwyAq/6aQH3IM78QKzFL\n8q5b65rXAgMBAAECggEAClIF8tRk0VuG3NZH5lg3q8fDOyaLBFdVKcHKtzCec3Ez\no6C4RcxP6Hk5IbPrtgggjVIi/Z7exKRv2mAwFvuSuJJSQSSjXC7Fm87AQPdYFWYt\noFYIeLGPlFMO++H3Nh+Xt3I5NBLR58UmH48iBdgR3pygXi1C5eBvQ2rdNVTL/uxw\n3iULu8WcVBw8glzkdLNLDq94uqbW7/qyji7QWNkU+804sA0LEj4PWmO7B9k1LCLK\nFV0Ppv+SJYMS2MhWmXPHnYVfeNaKJKPQpHsS2ep/hyjEO/3Fvm3o3cp6SrEkNGIH\nGKeozlfV7MQj7tMHLqWddDBXtFwYVEmN0UJVafvGsQKBgQDsEVzb7DG/xlMpuDQv\nqpLGWXR5DdAhzxVJzeh11Ongb+XxBOVSyTDKJLvOX4rI7tDqqN7b2pabUA3ZjvXv\nhMPXr7AjL6yoJEzVCyo1+pi26OL99OcO+7gUDa0axHFt6LZuPw00r+2Nl0FqrXNR\n+qUiPuZpp2MuKjMwLCwhr5YuqwKBgQDMPv6TPMl+oocoQ4uc84uY58Ywb7XZjmhY\n8jXdA38I454EbQGeLja+2knDpDkF6g14cTzVJe/Ec4A6QmeIieTFSJKBV4VCZ3QN\npLR4PrET7o9GL3mtwnNqcHPw2dLNHtn1OgsOUfJMWPIrFK2abVNAmYIBtOGA4eyH\nrOl+NcAUhQKBgC4EKGy6OuxeFYHxZULRZjEB6QFb3vFoM4cieyjU6w4T4ee8g5NC\nop8U0AMnfp8yZkkHyAFlN6xoy3pYMrqQz7gwiA4j0e0ovk1dEspY4gHtnanRXmT+\nTmCiVdb86ft5vG37HnDhxlWuYVMRIoSdbikhx7papauvEDFYuvWKC6VnAoGBAJQr\nvxOhrauozNRw6//YzxUGT8kjwZEqtpiQXnMP7kDMn/4l9l6CuESMp6a+pH+d5FfU\nDoWzF9Y01HlvYxyyrLxSgbZDf/FEi/S54BK7qEsFbftExclAn+o/2lyIKV2VXBmD\nGjIxUM4CWOzX+3lkhlj/BEmop0+Qlr92uY1OASLhAoGAfTb/Le0Nf5bGLjK3hI9D\no/oDI5Ryj5rTMxmG/wRjE+1Jm6BjFzEyH2CvnFonccyHQ+wGn61AgbRFLn+Tg5fz\nZXpzD2Xq3Y/AXtrdaayK0wnpMvVE1bZt+ikeVAWX+gR79igTqSXRgCuyp+edsgcE\nZ+2Eser4Z5BpqfFjqFW8MhY=\n-----END PRIVATE KEY-----\n", + "client_email": "tooljettest@tooljet-279812.iam.gserviceaccount.com", + "client_id": "106795637455432158803", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/tooljettest%40tooljet-279812.iam.gserviceaccount.com" +} +``` + +
    + +BQ create + +
    + +Click on **Test connection** button to verify if the credentials are correct and that the API is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying BigQuery + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. Select the operation that you want to perform and click **Save** to create the query. + + +BQ query + + +Click on the **run** button to run the query. NOTE: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: + +## Supported operations + +- [List Datasets](#list-datatsets) + +- [List Tables](#list-tables) + +- [Query](#query) + +- [Insert Record ](#insert-record) + +- [Delete Record ](#delete-record) + +- [Update Record](#update-record) + + +- [Create View](#create-view) + + +- [Create Table](#create-table) + + +- [Delete Table](#create-table) + + + +### List Datasets + +Returns list of datasets. + +#### Optional parameters: + +- **Options:** This can be used to filter the list. + + +BQ list datasets + +### List Tables + +Return list of tables within a dataset + +#### Required parameters: + +- **Dataset:** Enter the dataset name. + + +BQ list tables + + +### Query + +Return data based on the `Query`. `Query options` ([Reference](https://cloud.google.com/bigquery/docs/reference/rest/v2/Job)), and `Query result options` ([Reference](https://cloud.google.com/nodejs/docs/reference/bigquery/latest/overview#_google_cloud_bigquery_QueryResultsOptions_type)). + + + +BQ query + +### Insert Record +- To insert a record. + + +BQ insert + + +### Delete Record +- To delete a record. + + +BQ delete + + +:::info +NOTE: Be careful when deleting records in a table. If you omit the WHERE clause, all records in the table will be deleted! +::: +### Update Record +- To update a record. + + +BQ update + + +:::info +NOTE: Be careful when deleting records in a table. If you omit the WHERE clause, all records in the table will be updated! +::: +### Create View + +- To create a view. + + +BQ create view + + + +### Create Table + +- To create a table. + +:::info +NOTE: visit -https://github.com/googleapis/nodejs-bigquery/blob/main/samples/createTable.js for more info on schema. +::: + +### Delete Table +- To delete a table. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/data-sources/clickhouse.md b/docs/versioned_docs/version-2.4.0/data-sources/clickhouse.md new file mode 100644 index 0000000000..bb55b4a069 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/clickhouse.md @@ -0,0 +1,211 @@ +--- +id: clickhouse +title: ClickHouse +--- + +# ClickHouse + +ToolJet can connect to the ClickHouse to read and write data. + +:::info +ToolJet uses this [NodeJS](https://github.com/TimonKK/clickhouse) client for ClickHouse. +::: + +## Connection + +To add a new ClickHouse datasource, Go to the **Datasource Manager** on the left sidebar of the app editor and click on `Add datasource` button. Select **ClickHouse** from the modal that pops up. + +ToolJet requires the following to connect to your ClickHouse Database: + +- **Username** +- **Password** +- **Host** +- **Port** +- **Database Name** +- **Protocol** +- **Use Post** +- **Trim Query** +- **Use Gzip** +- **Debug** +- **Raw** + +ClickHouse connection + +## Querying ClickHouse + +After setting up the ClickHouse datasource, you can click on the `+` button of the query manager and select the ClickHouse datasource that you added in the previous step to create a new query. + +:::info +For more details on clickhouse visit [Clickhouse docs](https://clickhouse.com/docs/en/quick-start). +::: + + +## Supported Operations: + +- [SQL Query](#sql-query) +- [Insert array of objects](#supported-operations) + +### SQL Query + +Use this to operation to enter **[ClickHouse SQL Statements](https://clickhouse.com/docs/en/sql-reference/statements/)**. These statements represent various kinds of action you can perform using SQL queries. + +#### Example SQL queries + +- **SELECT**: + + ```sql + SELECT * from test array; + ``` + +
    + + ClickHouse SQL Statement operation + +
    + +- **CREATE**: + + ```sql + CREATE TABLE test array3 ( + date Date, + str String, + arr Array(String), + arr2 Array (Date) + arr3 Array(UInt32) , + id1 UUID + )ENGINE=MergeTree () ORDER BY(str) + ``` + +
    + + ClickHouse SQL Statement operation + +
    + +- **ALTER TABLE**(add column) + + ```sql + ALTER TABLE test array1 ADD COLUMN Added2 UInt32; + ``` + +
    + + ClickHouse SQL Statement operation + +
    + +- **SELECT WITH WHERE CLAUSE** + ```sql + SELECT * FROM test array1 WHERE str='Somethingl...' + ``` + +
    + + ClickHouse SQL Statement operation + +
    + +- **UPDATE** + ```sql + ALTER TABLE test_array1 UPDATE arr = (12] WHERE str='Somethingl...' + ``` + +
    + + ClickHouse SQL Statement operation + +
    + +- **DELETE** + ```sql + ALTER TABLE test_array1 DELETE WHERE str= 'Somethingl...' + ``` + +
    + + ClickHouse SQL Statement operation + +
    + +- **NORMAL INSERT** + + 1) Step 1 - Creating Table + + ```sql + CREATE TABLE test array4 ( + name String, + date Date + )ENGINE=MergeTree () ORDER BY (name) + ``` + +
    + + ClickHouse SQL Statement operation + +
    + + 2) Step 2 - Insert + + ```sql + INSERT INTO test_array4 (*) VALUES ('juvane', '1996-01-13') + ``` + +
    + + ClickHouse SQL Statement operation + +
    + + :::info + **Giving Primary Key** + ``` + CREATE TABLE db.table_name + ( + name1 type1, name2 type2, ..., + PRIMARY KEY(expr1[, expr2,...])] + ) + ENGINE = engine; + + OR + + CREATE TABLE db.table_name + ( + name1 type1, name2 type2, ... + ) + ENGINE = engine + PRIMARY KEY(expr1[, expr2,...]); + ``` + ::: + +### Insert array of objects + +Use this operation for inserting array of objects. + +#### Required Parameters: +- **Body** +- **Fields** +- **Table name** + +**Example Body value:** +```javascript +[ + { + date: '2018-01-01', + str: 'Something1...', + arr: [], + arr2: ['1985-01-02', '1985-01-03'], + arr3: [1,2,3,4,5], + id1: '102a05cb-8aaf-4f11-a442-20c3558e4384' + }, + { + date: '2018-02-01', + str: 'Something2...', + arr: ['5670000000', 'Something3...'], + arr2: ['1985-02-02'], + arr3: [], + id1: 'c2103985-9a1e-4f4a-b288-b292b5209de1' + } + ]; +``` + +ClickHouse Insert array of objects operation diff --git a/docs/versioned_docs/version-2.4.0/data-sources/cosmosdb.md b/docs/versioned_docs/version-2.4.0/data-sources/cosmosdb.md new file mode 100644 index 0000000000..a924932750 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/cosmosdb.md @@ -0,0 +1,91 @@ +--- +id: cosmosdb +title: CosmosDB +--- +# Cosmosdb + +ToolJet can connect to CosmosDB databases to read and write data. + + +## Connection + +To add a new **[Azure Cosmos DB](https://docs.microsoft.com/en-us/javascript/api/overview/azure/cosmos-readme?view=azure-node-latest#key-concepts)**, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select CosmosDB from the modal that pops up. + +ToolJet requires the following to connect to your Cosmos DB. + +- **Cosmos DB Account End point** +- **Cosmos DB Account Key** + +:::info +**Azure Cosmos DB End point** is the URL of the Cosmos DB service. +**Azure Cosmos DB Key** is the key that is used to access the Cosmos DB service. +You can find the endpoint and key in the **[Azure Portal](https://portal.azure.com/)**. +::: + +
    + +![ToolJet - Data source - CosmosDB](/img/datasource-reference/cosmosdb/cosmosdb-connect.png) + +
    + + +## Supported queries: + +- [Listing databases](#listing-databases) +- [Listing containers](#listing-containers) +- [Inserting item(s)](#inserting-items) +- [Retrieving an item](#retrieving-an-item) +- [Deleting an item](#deleting-an-item) +- [Querying documents](#querying-documents) + + + + + +### Listing databases +This query lists all the databases in a Cosmos DB. + +### Listing containers +This query lists all the containers of a database in a Cosmos DB. + +| Fields | description | +| ----------- | ----------- | +| database | id of the database | + +### Inserting item(s) +This query inserts one or more items in a container of a database in a Cosmos DB. + +| Fields | description | +| ----------- | ----------- | +| database | id of the database | +| container | id of the container | +| items | items to be inserted. Example: `{{[{name: "one", val: 1}, {name:"two", val: 2}]}}` | + +### Retrieving an item +To read a single item from a container of a database in a Cosmos DB, use the following query. + +| Fields | description | +| ----------- | ----------- | +| database | id of the database | +| container | id of the container | +| item | id of the item | + + +### Deleting an item +To delete an item from a container of a database in a Cosmos DB, use the following query. + +| Fields | description | +| ----------- | ----------- | +| database | id of the database | +| container | id of the container | +| item | id of the item | + + +### Querying documents +To query documents from a container of a database in a Cosmos DB using SQL-like syntax, use the following query. + +| Fields | description | +| ----------- | ----------- | +| database | id of the database | +| container | id of the container | +| query | query to be executed. Example: `SELECT * FROM c WHERE c.age > 20 AND c.age <= 30` | diff --git a/docs/versioned_docs/version-2.4.0/data-sources/couchdb.md b/docs/versioned_docs/version-2.4.0/data-sources/couchdb.md new file mode 100644 index 0000000000..385ed788ad --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/couchdb.md @@ -0,0 +1,311 @@ +--- +id: couchdb +title: CouchDB +--- + +# CouchDB + +ToolJet can connect to CouchDB databases to read and write data. CocuhDB uses basic auth for authentication , username and password for the database is required to create an CouchDB data source on ToolJet. For more info visit [CouchDB docs](https://docs.couchdb.org/en/stable/). + + +Couch auth + + +## Supported queries: + +- [Listing records](#listing-records) +- [Retrieving a record](#retrieving-a-record) +- [Creating a record](#creating-a-record) +- [Updating a record](#updating-a-record) +- [Deleting a record](#deleting-a-record) +- [Find](#find) +- [Retrieving a view](#retrieving-a-view) + +:::info +NOTE: Record ID is same as document ID("_id") . +::: +### Listing records + +This query lists all the records in a database. + +#### Optional parameters: + +- **Include docs** +- **Descending order** +- **Limit** +- **Skip** + +:::info +descending (boolean) – Return the documents in descending order by key. Default is false. + +limit (number) – Limit the number of the returned documents to the specified number. + +skip (number) – Skip this number of records before starting to return the results. Default is 0. + +include_docs (boolean) – include_docs key is set to false by default , if true it returns the document data along with the default fields. + +::: + + +Couch listing + + + +Example response from CouchDb: + +```json +{ + "total_rows": 3, + "offset": 0, + "rows": [ + { + "id": "23212104e60a71edb42ebc509f000dc2", + "key": "23212104e60a71edb42ebc509f000dc2", + "value": { + "rev": "1-0cc7f48876f15883394e5c139c628123" + } + }, + { + "id": "23212104e60a71edb42ebc509f00216e", + "key": "23212104e60a71edb42ebc509f00216e", + "value": { + "rev": "1-b3c45696b10cb08221a335ff7cbd8b7a" + } + }, + { + "id": "23212104e60a71edb42ebc509f00282a", + "key": "23212104e60a71edb42ebc509f00282a", + "value": { + "rev": "1-da5732beb913ecbded309321cac892d2" + } + }, + ] +} +``` + +### Retrieving a record + +#### Required parameters: + +- **Record ID** + + +Couch retrieve view + + + +Example response from CouchDb: + +```json +{ + "_id": "e33dc4e209689cb0400d095fc401a1e0", + "_rev": "1-a62af8e14451af88c150e7e718b7a0e8", + "0": { + "name": "test data" + } +} +``` +The returned JSON is the JSON of the document, including the document ID and revision number: + + +### Creating a record + + +Couch create view + + +#### Example Records: + +```json + [{"name":"tooljet"}] +``` + +Click on the `run` button to run the query. + +:::info +NOTE: Query must be saved before running. +::: + +Example response from CouchDb: +```json + + { + "ok": true, + "id": "23212104e60a71edb42ebc509f0049a2", + "rev": "1-b0a625abc4e21ee554737920156e911f" +} + +``` + +### Updating a record + +You can get the revision id value, by sending a GET request to get the document details. +You get the document as JSON in the response. For each update to the document, the revision field "_rev" gets changed. + +#### Required parameters: +- **Revision ID** +- **Record ID** + + +Couch update view + + +#### Example body: + +```json + [{"name":"tooljet"}] +``` + + +Click on the `run` button to run the query. + +:::info +NOTE: Query must be saved before running. +::: + +Example response from CouchDb: +```json +{ + "ok": true, + "id": "23212104e60a71edb42ebc509f0049a2", + "rev": "2-b0a625abc4e21ee554737920156e911f" +} +``` + +### Deleting a record + +#### Required parameters: +- **Revision ID** +- **Record ID** + + +Couch delete view + + + +Click on the `run` button to run the query. + + +Example response from CouchDb: + +```json +{ + "ok": true, + "id": "rev_id=2-3d01e0e87139c57e9bd083e48ecde13d&record_id=e33dc4e209689cb0400d095fc401a1e0", + "rev": "1-2b99ef28c03e68ea70bb668ee55ffb7b" +} +``` + +### Find + +Find documents using a declarative JSON querying syntax. + +#### Required parameters: +- **Selector** + +:::info +NOTE: +selector syntax: https://pouchdb.com/guides/mango-queries.html +::: + + +Couch find + + +#### Example body: + +```json +{ + "selector": { + "year": {"$gte": 2015} + }, + "fields": ["year"] +} +``` + + +Click on the `run` button to run the query. + +:::info +NOTE: +selector (json) – JSON object describing criteria used to select documents. + +More information : https://docs.couchdb.org/en/stable/api/database/find.html +::: + +Example response from CouchDb: + + +Couch find response + + +### Retrieving a view + +Views are the primary tool used for querying and reporting on CouchDB documents. + +#### Required parameters: +- **View url** + +Reference for view :https://docs.couchdb.org/en/3.2.0/ddocs/views/intro.html#what-is-a-view + + +Couch get view + + +#### Optional parameters: + +- **Start key** +- **End key** +- **Limit** +- **Skip** + +Click on the `run` button to run the query. + +:::info +startkey (json) – Return records starting with the specified key. + +endkey (json) – Stop returning records when the specified key is reached. + +limit (number) – Limit the number of the returned documents to the specified number. + +skip (number) – Skip this number of records before starting to return the results. Default is 0. +::: + +Example response from CouchDb: +```json +{ + "total_rows": 4, + "offset": 0, + "rows": [ + { + "id": "23212104e60a71edb42ebc509f000dc2", + "key": "23212104e60a71edb42ebc509f000dc2", + "value": { + "rev": "1-0cc7f48876f15883394e5c139c628123" + } + }, + { + "id": "23212104e60a71edb42ebc509f00216e", + "key": "23212104e60a71edb42ebc509f00216e", + "value": { + "rev": "1-b3c45696b10cb08221a335ff7cbd8b7a" + } + }, + { + "id": "23212104e60a71edb42ebc509f00282a", + "key": "23212104e60a71edb42ebc509f00282a", + "value": { + "rev": "1-da5732beb913ecbded309321cac892d2" + } + }, + { + "id": "23212104e60a71edb42ebc509f002cbd", + "key": "23212104e60a71edb42ebc509f002cbd", + "value": { + "rev": "1-ca5bb3c0767eb42ea6c33eee3d395b59" + } + + } + ] +} +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/data-sources/custom-js.md b/docs/versioned_docs/version-2.4.0/data-sources/custom-js.md new file mode 100644 index 0000000000..694d2cbbe3 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/custom-js.md @@ -0,0 +1,56 @@ +--- +id: run-js +title: Run JavaScript code +--- + +# Run JavaScript code + +You can write custom JavaScript code to interact with components and queries. To do that, you just need to create a new query and select **Run JavaScript Code** from the data sources dropdown. + +
    + +Run JavaScript code + +
    + +#### Example: Displaying random number + +- Let's drag a **button** and a **text** widget inside a container widget. +- Click on the `+` on the query panel to create a query and select **Run JavaScript code** from the available datasources +- Write the code in **JavaScript editor** and save the query: +```jsx +const a = Math.floor(Math.random() * (10 - 1)) + 1; +return a; +``` +:::tip +- The `return` statement is used to end the code and the value specified to the `return` statement will be stored in the `data` property of the query. +ex: `{{queries.runjs1.data}}` +- You cannot use `console.log` in Run JavaScript code +::: + +- Let's edit the properties of widgets: + - Add an event handler to the button - Select **On Click** event, **Run Query** action, and select the `runjs1` query that we created. This will run the JavaScript code every time the button is clicked. + - Edit the property of text widget - In the text field enter **Random number: `{{queries.runjs1.data}}`**. It will display the output as Random number: *result from JS code* + + +
    + +Run JavaScript code + +
    + +You can also write custom JavaScript code to get the data from **External APIs** and manipulate the response for graphical representation. Here's the [tutorial](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/) on how we used custom JavaScript code to build an app using GitHub API. + +### Libraries + +ToolJet allows you to internally utilize these libraries: + +| Name | Documentation | +| ----------- | ----------- | +| Moment | [https://momentjs.com/docs/](https://momentjs.com/docs/) | +| Lodash | [https://lodash.com/docs/](https://lodash.com/docs/) | +| Axios | [https://axios-http.com/docs/intro](https://axios-http.com/docs/intro) | + +:::info +Issues with writing custom JavaScript code? Ask in our [Slack Community](https://tooljet.com/slack). +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/data-sources/dynamodb.md b/docs/versioned_docs/version-2.4.0/data-sources/dynamodb.md new file mode 100644 index 0000000000..76c0713505 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/dynamodb.md @@ -0,0 +1,38 @@ +--- +id: dynamodb +title: DynamoDB +--- + +# DynamoDB + +ToolJet can connect to DynamoDB to read and write data. + +## Connection + +To add a new DynamoDB, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select DynamoDB from the modal that pops up. + +ToolJet requires the following to connect to your DynamoDB. + +- **Region** +- **Access key** +- **Secret key** + +It is recommended to create a new IAM user for the database so that you can control the access levels of ToolJet. + +ToolJet - Dynamo connection + + +Click on 'Test connection' button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on 'Save' button to save the data source. + +## Querying DynamoDB + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. Select the operation that you want to perform and click 'Save' to save the query. + +ToolJet - Dynamo query + + +Click on the 'run' button to run the query. NOTE: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/elasticsearch.md b/docs/versioned_docs/version-2.4.0/data-sources/elasticsearch.md new file mode 100644 index 0000000000..3f06fc7b3d --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/elasticsearch.md @@ -0,0 +1,80 @@ +--- +id: elasticsearch +title: Elasticsearch +--- + +# Elasticsearch +ToolJet can connect to your Elasticsearch cluster to read and write data. + +## Connection +Please make sure the host/IP of the Elasticsearch cluster is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist our IP**. + +To add a new Elasticsearch database, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select Elasticsearch from the modal that pops up. + +ToolJet requires the following to connect to your Elasticsearch cluster: +- **Host** +- **Port** +- **Username** +- **Password** + +
    + +Elastic connect + + +
    + +Elastic search datasource is also providing an option for connecting services with ssl certificates. +- You can either use CA / Client certificates option. + +Elastic ssl + + + +## Querying Elasticsearch + +Click on `+` button of the query manager at the bottom panel of the editor and select the Elasticsearch added in the previous step as the data source. +Select the operation that you want to perform on your Elasticsearch cluster and click `Create` to save the query. + +
    + +Elastic query + + +
    + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +## Supported operations + +#### Search + +This operation allows you to execute a search query and get back search hits that match the query. Read the Elasticsearch's `Search` guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html)**. + + +Elastic search + +#### Index a document + +This operation allows you to add a JSON document to the specified data stream or index. Read the Elasticsearch's `Index` guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html)**. + + +Elastic index + + +#### Get a document + +This operation allows you to retrieve the specified JSON document from the index. Read the Elasticsearch's `Get` guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html)**. + + +Elastic get + + +#### Update a document + +This operation allows to update a document using the specified script. Read the Elasticsearch's `Update` guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html)**. + + +Elastic update diff --git a/docs/versioned_docs/version-2.4.0/data-sources/firestore.md b/docs/versioned_docs/version-2.4.0/data-sources/firestore.md new file mode 100644 index 0000000000..c0375c29c6 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/firestore.md @@ -0,0 +1,163 @@ +--- +id: firestore +title: Cloud Firestore +--- + +# Cloud Firestore + +## Connection +ToolJet connects to your Cloud Firestore using JSON key of your GCP service account. +To generate a new key, check out [Firestore's official documentation](https://cloud.google.com/iam/docs/creating-managing-service-account-keys#iam-service-account-keys-create-console). + +Once the key is downloaded, click on `+` button of data sources panel at the left-bottom corner of the app editor. Select Firestore from the modal that pops up. Paste the key in the field for GCP key. Click on **Test connection** button to verify if the service account can access Firestore from ToolJet server. Click on **Save** button to save the datasource. + + +firestore add ds + + +## Querying Firestore + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. + + +firestore QUERY + + +Select the operation that you want to perform on Firestore and click **Save** to save the query. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +## Supported operations +1. [Get document](#get-document) +2. [Query collection](#query-collection) +3. [Add Document to Collection](#add-document-to-collection) +4. [Update document](#update-document) +5. [Set document](#set-document) +6. [Bulk update using document id](#bulk-update-using-document-id) +7. [Delete document](#delete-document) + +### Get document + +Use this operation to get the data in a document. + +#### Required parameters: + +- **Path**: Enter the path of the document. Path format: `collection name/document id`. ex: `books/23e2wsds32` + + +firestore get + + +### Query collection + +Use this operation to query all the documents in a collection. Check firestore doc [here](https://firebase.google.com/docs/reference/js/v8/firebase.database.Query). + +#### Required parameters: + +- **Path**: Enter the name of the collection to be queried. Example: `books` + +#### Optional parameters: + +- **Order type**: Select ascending or descending from the dropdown. + +- **Limit**: Maximum number of documents to return in response. By default will return maximum 25 results. Maximum of 100 results allowed per request. The Limit value should be of integer type. + +- **Field, Operator, and Value**: For filtering the results, you can enter a document field name, use appropriate operator from the dropdown and set a value. + + +firestore collection + + +### Add Document to Collection + +Use this operation for creating a new document in a collection. + +#### Required parameters: + +- **Collection**: Enter the path of the document in a collection. Path format: `collection name/document id`. ex: `books/33243dwe2332` +- **Body**: Enter the Field names and their values in json form. example body: +```json +{ +"Author": "Shubh", +"id": 5 +} +``` + + +firestore document + + +### Update document + +Use this operation for updating the existing document in a collection. Also, it only updates fields if they exist, but doesn't replace an entire object like [set operation](#set-document). + +#### Required parameters: + +- **Path**: Enter the path of the document in a collection. Path format: `collection name/document id`. ex: `books/33243dwe2332` +- **Body**: Enter the Field names and their values in json form. example body: +```json +{ +"Author": "Shubhendra", +"id": 3 +} +``` + + +firestore update + + +### Set document + +This operation replaces your chosen object with the value that you provide. So if your object has 5 fields, and you use Set operation and pass object with 3 fields, it will now have 3 fields. + +#### Required parameters: + +- **Path**: Enter the path of the document in a collection. Path format: `collection name/document id`. ex: `books/33243dwe2332` +- **Body**: Enter the Field names and their values in json form. example body: +```json +{ +"Author": "Shefewfbh", +"id": 9 +} +``` + + +firestore set + + +### Bulk update using document id + +Use this operation for bulk updating documents. + +#### Required parameters: + +- **Collection**: +- **Key for document ID**: +- **Records**: + + + +firestore bulk + + +### Delete document + +Use this operation for deleting a document in a collection. + +#### Required parameters: + +- **Path**: Enter the path of the document to be deleted in a collection. Path format: `collection name/document id`. ex: `books/33243dwe2332` + + +firestore delete + + +## Transforming firestore query result for Table widget + +The Firestore query result is in the form of object so we’ll need to transform it into array. + +```js +return data = Array(data) +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/data-sources/gcs.md b/docs/versioned_docs/version-2.4.0/data-sources/gcs.md new file mode 100644 index 0000000000..6483a43408 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/gcs.md @@ -0,0 +1,41 @@ +--- +id: gcs +title: Google Cloud Storage +--- + +# Google Cloud Storage + +ToolJet can connect to GCS buckets and perform various operation on them. + +## Supported operations + +-**Read file** +-**Upload file** +-**List buckets** +-**List files in a bucket** +-**Signed url for download** +-**Signed url for upload** + +## Connection + +To add a new GCS source, click on the **Add or edit datasource** icon on the left sidebar of the app editor and click on `Add datasource` button. Select GCS from the modal that pops up. + +ToolJet requires the **json private key** of a service account to be able to connect to GCS. +You can follow the [google documentation](https://cloud.google.com/docs/authentication/getting-started) to get started. + +gcs connection + +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying GCS + +Click on `+` button of the **query manager** at the bottom panel of the editor and select the data source added in the previous step as the data source. Select the operation that you want to perform and click **Save** to save the query. + +gcs query + +Click on the **run** button to run the query. +**NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/google.sheets.md b/docs/versioned_docs/version-2.4.0/data-sources/google.sheets.md new file mode 100644 index 0000000000..2f8edae304 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/google.sheets.md @@ -0,0 +1,112 @@ +--- +id: google.sheets +title: Google Sheets +--- + +# Google Sheets + +ToolJet can connect to Google Sheet using OAuth 2.0, which helps us to limit an application's access to a user's account. + +## How to integrate Google Sheets + + + +## Self-Hosted Configuration + +If you are self-hosting the application, you will need to perform some additional steps. + + 1. Follow the [Google OAuth 2.0 setup steps outlined here](/docs/setup/env-vars#google-oauth--optional-) + 2. Set the following environment variables with the values from the previous step: + * `GOOGLE_CLIENT_ID` + * `GOOGLE_CLIENT_SECRET` + * `TOOLJET_HOST` + 3. Enable the Google Sheets API in the GCP console + +## Authorization Scopes + +You can create a Google Sheets data source with one of either of the two permission scopes : + 1. **Read Only** + 2. **Read and Write** + + +google sheets + + +## Operations + +Using Google sheets data source you can perform several operations from your applications like: + + 1. **[Read data from a sheet](/docs/data-sources/google.sheets#read-data-from-a-sheet)** + 2. **[Append data to a sheet](/docs/data-sources/google.sheets#append-data-to-a-sheet)** + 3. **[Update single row of a sheet](/docs/data-sources/google.sheets#update-single-row-of-a-sheet)** + 4. **[Delete row from a sheet](/docs/data-sources/google.sheets#delete-row-from-a-sheet)** + 5. **[Get spreadsheet info](/docs/data-sources/google.sheets#get-spreadsheet-info)** + +### Read data from a sheet + +This operation returns the table data from the spreadsheet in the form of json object. + +| Fields | description | +| ----------- | ----------- | +| Spreadsheet ID | It is mandatory to enter the spreadsheet-id. The spreadsheet-id can be found in the URL of the spreadsheet. Example URL: https://docs.google.com/spreadsheets/d/1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM/edit#gid=0 - in this URL, the `1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM` is the spreadsheet-id. | +| Range | This is optional. You can specify the range of cells in this field. If left empty, it will select the range `A1:Z500`. | +| Sheet | This is optional. You can specify `sheet name` if it has more than 1 sheets, else it will automatically choose the first sheet. | + + + +google sheets read + + +### Append data to a sheet + +You can add more rows to the table using the append operation. + +| Fields | description | +| ----------- | ----------- | +| Spreadsheet ID | It is mandatory to enter the spreadsheet-id. The spreadsheet-id can be found in the URL of the spreadsheet. Example URL: https://docs.google.com/spreadsheets/d/1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM/edit#gid=0 - in this URL, the `1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM` is the spreadsheet-id. | +| Sheet | This is optional. You can specify `sheet name` if it has more than 1 sheets, else it will automatically choose the first sheet. | +| Rows | Enter the row data in the json array form. Each object in an array will represent a single row. Example: `[ {"name":"John", "email":"John@tooljet.com"},{...},{...} ]` In each object, the `key` represents the **column name** and the `value` represents the **cell data**. | + + +google sheets append + + +### Update single row of a sheet + +You can update the existing data in sheet using this operation. + +| Fields | description | +| ----------- | ----------- | +| Spreadsheet ID | It is mandatory to enter the spreadsheet-id. The spreadsheet-id can be found in the URL of the spreadsheet. Example URL: https://docs.google.com/spreadsheets/d/1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM/edit#gid=0 - in this URL, the `1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM` is the spreadsheet-id. | +| Where | Enter the column name such as `id` for choosing a row. | +| Operator | Choose the `===` operator to check the equality. | +| Value | Enter the any `id` number/name that you want to update. | +| Rows | Enter the row data. Example: `{{({id: components.textinput4.value, company: components.textinput1.value, position: components.textinput2.value, url: components.textinput3.value, 'date-applied': components.datepicker1.value, status: components.dropdown1.value})}}` | + + +google sheets update + + +### Delete row from a sheet + +Use this operation delete a specific row from the sheet. + +| Fields | description | +| ----------- | ----------- | +| Spreadsheet ID | It is mandatory to enter the spreadsheet-id. The spreadsheet-id can be found in the URL of the spreadsheet. Example URL: https://docs.google.com/spreadsheets/d/1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM/edit#gid=0 - in this URL, the `1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM` is the spreadsheet-id. | +| GID | You'll find the GID in the end of the URL of spreadsheet. In the example mentioned above, the GID is 0 | +| Delete row number | Just enter the row number that you want to delete. | + + + +google sheets delete + + +### Get spreadsheet info + +This operation can be used to get some basic information of the spreadsheet such as the number of sheets, theme, time-zone, format, and url etc. + +Here is the `Preview` of the query that used the get spreadsheet info operation. + + +google sheets get info diff --git a/docs/versioned_docs/version-2.4.0/data-sources/graphql.md b/docs/versioned_docs/version-2.4.0/data-sources/graphql.md new file mode 100644 index 0000000000..3a27f73970 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/graphql.md @@ -0,0 +1,55 @@ +--- +id: graphql +title: GraphQL +--- + +# GraphQL + +ToolJet can connect to GraphQL endpoints to execute queries and mutations. + +## Connection + +To add a new GraphQL datasource, click the `+` button on data sources panel at the bottom-left corner of the app builder and then select GraphQL from the modal that pops up. + +ToolJet requires the following to connect to a GraphQL datasource: + +- **URL of the GraphQL endpoint** + +The following optional parameters are also supported: + + | Type | Description | + | ----------- | ----------- | + | URL params | Additional query string parameters| + | headers | Any headers the GraphQL source requires| + +
    + +ToolJet - Data source - GraphQl + +
    + +Click on the **Save** button to save the data source. + +## Querying GraphQL + +Click on `+` button of the query manager at the bottom panel of the editor and select the GraphQL endpoint added in the previous step as the data source. + +### Required Parameters: +- **Query** + +### Optional Parameters +- **Variable** +- **Headers** + +
    + +ToolJet - Data source - GraphQl + +
    + + +Click on the 'Create' button to create the query or Click on the `Run` button to create and trigger the query. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/influxdb.md b/docs/versioned_docs/version-2.4.0/data-sources/influxdb.md new file mode 100644 index 0000000000..27f881e957 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/influxdb.md @@ -0,0 +1,129 @@ +--- +id: influxdb +title: InfluxDB +--- + +# InfluxDB + +ToolJet can connect to InfluxDB databases to read and write data. Use the Token authentication scheme to authenticate to the InfluxDB API. For more info visit [InfluxDB docs](https://docs.influxdata.com/). + +## Connection + +ToolJet connects to InfluxDB using : + +- **API Token** +- **Host** +- **Port** +- **Protocol** (HTTP/HTTPS) + +:::info +For generating API Token visit [InfluxDB docs](https://docs.influxdata.com/influxdb/cloud/security/tokens/create-token/). +::: + +
    + +![ToolJet - Data source - influxDB](/img/datasource-reference/influxdb/influxauth.png) + +
    + +## Supported queries: + +- [Write data](#write-data) + +- [Query data](#query-data) + +- [Generate an Abstract Syntax Tree (AST) from a query](#generate-an-abstract-syntax-tree-ast-from-a-query) + +- [Retrieve query suggestions](#retrieve-query-suggestions) + +- [Retrieve query suggestions for a branching suggestion](#retrieve-query-suggestions-for-a-branching-suggestion) + +- [Analyze a Flux query](#analyze-a-flux-query) + +- [List buckets](#list-buckets) + +- [Create a bucket](#create-a-bucket) + +- [Retrieve a bucket](#retrieve-a-bucket) + +- [Update a bucket](#update-a-bucket) + +- [Delete a bucket](#delete-a-bucket) + + +influx operations + + +### Write data + +This operation writes data to a bucket. + +#### Required parameters: + +- **Bucket** +- **Organization name or ID** + +#### Optional parameters: + +- **Precision** + +### Query data + +Retrieves data from InfluxDB buckets. + +#### Required parameters: +- **Organization name or ID** + +### Generate an Abstract Syntax Tree (AST) from a query + +This operation analyzes flux query and generates a query specification. + +#### Required parameters: + +- **Query** + +### Retrieve query suggestions + +This query retrieve query suggestions. + +### Retrieve query suggestions for a branching suggestion + +This operation retrieve query suggestions for a branching suggestion. + +#### Required parameters: +- **Name** + +### Analyze a Flux query + +This Analyzes a Flux query. + +#### Required parameters: + +- **Query** + +### List buckets + +This operation lists all the buckets in a database. +### Create a bucket + +#### Required parameters: + +- **Query** + +### Retrieve a bucket + +This operation retrieve a bucket in a database. + +#### Required parameters: +- **Bucket ID** + +### Update a bucket + +#### Required parameters: +- **Bucket ID** +- **Query** + +### Delete a bucket + +#### Required parameters: +- **Bucket ID** diff --git a/docs/versioned_docs/version-2.4.0/data-sources/mailgun.md b/docs/versioned_docs/version-2.4.0/data-sources/mailgun.md new file mode 100644 index 0000000000..6b4c71ca78 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/mailgun.md @@ -0,0 +1,64 @@ +--- +id: mailgun +title: Mailgun +--- + +# Mailgun + +ToolJet can connect to your Mailgun account to send emails. + +ToolJet - Data source - Mailgun + +:::info +The Mailgun API Datasource supports for interaction with the mail endpoint of the [Mailgun API](https://documentation.mailgun.com/en/latest/api-intro.html#authentication-1). +::: + +## Connection + +To add a new Mailgun API datasource, click the **Datasource manager** icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select Mailgun API from the modal that pops up. + +Enter your **Mailgun API key** in the "API key" field. + +:::tip +Mailgun API key is required to create an Mailgun datasource on ToolJet. You can generate API key by visiting [Mailgun account page](https://app.mailgun.com/app/account/security/api_keys). +::: + +Click on the 'Save' button to save the data source. + +## Supported operations + +1. Email service + +### Email service + +Required parameters: + +- Send email to +- Send email from +- Subject +- Body as text + +Optional parameters: + +- Body as HTML + +ToolJet - Query Mailgun + +:::info +**Send mail to** - accepts a single email id. +For example: +`{{"dev@tooljet.io"}}`. + +**Send mail from** - accepts a string. +For example: `admin@tooljet.io` +::: + +:::tip +**Send a single email to multiple recipients** - The `Send mail to` field can contain an array of recipients, which will send a single email with all of the recipients in the field. + +**Send multiple individual emails to multiple recipients** - set Multiple recipients field to `{{true}}` and the `Send mail to` field will be split into multiple emails and send to each recipient. +::: + +:::note +NOTE: Query should be saved before running. +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/mariadb.md b/docs/versioned_docs/version-2.4.0/data-sources/mariadb.md new file mode 100644 index 0000000000..ccdb027651 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/mariadb.md @@ -0,0 +1,49 @@ +--- +id: mariadb +title: MariaDB +--- + +# MariaDB + +ToolJet can connect to MariaDB to read and write data. + +## Connection + +To add a new MariaDB data source, click on the `+` button on datasources panel at the left sidebar of the app builder. Select MariaDB from the modal that pops up. + +ToolJet requires the following to connect to your DynamoDB. + +- **Host** +- **Username** +- **Password** +- **Connection Limit** +- **Port** +- **Database** +- **SSL** +- **SSL Certificate** + +
    + +MariaDB + +
    + +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying MariaDB + +Click on `+` button of the query manager at the bottom panel of the builder and select the MariaDB datasource added in the previous step. + +
    + +MariaDB query + +
    + +Click on the **run** button to run the query. + +**NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/minio.md b/docs/versioned_docs/version-2.4.0/data-sources/minio.md new file mode 100644 index 0000000000..3f19ffc32d --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/minio.md @@ -0,0 +1,51 @@ +--- +id: minio +title: MinIO +--- + +# MinIO + +ToolJet can connect to minio and perform various operation on them. + +## Supported operations + +- **Read object** +- **Put object** +- **Remove object** +- **List buckets** +- **List objects in a bucket** +- **Presigned url for download** +- **Presigned url for upload** + + +## Connection + +To add a new minio source, click on the **Add or edit datasource** icon on the left sidebar of the app editor and click on `Add datasource` button. Select Minio from the modal that pops up. + +ToolJet requires the following to connect to your DynamoDB: + +- **Host** +- **Port** +- **Access key** +- **Secret key** + +
    + +miniIo connect + +
    + +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying Minio + +Click on `+` button of the **query manager** at the bottom panel of the editor and select the data source added in the previous step as the data source. Select the operation that you want to perform and click **Save** to save the query. + +miniIo query + +Click on the **run** button to run the query. +**NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/mongodb.md b/docs/versioned_docs/version-2.4.0/data-sources/mongodb.md new file mode 100644 index 0000000000..0ae21b519a --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/mongodb.md @@ -0,0 +1,109 @@ +--- +id: mongodb +title: MongoDB +--- + +# MongoDB + +ToolJet can connect to MongoDB to read and write data. + +## Connection + +Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. + +To add a new MongoDB, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select MongoDB from the modal that pops up. + +ToolJet requires the following to connect to your MongoDB. + +- **Host** +- **Port** +- **Username** +- **Password** + +It is recommended to create a new MongoDB user so that you can control the access levels of ToolJet. + +ToolJet - Mongo connection + +Click on 'Test connection' button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on 'Save' button to save the data source. + +## Querying MongoDB + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. Select the operation that you want to perform and click 'Save' to save the query. + +ToolJet - Mongo query + + + +Click on the 'run' button to run the query. NOTE: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: + +### Supported operations +- [List Collections](#list-collections) +- [Find One](#find-one) +- [Find Many](#find-many) +- [Total Count](#total-count) +- [Count](#count) +- [Distinct](#distinct) +- [Insert One](#insert-one) +- [Insert Many](#insert-many) +- [Update One](#update-one) +- [Update Many](#update-many) +- [Replace One](#replace-one) +- [Find One and Update](#find-one-and-update) +- [Find One and Replace](#find-one-and-replace) +- [Find One and Delete](#find-one-and-delete) +- [Aggregate](#aggregate) +- [Delete One](#delete-one) +- [Delete Many](#delete-many) +- [Bulk Operations](#bulk-operations) +#### List Collections +Returns list of collections +#### Fine One +Return a document which satisfy the given filter and options. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/findOne) +#### Fine Many +Return list of documents which satisfy the given filter and options. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/find/) +#### Total Count +Returns an estimation of the number of documents in the collection based on collection metadata. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#estimateddocumentcount) +#### Count +Returns the number of documents based on the filter. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#countdocuments) +#### Distinct +Retrieve a list of distinct values for a field based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/distinct/) +#### Insert One +Insert a document. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/insertOne/) +#### Insert Many +Insert list of documents. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/insertMany/) +#### Update One +Update a document based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/updateOne/) +#### Update Many +Update many documents based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/updateMany/) +#### Replace One +Replace a document based on filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/replaceOne/) +#### Find One and Update +If your application requires the document after updating, use this instead of `Update One`. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#findoneandupdate) +#### Find One and Replace +If your application requires the document after updating, use this instead of `Replace One`. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#findoneandreplace) +#### Find One and Delete +If your application requires the document after deleting, use this instead of `Delete One`. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#findoneanddelete) +#### Aggregate +Aggregation operations are expressions you can use to produce reduced and summarized results. [Reference](https://docs.mongodb.com/drivers/node/v4.0/fundamentals/aggregation/) +#### Delete One +Delete a record based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/deleteOne/) +#### Delete Many +Delete many records based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/deleteMany/) +#### Bulk Operations +Perform bulk operations. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/bulkWrite/) + +### Dynamic Quries +```javascript +{ amount: { $lt: '{{ components.textinput1.value }}' }} + +// Dates +// supported: Extended JSON syntax +{ createdAt: { $date: '{{ new Date('01/10/2020') }}'} } +// not supported: MongoDB classic syntax +{ createdAt: new Date('01/10/2020') } +``` +Reference on [mongodb extended JSON](https://docs.mongodb.com/manual/reference/mongodb-extended-json/) supported data types diff --git a/docs/versioned_docs/version-2.4.0/data-sources/mssql.md b/docs/versioned_docs/version-2.4.0/data-sources/mssql.md new file mode 100644 index 0000000000..a8aa169ce5 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/mssql.md @@ -0,0 +1,42 @@ +--- +id: mssql +title: MS SQL Server / Azure SQL databases +--- + +# MS SQL Server / Azure SQL databases + + +ToolJet can connect to MS SQL Server & Azure SQL databases to read and write data. + +## Connection + +Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. + +To add new MS SQL Server / Azure SQL database, click on the '+' button on data sources panel at the left-bottom corner of the app editor. Select `SQL Server` from the modal that pops up. + +ToolJet requires the following to connect to your PostgreSQL database. + +- **Host** +- **Port** +- **Username** +- **Password** +- **Azure** - Select this option if you are using Azure SQL databases. + +It is recommended to create a new database user so that you can control the access levels of ToolJet. + +Click on 'Test connection' button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on 'Save' button to save the data source. + +ToolJet - Redis connection + + +## Querying SQL Server / Azure SQL databases +Click on '+' button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. + +Click on the 'run' button to run the query. NOTE: Query should be saved before running. + +ToolJet - Redis connection + + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/mysql.md b/docs/versioned_docs/version-2.4.0/data-sources/mysql.md new file mode 100644 index 0000000000..eb5d441cc1 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/mysql.md @@ -0,0 +1,65 @@ +--- +id: mysql +title: MySQL +--- + +# MySQL + +ToolJet can connect to MySQL databases to read and write data. + +## Connection + +ToolJet requires the following to connect to your MySQL database. Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. + +To add a new MySQL database, click on the `+` button on data sources panel at left sidebar in the app editor. Select MySQL from the modal that pops up. + +ToolJet requires the following to connect to your MySQL database. + +- **Host** +- **Port** +- **Username** +- **Password** + +It is recommended to create a new MySQL database user so that you can control the access levels of ToolJet. + +
    + +mysql + +
    + +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying MySQL + +Once you have added a MySQL data source, click on `+` button of the query manager to create a new query. There are two modes by which you can query SQL: + + 1. **[SQL mode](/docs/data-sources/mysql#sql-mode)** + 2. **[GUI mode](/docs/data-sources/mysql#gui-mode)** + +#### SQL mode + +SQL mode can be used to write raw SQL queries. Select SQL mode from the dropdown and enter the SQL query in the editor. Click on the `run` button to run the query. + +**NOTE**: Query should be saved before running. + + +mysql mode + + + +#### GUI mode + +GUI mode can be used to query MySQL database without writing queries. Select GUI mode from the dropdown and then choose the operation **Bulk update using primary key**. Enter the **Table** name and **Primary key column** name. Now, in the editor enter the records in the form of an array of objects. + +**Example**: `{{ [ {id: 1, channel: 33}, {id:2, channel:24} ] }}` + + +mysql gui mode + + +Click on the **run** button to run the query. **NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/n8n.md b/docs/versioned_docs/version-2.4.0/data-sources/n8n.md new file mode 100644 index 0000000000..3228af72c2 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/n8n.md @@ -0,0 +1,51 @@ +--- +id: n8n +title: n8n +--- + +# n8n + +ToolJet can trigger n8n workflows using webhook URLs. Please refer [this](https://docs.n8n.io/) to know more about n8n. + +## Connection + +Go to the data source manager on the left sidebar and click on `+` button to add new data source. Select n8n from the list of available data sources in the modal that pops-up. + +n8n webhooks can be called with or without an **Authentication**. You can keep the `Authentication type` as `none` if your webhook didn't have one or if it has one then you can choose the one from the dropdown and provide credentials: + +#### Authentication Types +- **Basic Auth**: To connect your n8n webhooks using basic auth you'll need to provide the following credentials: + - **Username** + - **Password** + +
    + +n8n basicauth + +
    + +- **Header Auth**: To connect your n8n webhooks using header auth the following fields are required: + - **Name / Key** + - **Value** + +
    + +n8n headerauth + +
    + +:::tip +Webhook credentials and instance credentials are different. Please use the credentials that you use with the webhook trigger. Know more: **[Webhook Authentication](https://docs.n8n.io/nodes/n8n-nodes-base.webhook/#:~:text=then%20gets%20deactivated.-,Authentication,-%3A%20The%20Webhook%20node)**. +::: + +## Trigger Workflow + +Click on `+` button of the query manager at the bottom panel of the editor and the select n8n as the datasource. + +You can trigger a workflow with `GET/POST` URL. Choose the request type from the `Methods` dropdown and then provide the required fields: + - **URL parameters** (Support for GET & POST) `Optional` + - **Body** (Only for POST URL) `Required` + + +n8n query + diff --git a/docs/versioned_docs/version-2.4.0/data-sources/notion.md b/docs/versioned_docs/version-2.4.0/data-sources/notion.md new file mode 100644 index 0000000000..88000f3aa6 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/notion.md @@ -0,0 +1,234 @@ +--- +id: notion +title: Notion +--- +# Notion + +ToolJet can connect to a Notion workspace to do operations on notion pages, databases and blocks. +## Connection + +For integrating Notion with ToolJet we will need the API token. The API token can be generated from your Notion workspace settings. Read the official Notion docs for [Creating an internal integration with notion API](https://www.notion.so/help/create-integrations-with-the-notion-api). + +
    + +notion api + +
    + +## Querying Notion + +Notion API provides support for: +- **[Database](#database)** +- **[Page](#page)** +- **[Block](#blocks)** +- **[User](#user)** + + +notion querying + + +:::tip + +Before querying Notion, you must share the database with your integration. Click the share button in your database view, find your integration name select it. + + +notion share + + +::: + +### Database + +On database resource you can perform the following operations: +- **[Retrieve a database](#1-retrieve-a-database)** +- **[Query a database](#2-query-a-database)** +- **[Create a database](#3-create-a-database)** +- **[Update a database](#4-update-a-database)** + + +notion db + + +#### 1. Retrieve a database + +This operations retrieves a Database object using the ID specified. + +##### Required parameters: + +- **Database ID**: You'll find the Database ID in the url. Suppose this is the example url: `https://www.notion.so/workspace/XXX?v=YYY&p=ZZZ` then `XXX` is the database ID, `YYY` is the view ID and `ZZZ` is the page ID. + + +notion db retreieve + + +#### 2. Query a database + +This operation gets a list of **Pages** contained in the database, filtered and ordered according to the filter conditions and sort criteria provided in the query. +##### Required parameters: + +- **Database ID** : You'll find the Database ID in the url. Suppose this is the example url: `https://www.notion.so/workspace/XXX?v=YYY&p=ZZZ` then `XXX` is the database ID, `YYY` is the view ID and `ZZZ` is the page ID. + +##### Optional parameters: + +- **Filter** : This must be an object of filters +- **Sort** : Array of sort objects +- **Limit** : limit for pagination +- **Start Cursor** : Next object id to continue pagination + +#### 3. Create a database + +This operation creates a database as a subpage in the specified parent page, with the specified properties. + +##### Required parameters: + +- **Database ID** : You'll find the Database ID in the url. Suppose this is the example url: `https://www.notion.so/workspace/XXX?v=YYY&p=ZZZ` then `XXX` is the database ID, `YYY` is the view ID and `ZZZ` is the page ID. +- **Page ID** : Page ID of the parent +- **Properties** : Properties defines the columns in a database + +##### Optional parameters: + +- **Title** : Title should be an array of rich_text properties +- **Icon type** : Currently notion api accepts two icon options, emoji, external URL +- **Icon value** : Value of selected icon type +- **Icon type** : Currently notion api accepts only external URL +- **Cover value** : Value of selected cover type + +#### 4. Update a database + +This operation updates an existing database as specified by the parameters. + +##### Required parameters: +- **Database ID** + +##### Optional parameters: + +- **Title** : Title should be an array of rich_text properties +- **Properties** : Properties defines the columns in a database +- **Icon type** : Currently notion api accepts two icon options, emoji, external URL +- **Icon value** : Value of selected icon type +- **Icon type** : Currently notion api accepts only external URL +- **Cover value** : Value of selected cover type + +### Page + +On page resource you can perform the following operations: +- **[Retrieve a page](#1-retrieve-a-page)** +- **[Create a page](#2-create-a-page)** +- **[Update a page](#3-update-a-page)** +- **[Retrieve a page property](#4-retrieve-a-page-property-item)** +- **[Archive a page](#5-archive-delete-a-page)** + + +notion page + + +#### 1. Retrieve a page +This operation retrieves a **Page** object using the ID specified. +##### Required parameters: +- **Page ID** + +#### 2. Create a page +This operation creates a new page in the specified database or as a child of an existing page. If the parent is a database, the property values of the new page in the properties parameter must conform to the parent database's property schema. If the parent is a page, the only valid property is title. +##### Parameters: +- **Page ID** +- **Properties** : Property values of this page +- **Icon type** : Currently notion api accepts two icon options, emoji, external URL +- **Icon value**: Value of selected icon type +- **Icon type** : Currently notion api accepts only external URL +- **Cover value** : Value of selected cover type + +#### 3. Update a page +This operation updates page property values for the specified page. Properties that are not set via the properties parameter will remain unchanged. +##### Parameters: +- **Page ID** +- **Parent type**: A database parent or page parent +- **Properties** : Property values of this page +- **Children** : Page content for the new page as an array of block objects +- **Icon type** : Currently notion api accepts two icon options, emoji, external URL +- **Icon value**: Value of selected icon type +- **Icon type** : Currently notion api accepts only external URL +- **Cover value** : Value of selected cover type + +#### 4. Retrieve a page property item +This operation retrieves a property_item object for a given page ID and property ID. Depending on the property type, the object returned will either be a value or a paginated list of property item values. See Property item objects for specifics. +##### Parameters: +- **Page ID** +- **Property ID** +- **Limit** +- **Start cursor** + +#### 5. Archive (delete) a page +##### Required parameters: +- **Page ID** +- **Archive**: Dropdown for archive and un archive the page + +### Blocks +The following operations can be performed on the block resource: +- **[Retrieve a block](#1-retrieve-a-block)** +- **[Append block children](#2-append-new-block-children)** +- **[Retrieve block children](#3-retrieve-block-children)** +- **[Update a block](#4-update-a-block)** +- **[Delete a block](#5-delete-a-block)** + + +notion block + + +:::info +To get the id for blocks, simply click on the menu icon for the block and click "Copy link". Afterwards, paste the link in the browser and it should look like this: `https://www.notion.so/Creating-Page-Sample-ee18b8779ae54f358b09221d6665ee15#7fcb3940a1264aadb2ad4ee9ffe11b0e` the string after **#** is the block id i.e. `7fcb3940a1264aadb2ad4ee9ffe11b0e`. +::: + +#### 1. Retrieve a block +This operation retrieves a **Block** object using the ID specified. + +##### Required parameters: +- **Block ID** + +#### 2. Append new block children +This operation creates and appends new children blocks to the parent block_id specified. + +##### Required parameters: +- **Block ID** +- **Children**: Array of block objects + +#### 3. Retrieve block children +This operation retrieves a paginated array of child block objects contained in the block using the ID specified. + +##### Required parameters: +- **Block ID** +- **Limit** +- **Start cursor** + +#### 4. Update a block +This operation updates the content for the specified block_id based on the block type. + +##### Required parameters: +- **Block ID** +- **Properties**: The block object type value with the properties to be updated +- **Archive** + +#### 5. Delete a block +##### Required parameters: +- **Block ID** + +### User +The following operations can be performed on the user notion resource: + +#### 1. Retrieve a user from current workspace +This operation retrieves a User using the ID specified. + + +notion user + +##### Required parameters: +- **User ID** + +#### 2. Retrieve list of users of a workspace + +This operation returns a paginated list of Users for the workspace. + +##### Required parameters: +- **Limit** +- **Start cursor** + +[Read more about notion API](https://developers.notion.com/reference/intro) diff --git a/docs/versioned_docs/version-2.4.0/data-sources/openapi.md b/docs/versioned_docs/version-2.4.0/data-sources/openapi.md new file mode 100644 index 0000000000..7e8fe98370 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/openapi.md @@ -0,0 +1,25 @@ +--- +id: openapi +title: OpenAPI +--- + +# OpenAPI + +ToolJet has a data source for generating REST API operations from OpenAPI Specs. + +## Connection +- Connections are generated from OpenAPI specifications. Currently supports Basic Auth, API Key, Bearer Token, OAuth 2.0 + +- Also supports specifications with multiple authentications + + [Read more](https://swagger.io/docs/specification/authentication/) + +## Querying OpenAPI +- Operations will be generated from specifications and each one will be different from other + +### Common fields +- Host (Base URL) + + Some specs can have one or more base URLs/servers and specific operations may have separate Base URLs. So you can select the URL from the host select + +- Operation diff --git a/docs/versioned_docs/version-2.4.0/data-sources/oracledb.md b/docs/versioned_docs/version-2.4.0/data-sources/oracledb.md new file mode 100644 index 0000000000..163a0ca513 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/oracledb.md @@ -0,0 +1,53 @@ +--- +id: oracledb +title: Oracle DB +--- + +# Oracle DB + +ToolJet can connect to Oracle databases to read and write data. + +## Connection + +A Oracle DB can be connected with the following credentails: +- **Host** +- **Port** +- **SID / Service Name** ( Database name must be a SID / Service Name ) +- **Database Name** +- **SSL** +- **Username** +- **Password** +- **Client Library Path** ( Only required for local setup ) + +
    + +![ToolJet - Data source - OracleDB](/img/datasource-reference/oracledb/oracleauth.png) + +
    + +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying Oracle DB + +Once you have added a Oracle DB data source, click on `+` button of the query manager to create a new query. There are two modes by which you can query SQL: + + 1. **[SQL mode](/docs/data-sources/oracledb#sql-mode)** + 2. **[GUI mode](/docs/data-sources/oracledb#gui-mode)** + +#### SQL mode + +SQL mode can be used to write raw SQL queries. Select SQL mode from the dropdown and enter the SQL query in the editor. Click on the `run` button to run the query. + +**NOTE**: Query should be saved before running. + +#### GUI mode + +GUI mode can be used to query Oracle database without writing queries. Select GUI mode from the dropdown and then choose the operation **Bulk update using primary key**. Enter the **Table** name and **Primary key column** name. Now, in the editor enter the records in the form of an array of objects. + +**Example**: `{{ [ {id: 1, channel: 33}, {id:2, channel:24} ] }}` + +Click on the **run** button to run the query. **NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/data-sources/overview.md b/docs/versioned_docs/version-2.4.0/data-sources/overview.md new file mode 100644 index 0000000000..ec7527f8af --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/overview.md @@ -0,0 +1,42 @@ +--- +id: overview +title: Overview +--- + +# Datasources : Overview + +Datasources pull in and push data to any source including databases, external APIs, or services. + +
    + +Datasources: Overview + +
    + +## Connecting datasources + +1. After logging in to ToolJet, create a new app from the dashboard + +2. There are two ways for connecting a datasource. You can connect from: + 1. **Left-sidebar**: On the left sidebar, click on the `datasource` icon and then click on the `+ add datasource` button + +
    + + Datasources: Overview + +
    + + 2. **Query Panel**: Go to the query panel at the bottom, click on the `+Add` button and then click `Add datasource` button + +
    + + Datasources: Overview + +
    + +3. Follow the steps in the **[Datasource Library](/docs/data-sources/airtable)** specific to the desired datasource + +:::info +ToolJet allows you to transform the data returned by datasources using **[Transformations](/docs/tutorial/transformations)** +::: + diff --git a/docs/versioned_docs/version-2.4.0/data-sources/postgresql.md b/docs/versioned_docs/version-2.4.0/data-sources/postgresql.md new file mode 100644 index 0000000000..c95cb7f587 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/postgresql.md @@ -0,0 +1,57 @@ +--- +id: postgresql +title: PostgreSQL +--- + +# PostgreSQL + +ToolJet can connect to PostgreSQL databases to read and write data. + +## Connection + +Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. + +To add a new PostgreSQL database, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select PostgreSQL from the modal that pops up. + +ToolJet requires the following to connect to your PostgreSQL database. + +- **Host** +- **Port** +- **Username** +- **Password** + +It is recommended to create a new PostgreSQL database user so that you can control the access levels of ToolJet. + + +ppg connect + + +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying PostgreSQL + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. PostgreSQL query editor has two modes, SQL & GUI. **[SQL mode](/docs/data-sources/postgresql#sql-mode)** can be used to write raw SQL queries and **[GUI mode](/docs/data-sources/postgresql#gui-mode)** can be used to query your PostgreSQL database without writing queries. + +#### SQL mode + +Select SQL mode from the dropdown and enter the query in the editor. Click on the `run` button to run the query. + +**NOTE**: Query should be saved before running. + + +ppg sql + + +#### GUI mode + +Select GUI mode from the dropdown and then choose the operation **Bulk update using primary key**. Enter the **Table** name and **Primary key column** name. Now, in the editor enter the **records** in the form of an array of objects. + +Click on the `run` button to run the query. **NOTE**: Query should be saved before running. + + +ppg gui + + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/redis.md b/docs/versioned_docs/version-2.4.0/data-sources/redis.md new file mode 100644 index 0000000000..12ff5718ca --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/redis.md @@ -0,0 +1,44 @@ +--- +id: redis +title: Redis +--- + +# Redis +ToolJet can run Redis commands on your Redis instances. + +## Connection + +ToolJet requires the following to connect to your Redis instances. + +ToolJet - Redis connection + +- **Host** +- **Port** - The default port for Redis server is 6379 +- **Username** +- **Password** + +Click on "Test" button to test the connection and click "Save" to save the data source. + +## Redis Queries + +List of supported commands: [Redis Official Documentation](https://redis.io/commands) + +### Examples + +`PING` command to test the Redis connection. If the connection is ready, the Redis server will respond with `PONG`. + +```shell +PING +``` + +`SET` command can be used to set the value for a key + +```shell +SET key value +``` + +`GET` command can be used to retrieve the value of a key + +```shell +GET key +``` diff --git a/docs/versioned_docs/version-2.4.0/data-sources/restapi.md b/docs/versioned_docs/version-2.4.0/data-sources/restapi.md new file mode 100644 index 0000000000..281d97388b --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/restapi.md @@ -0,0 +1,46 @@ +--- +id: restapi +title: REST API +--- + +# REST API + +ToolJet can connect to any REST endpoint available. + +## Connection + +To add a new REST API datasource, click the Datasources manager icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select REST API from the modal that pops up. +Click on the 'Save' button to save the data source. + +ToolJet - Data source - REST API + +ToolJet requires the following to connect to a REST API datasource. + +- URL of the REST endpoint + +The following optional parameters are also supported: + + | Type | Description | + | ----------- | ----------- | + | URL params | Additional query string parameters| + | headers | Any headers the REST API source requires| + | body | Any values or fields the REST API source requires| + +:::info +REST HTTP methods that are supported are **GET, POST, PUT, PATCH & DELETE**. +::: + +ToolJet - Data source - REST API + +## Querying REST API +Click on `+` button of the query manager at the bottom panel of the editor and select the REST API endpoint added in the previous step as the data source. + +Click on the 'run' button to run the query. + +:::note +NOTE: Query should be saved before running. +::: + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/rethinkdb.md b/docs/versioned_docs/version-2.4.0/data-sources/rethinkdb.md new file mode 100644 index 0000000000..6ffd11e7dc --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/rethinkdb.md @@ -0,0 +1,52 @@ +--- +id: rethinkdb +title: RethinkDB +--- +# RethinkDB + +ToolJet can connect to RethinkDB databases to read and write data. For more info visit this [doc](https://rethinkdb.com/api/javascript). + +ToolJet - Data source - RethinkDB + +## Connection + +ToolJet connects to InfluxDB using : + +- **Database** +- **Host** +- **Port** +- **Username** +- **Password** + + +## Supported queries: + +- Delete database + +- Delete Table + +- Create database + +- Create Table + +- List table + +- List database + +- Get all documents + +- Insert table data + +- Update all table data + +- Update by id + +- Delete table data by id + +- Delete all table data + +- Get document from primary key + +:::info +NOTE: Name field in all operation is database name if not given will take the default database used for connection. +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/run-py.md b/docs/versioned_docs/version-2.4.0/data-sources/run-py.md new file mode 100644 index 0000000000..4a1b749cb9 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/run-py.md @@ -0,0 +1,55 @@ +--- +id: run-py +title: Run Python code +--- + +You can write custom Python code to interact with components and queries. To do that, you just need to create a new query and select **Run Python Code** from the available datasources. + +
    + +Run JavaScript code + +
    + +#### Example: Using Python code to trigger component specific actions + +- Let's drag a **button** and a **text** widget onto the canvas. We will set a text on the text component and trigger button click event from the Python query. +- Click on the `+` on the query panel to create a query and select **Run Python code** from the available datasources +- Let's write the code in **Python Editor** and save the query: + + ```python + class Person: + def __init__(self, name, age): + self.name = name + self.age = age + + def myfunc(self): + return "Hello my name is " + self.name + + p1 = Person(tj_globals.currentUser.firstName, 36) + + components.text1.setText(p1.myfunc()) + components.button1.click() + ``` +- The code above has a function `myfunc` which returns a string and we using the component specific action to set the **text component**'s value from the Python query. We are also triggering the button click using `components.button1.click()` + +:::tip +- ToolJet's global variables can be accessed using **tj_globals**. ex: `tj_globals.currentUser.firstName` +- As of now, Run Python code only supports the [Python standard library](https://docs.python.org/3/library/) only. +::: + +- Let's edit the properties of widgets: + - Add an event handler to the button - Select **On Click** event, **Show alert** action, and set a success message `Triggered using RunPy`. This will show a success alert popup whenever the button click event is triggered from the Python code. + - For the text component, we don't have to edit any property since we are changing the value directly from the Python code. + +
    + +Run Python code + +
    + +You can also write custom Python code to get the data from **External APIs** and manipulate the response for graphical representation. + +:::info +Issues with writing custom Python code? Ask in our [Slack community](https://www.tooljet.com/slack). +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/s3.md b/docs/versioned_docs/version-2.4.0/data-sources/s3.md new file mode 100644 index 0000000000..ba1a029fb2 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/s3.md @@ -0,0 +1,137 @@ +--- +id: s3 +title: Amazon S3 +--- + +# Amazon S3 + +ToolJet can connect to Amazon S3 buckets and perform various operation on them. + +## Connection + +To add a new S3 source, go to the **Datasources manager** on the left sidebar of the app editor and click on `Add datasource` button. Select **AWS S3** from the modal that pops up. + +ToolJet requires the following to connect to your AWS S3: + +- **Region** +- **Access key** +- **Secret key** + +It is recommended to create a new IAM user for the database so that you can control the access levels of ToolJet. + +
    + +aws s3 modal + +
    + +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +:::tip +You can now connect to **[different S3 Hosts using custom endpoints](/docs/how-to/s3-custom-endpoints)**. +::: + +## Querying AWS S3 + +Click on `+` button of the **query manager** at the bottom panel of the editor and select the data source added in the previous step as the data source. Select the operation that you want to perform and click **Save** to save the query. + +
    + +aws s3 query + +
    + +Click on the **run** button to run the query. + +**NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +## Query operations + +You can create query for AWS S3 data source to perform several actions such as: + 1. **[Read object](/docs/data-sources/s3#read-object)** + 2. **[Upload object](/docs/data-sources/s3#upload-object)** + 3. **[List buckets](/docs/data-sources/s3#list-buckets)** + 4. **[List objects in a bucket](/docs/data-sources/s3#list-objects-in-a-bucket)** + 5. **[Signed url for download](/docs/data-sources/s3#signed-url-for-download)** + 6. **[Signed url for upload](/docs/data-sources/s3#signed-url-for-upload)** + +### Read object + +You can read an object in a bucket by using this operation. It requires two parameters - **Bucket** name and **Key**. + + +aws s3 read object + +### Upload object + +You can use this operation to upload objects(files) to your S3 bucket. It requires four parameters: + 1. **Bucket**: Specify the bucket name + 2. **Key**: Key of the object/file + 3. **Content type**: Specify file type such as text, image etc. + 4. **Upload data**: File/object that is to be uploaded. + + +aws s3 upload + + +### List buckets + +This operation will list all the buckets in your S3. This does not require any parameter. + + +aws s3 bucket + + +### List objects in a bucket + +This operation will fetch the list of all the files in your bucket. It requires two parameters: + 1. **Bucket**: Bucket name (mandatory) + 2. **Prefix**: To limit the response to keys that begin with the specified prefix (optional) + 3. **Max keys**: The maximum number of keys returned in the response body (optional). Default value is 1000. + 4. **Offset**: The key to start with when listing objects in a bucket (optional). + 5. **"Next Continuation Token"**: `Next Continuation Token` indicates Amazon S3 that the list is being continued on this bucket with a token. ContinuationToken is obfuscated and is not a real key (optional). + + +:::info +**Next Continuation Token** +For listing a bucket for objects that begin with a specific character or a prefix, then use the `Offset` parameter. For example, if you want to list all the objects that begin with `a`, then set the `Offset` parameter to `a`. Similarly, if you want to list all the objects that begin with `ab`, then set the `Offset` parameter to `ab`. + +The `Next Continuation Token` is used to list the next set of objects in a bucket. It is returned by the API when the response is truncated. The results will contain `Next Continuation Token` if there are more keys in the bucket that satisfy the list query. To get the next set of objects, set the `Next Continuation Token` parameter and run the query again. +The results will continue from where the last listing finished. +::: + + +aws s3 list object + + +### Signed url for download + +The object owner can optionally share objects with others by creating a presigned URL, using their own security credentials, to grant time-limited permission to download the objects. For creating a presigned URL, the required parameters are: + 1. **Bucket**: name of the bucket for uploading the file + 2. **Key**: an object key + 3. **Expires in**: an expiration time of URL + + +aws s3 signed download + + +### Signed url for upload + +The presigned URLs are useful if you want your user/customer to be able to upload a specific object to your bucket, but you don't require them to have AWS security credentials or permissions. For creating a presigned URL, the required parameters are: + 1. **Bucket**: name of the bucket for uploading the file + 2. **Key**: an object key + 3. **Expires in**: an expiration time of URL + 4. **Content type**: the content type such as text, image etc. + + +aws s3 signed upload + + + +:::info +We built an app to view and upload files to AWS S3 buckets. Check out the complete tutorial **[here](https://blog.tooljet.com/building-an-app-to-view-and-upload-files-in-aws-s3-bucket/)**. +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/saphana.md b/docs/versioned_docs/version-2.4.0/data-sources/saphana.md new file mode 100644 index 0000000000..1a18eea40b --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/saphana.md @@ -0,0 +1,48 @@ +--- +id: saphana +title: SAP HANA +--- + +# SAP HANA + +ToolJet can connect to SAP HANA databases to read and write data. + +- [Connection](#connection) +- [Querying SAP HANA](#querying-sap-hana) + +## Connection + +To add a new SAP HANA database, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select SAP HANA from the modal that pops up. + +ToolJet requires the following to connect to your SAP HANA database: + +- **Host** +- **Port** +- **Username** +- **Password** + +:::info +Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. +::: + +
    + +![ToolJet - Data source - SAP HANA](/img/datasource-reference/saphana/connect.png) + +
    + +Click on **Test connection** button to verify if the credentials are correct and that the database is accessible to ToolJet server. Click on **Save** button to save the data source. + +## Querying SAP HANA + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. Enter the query in the editor. Click on the `run` button to run the query. + +**NOTE**: Query should be saved before running. + + +saphana query + + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/data-sources/sendgrid.md b/docs/versioned_docs/version-2.4.0/data-sources/sendgrid.md new file mode 100644 index 0000000000..fa45ffd56d --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/sendgrid.md @@ -0,0 +1,62 @@ +--- +id: sendgrid +title: SendGrid +--- + +# SendGrid + +ToolJet can connect to your SendGrid account to send emails. + +ToolJet - Data source - SendGrid + +:::info +The SendGrid API Datasource supports for interaction with the mail endpoint of the [SendGrid v3 API](https://docs.sendgrid.com/api-reference/how-to-use-the-sendgrid-v3-api/authentication). +::: + +## Connection +To add a new SendGrid API datasource, click the **Datasource manager** icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select SendGrid API from the modal that pops up. + +Enter your **SendGrid API key** in the "API key" field. + +:::tip +SendGrid API key is required to create an SendGrid datasource on ToolJet. You can generate API key by visiting [SendGrid account page](https://app.sendgrid.com/settings/api_keys). +::: + +Click on the 'Save' button to save the data source. + +## Supported operations +1. Email service + + +### Email service +Required parameters: +- Send email to +- Send email from +- Subject +- Body as text + + +Optional parameters: +- Body as HTML + +ToolJet - Query SendGrid + +:::info +**Send mail to** - accepts an array/list of emails separated by comma. +For example: +`{{["dev@tooljet.io", "admin@tooljet.io"]}}`. + +**Send mail from** - accepts a string. +For example: `admin@tooljet.io` +::: + +:::tip +**Send a single email to multiple recipients** - The `Send mail to` field can contain an array of recipients, which will send a single email with all of the recipients in the field. + +**Send multiple individual emails to multiple recipients** - set Multiple recipients field to `{{true}}` and the `Send mail to` field will be split into multiple emails and send to each recipient. +::: + + +:::note +NOTE: Query should be saved before running. +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/slack.md b/docs/versioned_docs/version-2.4.0/data-sources/slack.md new file mode 100644 index 0000000000..04005fde9a --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/slack.md @@ -0,0 +1,81 @@ +--- +id: slack +title: Slack +--- + +# Slack + +ToolJet can connect to your Slack workspace to send messages. + +
    + +Slack datasource: ToolJet + +
    + +## Connection +- To add the Slack datasource, click the **Datasource manager** icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select Slack from the modal that pops up. + +- In the next dialog, you'll be asked to choose the **permission scope**. Choose the permission scope and then click on **Connect to Slack** button. + +- A new tab will open up asking for authorization confirmation. Once done, you can close the tab. + +
    + +Slack datasource: ToolJet + +
    + +- Click on the '**Save data source** button to save the data source. + + +:::note +The App (which credentials are provided) needs to be installed in the workspace to use the Slack data source, and it needs to be added to the channel where you want to post the message. +::: + +## Supported operations + +1. **List members** +2. **Send message** +3. **List messages from a channel** + +### List members + +This operation will return the data of all the members in your slack workspace. + +
    + +Slack datasource: ToolJet + +
    + +### Send message + +This operation will send/post the message to a specified channel or posting to direct messages (also known as DMs or IMs) in your slack workspace. + +| Property | Description | +| :--- | :--- | +| Channel | The channel ID or user ID to post the message to. | +| Message | The message to post. | + +
    + +Slack datasource: ToolJet + +
    + +### List messages + +This operation will get the messages from a specified channel. + +| Property | Description | +| :--- |:----------------------------------------| +| Channel | The channel ID to get the messages from | +| Limit | The maximum number of messages to return. | +| Next Cursor | A cursor value returned by a previous call to list messages. | + +
    + +Slack datasource: ToolJet + +
    diff --git a/docs/versioned_docs/version-2.4.0/data-sources/smtp.md b/docs/versioned_docs/version-2.4.0/data-sources/smtp.md new file mode 100644 index 0000000000..120f2b1d08 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/smtp.md @@ -0,0 +1,48 @@ +--- +id: smtp +title: SMTP +--- + +# SMTP + +SMTP plugin can connect ToolJet applications to **SMTP servers** for sending emails. + +## Connection + +A SMTP server can be connected with the following credentails: +- **Host** +- **Port** +- **User** +- **Password** + +:::info +You can also test your connection before saving the configuration by clicking on `Test Connection` button. +::: + +
    + +smtp connect + +
    + +## Querying SMTP + +Go to the query manager at the bottom panel of the editor and click on the `+` button on the left to create a new query. Select `SMTP` from the datasource dropdown. + +To create a query for sending email, you will need to provide the following properties: + - **From** `required` : Email address of the sender + - **From Name** : Name of the sender + - **To** `required` : Recipient's email address + - **Subject** : Subject of the email + + +smtp query1 + + + - **Body** : You can enter the body text either in the form of `raw text` or `html` in their respective fields. + - **Attachments** : Attachments can be added to a SMTP query by referencing the file from the `File Picker` component in the attachments field. + + For example, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or you can pass an array of `{{ name: 'filename.jpg', dataURL: '......' }}` object to accomplish this. + + +smtp query2 diff --git a/docs/versioned_docs/version-2.4.0/data-sources/snowflake.md b/docs/versioned_docs/version-2.4.0/data-sources/snowflake.md new file mode 100644 index 0000000000..6b3b30d283 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/snowflake.md @@ -0,0 +1,52 @@ +--- +id: snowflake +title: Snowflake +--- + +# Snowflake + +ToolJet can connect to Snowflake databases to read and write data. + +- [Connection](#connection) +- [Getting Started](#querying-snowflake) + +## Connection + +Please make sure the host/ip of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please whitelist our IP. You can find snowflake docs on network policies **[here](https://docs.snowflake.com/en/user-guide/network-policies.html)**. + + +To add a new Snowflake database, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select Snowflake from the modal that pops up. + +ToolJet requires the following to connect to your Snowflake database. + +- **Account** +- **Username** +- **Password** + +:::info +You can also configure for **[additional optional parameters](https://docs.snowflake.com/en/user-guide/nodejs-driver-use.html#additional-connection-options)**. +::: + +
    + +![ToolJet - Snowflake connection](/img/datasource-reference/snowflake/snowflake-connect.png) + +
    + +## Querying Snowflake + +Click on `+` button of the query manager at the bottom panel of the editor and select the database added in the previous step as the datasource. Query manager then can be used to write raw SQL queries. + +
    + +![ToolJet - Snowflake query](/img/datasource-reference/snowflake/snowflake-query.png) + +
    + +Click on the `run` button to run the query. + +**NOTE:** Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/stripe.md b/docs/versioned_docs/version-2.4.0/data-sources/stripe.md new file mode 100644 index 0000000000..e6fa073e9c --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/stripe.md @@ -0,0 +1,192 @@ +--- +id: stripe +title: Stripe +--- + +# Stripe + +ToolJet can connect to your Stripe account to read or write customers' and payments' data. + +:::info +Check out the **[Stripe Refund App tutorial](https://blog.tooljet.com/build-a-stripe-refund-tool-using-low-code/)** +::: + +## Connection + +To add a new Stripe data source, click on the `+` button on data sources panel at the left-bottom corner of the app editor. Select Stripe from the modal that pops up. + +ToolJet requires the **Stripe API key** to connect to your database. + +
    + +![ToolJet - Data source - Stripe](/img/datasource-reference/stripe/connect.png) + +
    + +You can get the Stripe API key from the dashboard of your Stripe account. Go to the Stripe account dashboard, click on the **Developers** on the top right, then on the left-sidebar go to the **API Keys**, you can simple reveal the **Secret Key** and copy-paste on ToolJet. + +
    + +![ToolJet - Data source - Stripe](/img/datasource-reference/stripe/apikey.png) + +
    + +## Querying Stripe + +Click on **+** button of the query manager at the bottom panel of the editor and select the Stripe datasource added in the previous step. Enter the query in the editor. Click on the `Save and Run` button to save and then run the query. + +**NOTE**: Query should be saved before running. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +## Supported operations + + +You can check out the some of the operations mentioned below. All the operations for Stripe are available and can be performed from ToolJet. Check out the **[Stripe API documentation](https://stripe.com/docs/api/)** for the detailed information about each operation. + +- **delete,/v1/account** +- **get,/v1/account** +- **post,/v1/account** +- **post,/v1/account/bank_accounts** +- **delete,/v1/account/bank_accounts/{id}** +- **get,/v1/account/bank_accounts/{id}** +- **post,/v1/account/bank_accounts/{id}** +- **get,/v1/account/capabilities** +- **get,/v1/account/capabilities/{capability}** +- **post,/v1/account/capabilities/{capability}** +- **get,/v1/account/external_accounts** +- **post,/v1/account/external_accounts** +- **delete,/v1/account/external_accounts/{id}** +- **get,/v1/account/external_accounts/{id}** +- **post,/v1/account/external_accounts/{id}** +- **post,/v1/account/login_links** +- **get,/v1/account/people** +- **post,/v1/account/people** +- **delete,/v1/account/people/{person}** +- **get,/v1/account/people/{person}** +- **post,/v1/account/persons** +- **delete,/v1/account/persons/{person}** +- **get,/v1/account/persons/{person}** +- **post,/v1/account/persons/{person}** +- **post,/v1/account_links** +- **get,/v1/accounts** +- **post,/v1/accounts** +- **delete,/v1/accounts/{account}** +- **get,/v1/accounts/{account}** +- **post,/v1/accounts/{account}** +- **post,/v1/accounts/{account}/bank_accounts** +- **delete,/v1/accounts/{account}/bank_accounts/{id}** +- **get,/v1/accounts/{account}/bank_accounts/{id}** +- **get,/v1/accounts/{account}/bank_accounts/{id}** +- **get,/v1/accounts/{account}/capabilities** +- **get,/v1/accounts/{account}/capabilities/{capability}** +- **post,/v1/accounts/{account}/capabilities/{capability}** +- **get,/v1/accounts/{account}/external_accounts** +- **post,/v1/accounts/{account}/external_accounts** +- **delete,/v1/accounts/{account}/external_accounts/{id}** +- **get,/v1/accounts/{account}/external_accounts/{id}** +- **get,/v1/accounts/{account}/external_accounts/{id}** +- **post,/v1/accounts/{account}/login_links** +- **get,/v1/accounts/{account}/people** +- **post,/v1/accounts/{account}/people** +- **delete,/v1/accounts/{account}/people/{person}** +- **get,/v1/accounts/{account}/people/{person}** +- **post,/v1/accounts/{account}/people/{person}** +- **get,/v1/accounts/{account}/persons** +- **post,/v1/accounts/{account}/persons** +- **delete,/v1/accounts/{account}/persons/{person}** +- **get,/v1/accounts/{account}/persons/{person}** +- **post,/v1/accounts/{account}/persons/{person}** +- **post,/v1/accounts/{account}/reject** +- **get,/v1/apple_pay/domains** +- **post,/v1/apple_pay/domains** +- **delete,/v1/apple_pay/domains/{domain}** +- **get,/v1/apple_pay/domains/{domain}** +- **get,/v1/application_fees** +- **get,/v1/application_fees/{fee}/refunds/{id}** +- **post,/v1/application_fees/{fee}/refunds/{id}** +- **get,/v1/application_fees/{id}** +- **post,/v1/application_fees/{id}/refund** +- **get,/v1/application_fees/{id}/refunds** +- **post,/v1/application_fees/{id}/refunds** +- **get,/v1/apps/secrets** + + + + + + + + + diff --git a/docs/versioned_docs/version-2.4.0/data-sources/twilio.md b/docs/versioned_docs/version-2.4.0/data-sources/twilio.md new file mode 100644 index 0000000000..daac9e7e32 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/twilio.md @@ -0,0 +1,54 @@ +--- +id: twilio +title: Twilio +--- + +# Twilio + +ToolJet can connect to your Twilio account to send sms. + +
    + +![ToolJet - Data source - Twilio](/img/datasource-reference/twilio/connect.png) + +
    + +## Connection +- To add the Twilio datasource, click the **Datasource manager** icon on the left-sidebar of the app builder and click on the `Add datasource` button, then select **Twilio** from the modal that pops up. + +- In the next dialog, you'll be asked to enter the Auth Token, Account SID, and Messaging Service SID. + +- You can get the **Auth Token and Account SID** on the dashboard of your Twilio account. + +
    + +![ToolJet - Data source - Twilio](/img/datasource-reference/twilio/auth.png) + +
    + +- For **Messaging Service SID**, you'll need to create a messaging service first from the Services under Messaging in the left-sidebar. + +
    + +![ToolJet - Data source - Twilio](/img/datasource-reference/twilio/sid.png) + +
    + +- After entering the three credentials, you can **Save** the datasource. + +## Supported operations + +1. **Send message** + +### Send message + +This operation will send the specified message to specified mobile number. + +
    + +![ToolJet - Data source - Twilio](/img/datasource-reference/twilio/sms.png) + +
    + + + diff --git a/docs/versioned_docs/version-2.4.0/data-sources/typesense.md b/docs/versioned_docs/version-2.4.0/data-sources/typesense.md new file mode 100644 index 0000000000..48d885bd7f --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/typesense.md @@ -0,0 +1,92 @@ +--- +id: typesense +title: TypeSense +--- + +# TypeSense +ToolJet can connect to your TypeSense deployment to read and write data. + +## Connection +Please make sure the host/IP of the TypeSense deployment is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist our IP**. + +ToolJet requires the following to connect to your TypeSense deployment: +- **Host** +- **Port** +- **API Key** +- **Protocol** + +
    + +typesense connect + +
    + +## Querying TypeSense + +Click on `+` button of the query manager at the bottom panel of the editor and select the TypeSense added in the previous step as the data source. +Select the operation that you want to perform on your TypeSense cluster and click `Create` to save the query. + +
    + +typesense query + +
    + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +## Supported operations + +#### 1. Create a Collection + +With this operation you can easily create `Collections` in your TypeSense cluster. In the schema field, you'll need to define the schema for creating a new collection. Check out TypeSense docs to know more about collections **[here](https://typesense.org/docs/0.22.2/api/collections.html#create-a-collection)** + + +typesense collection + + +#### 2. Index a document + +Use this operation to index a document to your collection. You'll need to specify the **Collection Name** where you want your document to be indexed and also provide the document data according the schema defined in the collection. Read more about Indexing a document in TypeSense **[here]( +https://typesense.org/docs/0.22.2/api/documents.html#index-a-single-document)**. + + +typesense index + + +#### 3. Search + +Use this operation to perform a search within the specified collection. Know more about the search parameters in the TypeSense doc **[here](https://typesense.org/docs/0.22.2/api/documents.html#search)**. + + +typesense search + + +#### 4. Get a document + +Use this operation to fetch an individual document in a collection by providing the `id` of the document. Read more about it **[here](https://typesense.org/docs/0.22.2/api/documents.html#retrieve-a-document)**. + + +typesense get + + +#### 5. Update a document + +Use this operation to update an individual document by providing the **Collection Name** and **Id** of the document. You'll need to provide the updated document data in the form of specified schema. Check out the TypeSense's doc on updating a document **[here](https://typesense.org/docs/0.22.2/api/documents.html#update-a-document)**. + + +typesense update + + +#### 6. Delete a document + +Delete a document from collection by providing the `Id` of the document. Check out the TypeSense's doc on deleting documents **[here](https://typesense.org/docs/0.22.2/api/documents.html#delete-documents)**. + + +typesense delete + + +:::tip +Make sure that you supply JSON strings instead of JavaScript objects for any document or schema that is being passed to the server, in any of the above operations. +::: diff --git a/docs/versioned_docs/version-2.4.0/data-sources/woocommerce.md b/docs/versioned_docs/version-2.4.0/data-sources/woocommerce.md new file mode 100644 index 0000000000..45567819c6 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/woocommerce.md @@ -0,0 +1,64 @@ +--- +id: woocommerce +title: WooCommerce +--- +# WooCommerce + +ToolJet can connect to WooCommerce databases to read and write data. + +- [Connection](#connection) +- [Getting Started](#querying-woocommerce) + +## Connection + +Auth +You may use [HTTP Basic Auth] by providing the REST API Consumer Key as the username and the REST API Consumer Secret as the password. +- **Host** +- **Consumer key** +- **Consumer secret** + +![ToolJet - Data Source - Woocommerce](/img/datasource-reference/woocommerce/woocomerce-auth.png) + +:::info +NOTE: For generating keys visit admin dashboard of woocommerce , more info: https://woocommerce.github.io/woocommerce-rest-api-docs/?javascript#authentication +::: + +## Querying Woocommerce + +**Operations** + +**Customer** + +- list customer +- update customer +- delete customer +- batch update customer +- create customer +- retrieve customer + +**PRODUCT** + +- list product +- update product +- delete product +- batch update product +- create product +- retrieve product + +**ORDER** + +- list order +- update order +- delete order +- batch update order +- create order +- retrieve order + +**Coupon** + +- list coupon +- create coupon + +:::info +NOTE: For more info visit https://woocommerce.github.io/woocommerce-rest-api-docs/?javascript. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/data-sources/zendesk.md b/docs/versioned_docs/version-2.4.0/data-sources/zendesk.md new file mode 100644 index 0000000000..7c9e2eaac0 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/data-sources/zendesk.md @@ -0,0 +1,96 @@ +--- +id: zendesk +title: Zendesk +--- + +# Zendesk + +ToolJet can connect to Zendesk APIs to read and write data using OAuth 2.0, which helps us to limit an application's access to a user's account. + + - [Connection](#connection) + - [Querying Zendesk](#querying-zendesk) + +## Connection + +ToolJet connects to your Zendesk app using : +- **Zendesk Sub-domain** +- **Client ID** +- **Client Secret** + +## Authorization Scopes + +You can create a Zendesk data source with one of either of the two permission scopes : + 1. **Read Only** + 2. **Read and Write** + + + + +:::info +You must first be a verified user to make Zendesk API requests. This is configured in the Admin Center interface in **Apps and integrations > APIs > Zendesk APIs.** For more information, see Security and Authentication in the [Zendesk Support API reference](https://developer.zendesk.com/api-reference/ticketing/introduction/#security-and-authentication) or [check out Zendesk's docs](https://support.zendesk.com/hc/en-us/articles/4408845965210). +::: + +To connect Zendesk datasource to your ToolJet application, go to the data source manager on the left-sidebar and click on the `+` button. Select Zendesk from the list of available datasources, provide the credentials and click **Connect to Zendesk** and authenticate via OAuth. And click **Save** to save the datasource. + +
    + +![ToolJet - Data source - Zendesk](/img/datasource-reference/zendesk/zendesk.gif) + +
    + +## Operations +1. **[List Tickets](/docs/data-sources/zendesk#list-tickets)** +2. **[List requested Tickets](/docs/data-sources/zendesk#list-requested-tickets)** +3. **[Show a Ticket](/docs/data-sources/zendesk#show-tickets)** +4. **[Update a Ticket](/docs/data-sources/zendesk#update-tickets)** +5. **[List Users](/docs/data-sources/zendesk#list-users)** +6. **[Get Profile](/docs/data-sources/zendesk#get-profile)** +7. **[Search query](/docs/data-sources/zendesk#search-query)** + + +### List Tickets +Lists all the tickets in your Zendesk account. + +### List requested Tickets +Lists all the tickets requested by the user. + +| Fields | description | +| ----------- | ----------- | +| User ID | The id of the user | + +### Show Tickets +Gets a ticket's properties with the given ID, though not the ticket comments. + +| Fields | description | +| ----------- | ----------- | +| Ticket ID | The id of the ticket | + +### Update Tickets +Updates a ticket's properties with the given ID. + +| Fields | description | +| ----------- | ----------- | +| Ticket ID | The id of the ticket | +| Body | The properties and values to update. Example: `{{({ "ticket": {"status": "solved"} })}}` | + +### List Users +Lists all the users in your Zendesk account. + +### Get Profile +Gets a user's profile with the given ID. + +| Fields | description | +| ----------- | ----------- | +| User ID | The id of the user | + +### Search Query +The Search Query uses Zendesk's Search API to return tickets, users, and organizations with defined filters. +Common filters include: +- `type:ticket` +- `type:user` +- `type:organization` +- `type:ticket organization:12345 status:open` + +| Fields | description | +| ----------- | ----------- | +| Query | The search query | diff --git a/docs/versioned_docs/version-2.4.0/getting-started.md b/docs/versioned_docs/version-2.4.0/getting-started.md new file mode 100644 index 0000000000..3d944f62c9 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/getting-started.md @@ -0,0 +1,249 @@ +--- +id: getting-started +title: Getting Started +description: ToolJet is an open-source low-code framework to build and deploy custom internal tools. ToolJet can connect to your data sources such as databases ( PostgreSQL, MongoDB, MS SQL Server, Snowflake, , BigQuery, etc ), API/GraphQL endpoints, SaaS tools ( Airtable, Stripe, Google Sheets, etc ) and cloud object storage services ( AWS S3, Google Cloud Storage and Minio ). Once the data sources are connected, ToolJet can run queries on these data sources to fetch and update data. The data fetched from data sources can be visualised and modified using the UI widgets such as tables, charts, forms, etc. +slug: / +--- + +# Welcome to ToolJet Docs + +--- + +## What is ToolJet + +ToolJet is an **open-source low-code framework** to build and deploy custom internal tools. + +ToolJet ships with its built-in database called **[ToolJet DB](/docs/tooljet-database)** (built on top of PostgreSQL). You can also connect to the **external data sources** such as **databases** ( PostgreSQL, MongoDB, MS SQL Server, Snowflake, , BigQuery, etc ), **API/GraphQL endpoints**, **SaaS tools** ( Airtable, Stripe, Google Sheets, etc ) and **cloud object storage services** ( AWS S3, Google Cloud Storage and Minio ). + +Once the data sources are connected, ToolJet can run **queries** on these data sources to fetch and update data. The data fetched from data sources can be **visualised and modified** using the UI widgets such as tables, charts, forms, etc. You can also use **[Javascript](/docs/data-sources/run-js)** or **[Python](/docs/data-sources/run-py)** queries for writing business logic or interacting with the user interface of the application. + +Getting started Demo app + + + +## How ToolJet works + +
    + +How ToolJet works flow + +
    + +**With ToolJet, you can build apps in 3 simple steps:** + +1. **Connect to datasources:** Connect to the ToolJet's built-in database **[ToolJet DB](/docs/tooljet-database)** (built on top of PostgreSQL) or your existing data sources such as PostgreSQL, MySQL, Firestore, Stripe, Google Sheets, API endpoints, etc. + +2. **Build queries:** ToolJet comes with query builders for all supported data sources. You can also write **[Javascript](/docs/data-sources/run-js)** or **[Python](/docs/data-sources/run-py)** queries or use **[Transformations](/docs/tutorial/transformations)** to transform the query response. + +3. **Build User Interface:** ToolJet's visual **[App Builder](/docs/app-builder/overview)** allows you to drag and drop components ( Eg: tables, charts, forms, etc ) to quickly build the user-interface of the apps. Components have events such as `on click`, `on row selected`, `on page changed`, etc. ToolJet apps can be used in light and dark mode. + + :::tip + ToolJet binds together the datasources, queries and components to convert business logic into custom applications. You can also secure your ToolJet apps with **[Group & Permissions](/docs/org-management/permissions)** and **[Audit Logging](/docs/Enterprise/audit_logs)**. + ::: +## Choose your ToolJet + +There are a few different ways to set up ToolJet depending on how you intend to use it: + +- **[ToolJet Cloud](https://www.tooljet.com)**: hosted solution, just sign-up for free and start building apps in seconds. +- **[Deploy on premise](/docs/setup/)**: recommended method for production or customized use cases. You'll find Server setup guides for popular platforms (AWS, GCP, Kubernetes etc) and one-click deployment guides (Heroku, DigitalOcean etc). +- **[Try ToolJet on local machine](/docs/setup/try-tooljet/)**: the fastest way to try out ToolJet on your computer using docker. + +:::info +- Data security is top priority at ToolJet, read about our **[data security here](/docs/security)**. +::: + +## The very quick quickstart + +Let's say you're an eCommerce company and your **Customer Support/Operations** team need a **Support Tool/Admin** panel for managing the orders, updating inventory, and track revenue and metrics. This quickstart will guide you through building your first custom internal tool in less than 5 minutes. + +You will: +- **[Create a database](#create-a-tooljet-database)** +- **[Create a new application](#create-a-new-application)** +- **[Build the UI](#build-the-ui)** +- **[Build queries and bind data to UI](#build-queries-and-bind-data-to-ui)** +- **[Preview, Release and Share app](#preview-release-and-share-app)** + +:::tip +Before getting into the quickstart, Sign up and create your account on **[ToolJet](https:///www.tooljet.com)**. +::: + +### Create a database + +1. Navigate to **ToolJet DB Editor** from the left sidebar on the dashboard +
    + + Getting started: Quickstart + +
    + +2. Click on **Add Table** button, enter **Table name** and **Add columns** from the drawer that slides from the right. +
    + + Getting started: Quickstart + +
    + +3. Once the table is created, click on the **Add new row** button to add the data to the table and click **Create**. +
    + + Getting started: Quickstart + +
    + +:::info +Learn more about the **[ToolJet Database here](/docs/tooljet-database)** +::: + +### Create a new application + +1. To create a new ToolJet application, go to the **Dashboard** -> **New App from scratch**. + +
    + + Getting started: Quickstart + +
    + + :::info + You can also use the existing UI **templates** for your application or **import** an application to your workspace. + ::: + +2. When you click on create new app the **App-builder** will open up. You can rename your application from `untitled` to **Support Tool** from the top left of app-builder. +
    + + Getting started: Quickstart + +
    + +### Build the UI + +1. Let's build the UI of the application by dragging and dropping the components on the canvas. +2. To build the UI, we will use: + 1. **Table** for displaying the customers data + 2. **Text** components for the Title and description of the app as the header + 3. **Text Input** component for getting product name input from the user + 4. **Number Input** component for getting product quantity and price input from the user + 5. **Button** component that will be used to trigger the query for inserting a row in the database using the button's **OnClick** event handler + +
    + + Getting started: Quickstart + +
    + +:::info +ToolJet application's User interface is constructed using Components like Tables, Forms, Charts, or Buttons etc. Check **Components Catalog** to learn more. +::: + +### Build queries and bind data to UI + +1. We can add a new datasource from the **Datasource manager** on the left-sidebar of the app builder but since we are using **ToolJet Database** we don't need to add any external datasource. Go to the **Query Panel -> Run ToolJetDb Query** +
    + + Getting started: Quickstart + +
    + + :::info + ToolJet can connect to several databases, APIs and external services to fetch and modify data. Check **Datasource Catalog** to learn more. + ::: + +2. Choose a **Table** from the dropdown, Select the **List rows** option from the **Operation** dropdown, You can leave other query parameters. Scroll down and enable **Run this query on application load** - this will trigger the query when the app is loaded. + +3. Click on **Create** to create the query and then click **Run** to trigger the query and get response. You can also check the query response by clicking **Preview** button without firing the query. +
    + + Getting started: Quickstart + +
    + +4. Go to the **Table properties** by clicking on the component handle and bind the data returned by the query in the **Table data** property. When building apps in ToolJet anything inside `{{}}` is JavaScript and we javascript dot notation to get the data from query and populate the table using **{{queries.tooljetdb1.data}}**. The table will be auto-populated once the table data is entered. +
    + + Getting started: Quickstart + +
    + +5. Let's create another query that will get the data from the **input fields** and will add a new row in the tooljet database. **Create New Query** -> **Select Table (Customers)** -> **Select Operation (Create row)** -> add the following columns with the respective value: + 1. **id** - `{{components.textinput1.value}}` + 2. **quantity** - `{{components.numberinput1.value}}` + 3. **price** - `{{components.numberinput2.value}}` + 4. **created_at** - `{{moment().format("DD/MM/YYYY hh:mm A")}}` (We are using **momentjs library** to get the current date from the system rather than getting input by the user ) + +
    + + Getting started: Quickstart + +
    + + :::tip + You can also add event handler to this query for **On Success** event to run the `tooljetdb1` query that populates the table, so that whenever this is successful the table is refreshed. + ::: + +6. Now, let's bind this query to the **Add Product** button. Click on the button handle to open its properties, **Add an handler** -> **Select Event (On Click)** -> **Select Action (Run Query)** -> **Select Query (tooljetdb2)**. +
    + + Getting started: Quickstart + +
    + +:::info +- You can manipulate the data returned by the queries using **Transformations** +- You can also **Run JS query** or **Python query** to perform custom behavior inside ToolJet +::: + +### Preview, Release and Share app + +1. Click on the **Preview** on the top-right of app builder to immediately check the currently opened version of the app in production. +2. Click on the **Release** button to publish the currently opneded version of the app and push the changes to production. +3. **Share** option allows you to share the **released version** of the application with other users or you can also make the app **public** and anyone with the URL will be able to use the app. + +:::tip +You can control how much access to users have to your ToolJet apps and resources using **Org Management**. +::: + +## What Can I Do With ToolJet + +If you are building internal tool for your organization, here are few tutorials of sample use-cases for you to get started: + +- **[Build a Feature Request Management App](https://youtu.be/c2sbFTDUMzs)** +- **[Build a Ticket Triaging App with Baserow and ToolJet](https://blog.tooljet.com/build-a-ticket-triaging-app-with-baserow-and-tooljet/)** +- **[Building a MinIO file explorer app](https://blog.tooljet.com/building-a-minio-file-explorer-app-in-30-minutes/)** +- **[Building a Google Cloud Storage (GCS) file explorer app](https://blog.tooljet.com/build-internal-file-explorer-application-using-google-cloud-storage-gcs-and-tooljet/)** +- **[Build an AWS S3 file explorer app](https://blog.tooljet.com/building-an-app-to-view-and-upload-files-in-aws-s3-bucket/)** +- **[Build Stripe Refund App](https://blog.tooljet.com/build-a-stripe-refund-tool-using-low-code/)** +- **[Build a WhatsApp CRM](https://blog.tooljet.com/build-a-whatsapp-crm-using-tooljet-within-10-mins/)** +- **[Build a cryptocurrency dashboard](https://blog.tooljet.com/how-to-build-a-cryptocurrency-dashboard-in-10-minutes/)** +- **[Build a Redis GUI](https://blog.tooljet.com/building-a-redis-gui-using-tooljet-in-5-minutes/)** + +Find more Tutorials on our **[Blog](https://blog.tooljet.com/)**. + +## For ToolJet Contributors + +To contribute to ToolJet code, plugins, and documentation, refer to our **[Contributing Guide](/docs/category/contributing-guide)**. + +[![GitHub contributors](https://img.shields.io/github/contributors/tooljet/tooljet)](https://github.com/ToolJet/ToolJet/contributors) +[![GitHub issues](https://img.shields.io/github/issues/ToolJet/ToolJet)](https://github.com/ToolJet/ToolJet/issues) +[![GitHub stars](https://img.shields.io/github/stars/ToolJet/ToolJet)](https://github.com/ToolJet/ToolJet/stargazers) +[![GitHub license](https://img.shields.io/github/license/ToolJet/ToolJet)](https://github.com/ToolJet/ToolJet) + + + + + +## Help and Support +- We have extensively documented the features of ToolJet, but in case you are stuck, please feel free to e-mail us at **hello@tooljet.com** +- If you are using ToolJet cloud, click on the chat icon at the bottom-left corner for instant help. +- If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. +- Feel free to join our highly active **[Slack Community](https://www.tooljet.com/slack)**. diff --git a/docs/versioned_docs/version-2.4.0/how-to/_category_.json b/docs/versioned_docs/version-2.4.0/how-to/_category_.json new file mode 100644 index 0000000000..cd5b99d44a --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "How To", + "position": 8, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/how-to/access-cellvalue-rowdata.md b/docs/versioned_docs/version-2.4.0/how-to/access-cellvalue-rowdata.md new file mode 100644 index 0000000000..f04cef2571 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/access-cellvalue-rowdata.md @@ -0,0 +1,115 @@ +--- +id: access-cellvalue-rowdata +title: Change text color in columns of the table +--- + +# Change text color in columns by accessing `cellValue` and `rowData` in the table + +In this how-to guide, we will build an app that will use a sample RestAPI to display the data in the table, and then we will change the text color of the columns according to the condition. + +- Let's start by creating a new application and then adding a table widget into the canvas. + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/newapp.gif) + +
    + +- Now go to the **Query Panel** at the bottom of the app editor and click on the `+` button. +- Choose **RestAPI** data source + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/restapi.png) + +
    + +- Now we will use a sample RestAPI endpoint - I have used the API provided by **coinstats.app**, API-URL: +https://api.coinstats.app/public/v1/coins?skip=0&limit=100¤cy=USD +- Choose `GET` method, enter the request URL (API URL in previous step), name the query - I have named it `crypto`, and then **Create** the query + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/apiendpoint.png) + +
    + +- Now hit the **Run** button next to the query name to run the query. + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/runquery.png) + +
    + +- Once you run the query, you can check the data returned by the query in the **Inspector** on the left sidebar. + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/inspectord.png) + +
    + +- Now that we have got the data, we will display it on the table. To do this, click on the widget handle of the table to open its properties in the right sidebar. +- In the Table Data field, enter `{{queries.crypto.data.coins}}` - as you can see in the screenshot of the inspector the data is inside the `coins` array. You'll see the data in the Preview(green box) below the field. + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/data.png) + +
    + +- Let's add the columns that we want to display on the table. Go to the **Columns** section, Add columns, set their Names, and set **key** for each column. I have added 5 columns: **Rank**, **Name**, **Symbol**, **Price**, and **Market Cap**. + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/columns.png) + +
    + +- Once you've added the columns, you'll get the table like this: + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/table.png) + +
    + +### Using cellValue to change column text color + +Now that we have our data on the table, we will change the color of the text in the **Price** and **Market Cap** columns. + +- Edit table properties, go to **Columns**, and click on the Price Column to open its properties. +- For **Price** column, we want to change color of those cells who have value which is greater than 1000 to red else to green if it is less than 1000. So to do this, we will set a condition in **Text Color** property of this column: `{{cellValue >= 1000 ? 'red' : 'green'}}` + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/price.png) + +
    + +- Similarly, we will do for **Market Cap** column. We want to change the text color of those cells who have value which is greater than 60000000000 to red else to green if it is less than 60000000000. so the condition will be `{{cellValue >= 60000000000 ? 'red' : 'green'}}` +- Now the text color of cells in the columns will be updated. + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/cellvalue.png) + +
    + +:::info +You can also use Hex Color Code instead of mentioning color in plane text. +::: + +### Using rowData to change column text color + +- To change the color of the text using `rowData` variable it is required to mention the column name whose cell value we will be comparing in the condition. Let's take a look by changing the text color of **Symbol** column. +- We will add a condition to look in the row data and if the row has column called `name` which has value `Solana` then it should change the color to red else the color should be green. +- Edit the properties of the Symbol column, set the **Text Color** field value to `{{rowData.name === 'Solana' ? 'red' : 'green'}}`. +- You'll see that in the Symbols column all the values has become green except the one that has Solana in Name column. + +
    + +![ToolJet - How To - Change text color in columns of the table](/img/how-to/change-text-color/rowData.png) + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/how-to/access-users-groups.md b/docs/versioned_docs/version-2.4.0/how-to/access-users-groups.md new file mode 100644 index 0000000000..4fdf9cabe0 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/access-users-groups.md @@ -0,0 +1,54 @@ +--- +id: access-currentuser +title: Enable/Disable a component using current user's property +--- + +# Enable/Disable a component using current user's property + +Let's take look at the exposed variables of the current user property: + +- **email** : The value can accessed using `{{globals.currentUser.email}}` +- **firstName** : The value can accessed using `{{globals.currentUser.firstName}}` +- **lastName** : The value can accessed using `{{globals.currentUser.lastName}}` +- **lastName** : The value can accessed using `{{globals.currentUser.lastName}}` +- **groups** : By default, the admin will be in the two groups `all_users` and `admin`, and any user who is not admin will always be in the `all_users` group by default. Since the **groups** is an array you’ll have to provide the index ([0], [1], and so on) to return the group name. The value can be accessed using `{{globals.currentUser.groups[1]}}`. + +
    + +Properties of current user + +
    + +### Example: Disable a button if a user is not admin + +- Click on the **Button** handle to open its properties, on the **Styles** tab go to the **Disable** property. + +
    + + Properties of button + +
    + +- Set a condition on the Disable field so that if the the user who is using the app does not have **admin** value in the first index of **groups** array return **true**. The condition can be: + + ```javascript + {{globals.currentUser.groups[1] !== "admin" ? true : false}} + ``` + +
    + + Disable Property of button + +
    + +- Now, when you'll **release** the app, if the user is not is not admin the button will be disabled. + +
    + + Released button disabled when user is not admin + +
    + +:::info +In this how-to we have used the **Groups** property of the **Current User**. You can use any of the exposed variables mentioned above according to your use. +::: diff --git a/docs/versioned_docs/version-2.4.0/how-to/access-users-location.md b/docs/versioned_docs/version-2.4.0/how-to/access-users-location.md new file mode 100644 index 0000000000..a366287a5e --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/access-users-location.md @@ -0,0 +1,85 @@ +--- +id: access-users-location +title: Access a user's location +--- + +# Access a user's location using RunJS query (Geolocation API) + +In this how-to guide, we will build a ToolJet application that will utilize the **JavaScript Geolocation API** to get the user's location. The Geolocation API provides access to geographical location data associated with a user's device. This can be determined using GPS, WIFI, IP Geolocation and so on. + +:::info +To protect the user's privacy, Geolocation API requests permission to locate the device. If the user grants permission, you will gain access to location data such as latitude, longitude, altitude, and speed. +::: + +- Let's start by creating a new application + +
    + + New App + +
    + +- In the app editor, go to the query panel at the bottom and create a **[RunJS query](/docs/data-sources/custom-js)** by selecting **Run JavaScript Code** as the datasource + +
    + + New App + +
    + +- You can use the following javascript code that makes use of geolocation api to get the location + + ```js + function getCoordinates() { + return new Promise(function(resolve, reject) { + navigator.geolocation.getCurrentPosition(resolve, reject); + }); + } + + async function getAddress() { + // notice, no then(), cause await would block and + // wait for the resolved result + const position = await getCoordinates(); + let latitude = position.coords.latitude; + let longitude = position.coords.longitude; + + return [latitude, longitude]; + } + + return await getAddress() + ``` + +- Now, go to the **Advanced** tab and enable the `Run query on page load?` option. Enabling this option will run this javascript query every time the app is opened by the user and the query will return the location + +- **Save** the query and hit the fire button + +- As soon as you hit the fire button, the browser will prompt you to allow the permission to share the location access to ToolJet app. You'll need to **allow** it to return the location data + +
    + + New App + +
    + +- Now, to check the data returned by the query go to the **Inspector** on the left sidebar. Expand the queries -> `runjs1`(query name) -> and then expand the **data**. You'll find the coordinates + +
    + + New App + +
    + +- Next, we can use these coordinates returned by the query on the **map component** to show the location. Drop a map component on the canvas and edit its properties. In the **Initial location** property, enter + + ```js + {{ {"lat": queries.runjs1.data[0], "lng": queries.runjs1.data[1]} }} + ``` + +
    + + New App + +
    + +- Finally, you'll see the location updated on the **map component** + diff --git a/docs/versioned_docs/version-2.4.0/how-to/build-plugin-for-marketplace.md b/docs/versioned_docs/version-2.4.0/how-to/build-plugin-for-marketplace.md new file mode 100644 index 0000000000..301121b4e6 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/build-plugin-for-marketplace.md @@ -0,0 +1,381 @@ +--- +id: build-plugin-for-marketplace +title: Build a new plugin for marketplace +--- + +## Introduction + +ToolJet marketplace is a place where you can find custom plugins and install them in your ToolJet instance. This document will help you to build a new plugin for ToolJet marketplace. + +## Prerequisites +- [Node.js](https://nodejs.org/en/download/) (v18.3.0) +- [npm](https://www.npmjs.com/get-npm) (v8.11.0) + +## Getting started +### 1. Enabling the marketplace for your instance +To enable the marketplace for your instance, you need to set the `ENABLE_MARKETPLACE` environment variable to `true` in your `.env` file. +Marketplacwe is disabled by default. +Once you set the environment variable, restart your ToolJet instance. You can find the instructions to run ToolJet locally [here](/docs/setup/). +Marketplace can be accessed from '/integrations' route. + +### 2. Installing tooljet-cli +ToolJet marketplace uses [tooljet-cli](https://www.npmjs.com/package/@tooljet/cli) to build and publish plugins. You can install it using npm. +```bash +npm install -g tooljet-cli + +# verify the installation +tooljet --version +``` + +### 3. Creating a new plugin - Github plugin +Let's create a new Github plugin for ToolJet marketplace, which will authenticate a user using Github Personal Access Token and will include basic operations like fetching user details, fetching repositories, fetching issues and fetching pull requests. + +```bash +# create a new plugin +tooljet plugin create github +``` +Provide the plugin name and select the plugin type, which is a `api` in this case. +Select `yes` when asked to create a new plugin for marketplace. + +Provide the repository URL if hosted on GitHub, otherwise leave it blank. + +When you create a plugin using the ToolJet CLI, an object is automatically added to the plugins.json file, which is located in the `ToolJet/server/src/assets/marketplace/` directory. This object contains metadata about the plugin, such as its name, description, version, author, and other details. +This plugins.json file serves as a registry of all the plugins that are available for use in ToolJet. When ToolJet server starts up, it reads this file and loads all the plugins that are listed in it. + +:::note +It's important to note that the plugins.json file should not be manually edited as it is automatically generated by the ToolJet CLI. Any changes made to this file may cause issues with the proper functioning of the plugins in the system. +::: + +All marketplace plugins are stored in the `/marketplace` directory of the ToolJet repository. You can find the Github plugin [here](https://github.com/ToolJet/ToolJet/tree/develop/marketplace/plugins/github). + +The directory structure of a typical ToolJet plugin looks like this: + +```bash +github/ + package.json + lib/ + icon.svg + index.ts + operations.json + manifest.json +``` + +- manifest.json should include information such as the name of plugin, description, etc. +- operations.json should include the metadata of all the operations supported by the plugin. +- index.ts is the main file. It defines a QueryService for the plugin. The QueryService handles running of queries, testing connections, caching connections, etc. +- icon.svg is the icon for the plugin. +- package.json is auto generated by the cli. + + +:::info +**Why do we need a manifest.json file or a operations.json file?** + +The manifest.json files are consumed by a React component to create dynamic UI for connection forms by defining the schema of an API or data source. The schema includes information about the source, such as its name, type, and any exposed variables. It also includes options for authentication and other properties that can be customized by the user. The properties section defines the specific fields and their types that are required for connecting to the API or data source. The React component reads the manifest.json file and generates the necessary UI components based on the schema, allowing users to enter the required information for connecting to the source. This can include text inputs, dropdowns, checkboxes, and other UI elements, depending on the schema defined in the manifest.json file. + +The operations.json file contains a schema definition for a particular data source, for example, Github. It describes the available operations and their parameters that can be used to query the data source. + +A React component uses this schema to create queries in ToolJet applications to generate a UI that allows users to select the desired operation and provide the required parameters. + +The component would use the properties defined in the operations.json file to create various UI elements, such as dropdowns, and input fields, and handle user interactions to create the final query. Once the user has filled in the required parameters, the component would use them to generate a query that can be executed against the data source, and return the results to the user. + +In conclusion, *manifest.json* and *operations.json* files play an important role in creating dynamic UI components in ToolJet applications. These files define the schema for data sources and available operations, which is then consumed by React components to generate the necessary UI elements for users to interact with. By using these files, ToolJet enables users to easily connect to various APIs and data sources, perform queries and retrieve data in a user-friendly way. +::: + + +### 4. Defining the manifest.json file +We need to include the necessary options to construct the connection form. +```json + "properties": { + "credentials": { + "label": "Authentication", + "key": "auth_type", + "type": "dropdown-component-flip", + "description": "Single select dropdown for choosing credentials", + "list": [ + { + "value": "personal_access_token", + "name": "Use Personal Access Token" + } + ] + + }, + "personal_access_token": { + "token": { + "label": "Token", + "key": "personal_token", + "type": "password", + "description": "Enter personal access token", + "hint": "You can generate a personal access token from your Github account settings." + } + } + } +``` +It includes information about authentication options, specifically a dropdown to choose a type of credentials and a field to enter a personal access token. The label, key, type, description, and hint properties are used to define the specific fields and their types required for connecting to the API or data source. + +### 5. Defining the operations.json file +```json + "properties": { + "operation": { + "label": "Operation", + "key": "operation", + "type": "dropdown-component-flip", + "description": "Single select dropdown for operation", + "list": [ + { + "value": "get_user_info", + "name": "Get user info" + }, + { + "value": "get_repo", + "name": "Get repository" + }, + { + "value": "get_repo_issues", + "name": "Get repository issues" + }, + { + "value": "get_repo_pull_requests", + "name": "Get repository pull requests" + } + ] + }, + "get_user_info": { + "username": { + "label": "Username", + "key": "username", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter username", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "Enter username" + } + }, + "get_repo": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + } + }, + "get_repo_issues": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + }, + "state": { + "label": "State", + "key": "state", + "className": "codehinter-plugins col-4", + "type": "dropdown", + "description": "Single select dropdown for choosing state", + "list": [ + { + "value": "open", + "name": "Open" + }, + { + "value": "closed", + "name": "Closed" + }, + { + "value": "all", + "name": "All" + } + ] + } + }, + "get_repo_pull_requests": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + }, + "state": { + "label": "State", + "key": "state", + "type": "dropdown", + "className": "codehinter-plugins col-4", + "description": "Single select dropdown for choosing state", + "list": [ + { + "value": "open", + "name": "Open" + }, + { + "value": "closed", + "name": "Closed" + }, + { + "value": "all", + "name": "All" + } + ] + } + } + } +``` +The operations.json file defines the operations that can be performed on the data source. It includes information about the operation type, the fields required to perform the operation, and the type of each field. The label, key, type, description, and hint properties are used to define the specific fields and their types required for connecting to the API or data source. + +### 6. Add the npm package of Gitub to the plugin dependencies + +```bash +# change directory to the plugin directory and install the npm package +cd plugins/github +npm i octokit --workspace=@tooljet-marketplace/github +``` + +:::info +Steps to install npm package to a plugin + +```bash +npm i --workspace= +``` + +The command `npm i --workspace=` is used to install a specific npm package into a particular workspace of a multi-package repository. + +The *--workspace* flag is used to specify the workspace where the package should be installed. In this case, we are installing the package in the *@tooljet-marketplace/github* workspace. +::: + +### 7. Implement the query execution logic in index.ts +The QueryService for the Github plugin handles the logic for running queries in index.ts. The QueryService receives the metadata of the data source, including the credentials and configurations for connecting and parameters for the query that was run. + +For the Github datasource, the sourceOptions will include the credentials required for authentication, such as the personal access token. The queryOptions will have the configurations and parameters for the specific query, including the operation to be performed, such as getting the list of repositories for a specific user. + +The QueryService will use this information to create and execute the necessary API requests against the Github API. The resulting data will be returned to the caller, which can then be further processed as required. + + +Create a new file query_operations.ts in the plugins/github/src directory and add the following code to it. +```typescript +import { Octokit } from 'octokit' +import { QueryOptions } from './types' + + +export async function getUserInfo(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /users/{username}', + { + username: options.username + } + ); + return data; +} + +export async function getRepo(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}', + { + owner: options.owner, + repo: options.repo + } + ); + return data; +} + +export async function getRepoIssues(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}/issues', + { + owner: options.owner, + repo: options.repo, + state: options.state || 'all' + + } + ); + return data; +} + +export async function getRepoPullRequests(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}/pulls', + { + owner: options.owner, + repo: options.repo, + state: options.state || 'all' + } + ); + return data; +} + +``` + +The query_operations.ts file contains the functions that will be used to execute the queries. The functions will be called by the QueryService in index.ts. + +The Github class has three methods: +- run: This method is called when a query needs to be executed. It takes in *sourceOptions* and *queryOptions* as input, which represent the source metadata and the query configuration, respectively. The run method uses the octokit library to make API requests to the GitHub API and returns the result of the query in a QueryResult object. + +- testConnection: When a new data source is being added to a ToolJet application, the connection can be tested. +This method is called when a connection needs to be tested. It takes in sourceOptions as input, which represents the source metadata. The testConnection method tests the connection by attempting to get the authenticated user and returns a ConnectionTestResult object that indicates whether the connection was successful or not. + +:::note +Every data source might not have a way to test connection. If not applicable for your data source, you can disable the test connection feature by adding "customTesting": true, to the manifest.json of your plugin. +:: + +- getConnection: This method is a helper method that returns an authenticated octokit client that is used to make requests to the GitHub API. It takes in sourceOptions as input, which represents the source metadata, and returns an authenticated octokit client. + + + + + + + + + + + + + + diff --git a/docs/versioned_docs/version-2.4.0/how-to/bulk-update-multiple-rows-in-table.md b/docs/versioned_docs/version-2.4.0/how-to/bulk-update-multiple-rows-in-table.md new file mode 100644 index 0000000000..af9ccf6693 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/bulk-update-multiple-rows-in-table.md @@ -0,0 +1,115 @@ +--- +id: bulk-update-multiple-rows +title: Bulk update multiple rows in table +--- + +# Bulk update multiple rows in table + +Currently, the datasources in ToolJet have operation for **bulk update(GUI mode)** but that only works for changes made in the single row. We will soon be adding a new operation for bulk updating the multiple rows but for now we can bulk update multiple rows by creating a Custom JS query. + +In this guide, We have assumed that you have successfully connected the data source. For this guide, we will be using the PostgreSQL data source as an example database, currently, this workaround can be used only for PostgreSQL and MySQL. + +## 1. Create a query to get the data from the database + +Let's create the query that will be getting the data from the database: + +
    + +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/postgres1.png) + +
    + +## 2. Display the data on the table + +- Drag a **Table** widget on the canvas and click on its handle to open the properties on the left sidebar +- Edit the **Table data** field value and enter **`{{queries.postgresql1.data}}`** + +
    + +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/showData.png) + +
    + +## 3. Make the columns editable + +- Go to the **Columns**, Add or edit columns section and enter the **Column Name** that you want to display on the table and the **Key** name. Key is the name of the column in your database. +- Enable the toggle for **Make editable** for the columns that you want to be editable. + +
    + +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/columns.png) + +
    + +## 4. Enable bulk update options for table widget + +- Go to the **Options** section and enable the **Show update buttons**. Enabling this will add two buttons - **Save Changes** and **Discard Changes** at the bottom of the table, only when any cell in the table is edited. +- You can also enable highlight selected row.(**Optional**) + +
    + +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/options.png) + +
    + +## 5. Create a Custom JS query + +We will create a new Custom JS query(**runjs1**) that will generate SQL query for updating multiple rows. + +```js +const uniqueIdentifier = "id" +const cols = Object.values(components.table1.changeSet).map((col, index) => { + return { + col: Object.keys(col), + [uniqueIdentifier]: Object.values(components.table1.dataUpdates)[index][uniqueIdentifier], + values: Object.values(col), + }; +}); + +const sql = cols.map((column) => { + const { col, id, values } = column; + const cols = col.map((col, index) => `${col} = '${values[index]}'`); + return `UPDATE users SET ${cols.join(", ")} WHERE id = '${id}';`; +}); + +return sql +``` +:::info +Here the **Unique identifier** is **id**, this is the column name that is used to identify the row in the database. +Update the **Unique identifier** if you are using a different column name. +::: +
    + +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/runjs1.png) + +
    + +## 6. Create an Update query + +Let's create a new PostgreSQL query and name it `update`. In **SQL mode**, enter `{{queries.runjs1.data.join(' ')}}` and **Save** it. + +
    + +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/update.png) + +
    + +## 7. Creating a flow for queries + +- Click on the handle of the **Table** widget to open its properties +- Go to the **Events**, and add a handler +- Select **Bulk Update** in Events, **Run Query** in Actions, and then select the **runjs1** query in Query. Now whenever a user will edit the table and hit the **Save Changes** button runjs1 will run. + +
    + +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/event.png) + +
    + +- Now, go to the **Advanced** tab of **runjs1** and add a handler to run update query for **Query Success** Event. Now whenever the runjs1 query will be run - the update operation will be performed on the database. + +
    + +![ToolJet - How To - Bulk update multiple rows in table](/img/how-to/bulk-update-multiple/success.png) + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/how-to/import-external-lib-js.md b/docs/versioned_docs/version-2.4.0/how-to/import-external-lib-js.md new file mode 100644 index 0000000000..27b6b49c97 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/import-external-lib-js.md @@ -0,0 +1,96 @@ +--- +id: import-external-libraries-using-runjs +title: Import external libraries using RunJS +--- + +ToolJet allows you to utilize external libraries in your app by importing them using the [RunJS query](/docs/data-sources/run-js). + +In this how-to guide, we will import a few JavaScript libraries and use it in the application. + +:::tip +You can import any of the available libraries using their **CDN**. Find free CDN of the open source projects at **[jsDelivr](https://www.jsdelivr.com/)** +::: + +- Create a new application and then create a new RunPy query from the query panel. +
    + + Import external libraries using RunJS + +
    + +- Let's write some code for importing libraries. We will first create a function `addScript` that returns a `Promise`, the `Promise` creates a script tag -> sets an attribute -> and eventListener `resolves` if its loaded and `rejects` if there is an error, and then body is appended at the end. +- We are going to import two libraries using their CDNs: **MathJS** and **Flatten**, and display an alert when the libraries are loaded successfully. + ```js + function addScript(src) { + return new Promise((resolve, reject) => { + const s = document.createElement('script'); + s.setAttribute('src', src); + s.addEventListener('load', resolve); + s.addEventListener('error', reject); + document.body.appendChild(s); + }); + } + + try { + await addScript('https://cdn.jsdelivr.net/npm/mathjs@11.7.0'); + await addScript('https://cdn.jsdelivr.net/npm/flattenjs@2.1.3/lib/flatten.min.js'); + + await actions.showAlert("success", 'Mathjs and Flatten imported') + + + } catch (e) { + console.log(e); + } + ``` + +- Now, when you hit **create** and then **run** the query, the script will be injected into the DOM. An alert should pop-up with the message **Mathjs and Flatten imported**. + +
    + + Import external libraries using RunJS + +
    + +:::tip +Enable the **Run this query on application load?** option to make the libraries available throughout the application as soon as the app is laoded. +::: + +## Examples + +### Flatten the JSON objects using FlattenJS + +- Let's create a new **RunJS** query that will use **Flatten** library(imported in the above section) and the query will flatten the JSON object. + ```js + return flatten({ + key1: { + keyA: 'valueI' + }, + key2: { + keyB: 'valueII' + }, + key3: { a: { b: { c: 2 } } } + }) + ``` +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
    + + Import external libraries using RunJS + +
    + +### Computation using MathJS + +- Let's create a new **RunJS** query that will return the result of calculation performed by [atan2](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2) method and then divided by [pi](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/PI). +```js +return math.atan2(3, -3) / math.pi +``` + +- Save the query, you can either **Preview** the output on the query manager or **Run** the query to check the output on the inspector on the left-sidebar. + +
    + + Import external libraries using RunJS + +
    + \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/how-to/import-external-lib-py.md b/docs/versioned_docs/version-2.4.0/how-to/import-external-lib-py.md new file mode 100644 index 0000000000..7c805bcef6 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/import-external-lib-py.md @@ -0,0 +1,98 @@ +--- +id: import-external-libraries-using-runpy +title: Import external libraries using RunPy +--- + +ToolJet allows you to utilize python packages in your app by importing them using the [RunPy query](/docs/data-sources/run-py). +In this how-to guide, we will import a few packages and use it in the application. + +:::caution Unsupported modules +The modules that are not currently supported in Pyodide are those that have C or C++ extensions that rely on system libraries. These modules cannot be used in Pyodide because it runs in a web browser, which does not have access to the underlying system libraries that the C or C++ extensions rely on. Additionally, Pyodide uses a version of Python that has been compiled to WebAssembly, which does not support the same system calls as a regular version of Python. Therefore, any module that requires access to system libraries or system calls will not work in Pyodide. +::: + +- Create a new application and then create a new RunPy query from the query panel. +
    + + Import external libraries using RunPy + +
    + +- Let's write some code for importing packages. We will first import the micropip which is a package installer for Python and then we will install the `Pandas` and `NumPy` using micropip. **Run** the query to install the packages. + ```python + import micropip + await micropip.install('pandas') + await micropip.install('numpy') + ``` + +
    + + Import external libraries using RunPy + +
    + +:::tip +Enable the **Run this query on application load?** option to make the packages available throughout the application. +::: + +## Examples + +### Array of random numbers of using NumPy + +- Let's create a **RunPy** query that will use **random** module from the **NumPy** package and the query will generate array of random numbers. + ```python + from numpy import random + + x = random.binomial(n=10, p=0.5, size=10) + + print(x) + ``` + +
    + + Import external libraries using RunPy + +
    + +:::info +You can check the output on the browser's console. +::: + +### Parse CSV data + +- Let's create a RunPy query that will parse the data from the csv file. In this query we will use `StringIO`, `csv`, and `Pandas` module. + ```python + from io import StringIO + import csv + import pandas as pd + + scsv = components.filepicker1.file[0].content + + f = StringIO(scsv) + reader = csv.reader(f, delimiter=',') + + df = pd.DataFrame(reader) + + print(df.info()) + print(df) + ``` + +
    + + Import external libraries using RunPy + +
    + +- Add a file picker component on the canvas and set a event handler for **On file loaded** event to **Run Query** that we created for parsing the data. +
    + + Import external libraries using RunPy + +
    + +- Finally, let's load a csv file on the file picker and check the output by the RunPy query on the browser console. +
    + + Import external libraries using RunPy + +
    + \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/how-to/loading-image-pdf-from-db.md b/docs/versioned_docs/version-2.4.0/how-to/loading-image-pdf-from-db.md new file mode 100644 index 0000000000..2028f8e5b2 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/loading-image-pdf-from-db.md @@ -0,0 +1,45 @@ +--- +id: loading-image-pdf-from-db +title: Loading image/PDF from base64 string +--- + +In this how-to guide we will see how we can load an image or PDF file using the base64 string available on the database. In this how-to, we have used the postgres database which already has the base64 strings for the image or the PDF files available. + +- Let's drag a **filepicker** component onto the canvas, and pick one image and one pdf file +
    + + Loading image from base64 string + +
    + +- Now, create a query for inserting an image from the filepicker. As you can see in the screenshot below, we are using the **exposed variable** of the filepicker component to retrieve the **base64** data of the uploaded files. +
    + + Loading image from base64 string + +
    + +- Create another query for returning the data from the database and we will use this base64 data returned in this query to display on the image and pdf components. +
    + + Loading image from base64 string + +
    + +- Drag the image and a PDF component on the canvas. Edit the property of the PDF component and in the **file URL** enter: + ```js + {{'data:image/png;base64,' + queries.get.data[7].pdf}} + ``` + Similarly for the image component: + ```js + {{'data:image/jpeg;base64,' + queries.get.data[7].image}} + ``` +
    + + Loading image from base64 string + +
    + +:::info +You can also use transformations in the query response and concat `data:image/jpeg;base64,` to the base64 data. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/how-to/oauth2-authorization.md b/docs/versioned_docs/version-2.4.0/how-to/oauth2-authorization.md new file mode 100644 index 0000000000..e2fd0c5236 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/oauth2-authorization.md @@ -0,0 +1,66 @@ +--- +id: oauth2-authorization +title: REST API authentication using OAuth 2.0 +--- + +# REST API authentication using OAuth 2.0 + +ToolJet’s REST API data source supports OAuth 2.0 as the authentication type. In this guide, we’ll learn how to use **Google OAuth2 API** to delegate authorization and authentication for your ToolJet Application. + +Before setting up the REST API data source in ToolJet, we need to configure the **Google Cloud Platform** to gather the API keys required for the authorization access. + +## Setting up Google Cloud Platform + +Google Cloud Platform provides access to more than 350 APIs and Services that can allow us to access data from our Google account and its services. Let's create an OAuth application that can be given permission to use our Google profile data such as Name and Profile picture. + +1. Sign in to your [Google Cloud](https://cloud.google.com/) account, and from the console create a New Project. +2. Navigate to the **APIs and Services**, and then open the **OAuth consent screen** section from the left sidebar. +3. Enter the Application details and select the appropriate scopes for your application. We will select the profile and the email scopes. +4. Once you have created the OAuth consent screen, Create new credentials for the **OAuth client ID** from the **Credentials** section in the left sidebar. +5. Select the application type, enter the application name, and then add the following URIs under Authorised Redirect URIs: + 1. `https://app.tooljet.com/oauth2/authorize` (if you’re using ToolJet cloud) + 2. `http://localhost:8082/oauth2/authorize` (if you’re using ToolJet locally) +6. Now save and then you’ll get the **Client ID and Client secret** for your application. + +ToolJet - How To - REST API authentication using OAuth 2.0 + +## Configuring ToolJet Application with Google's OAuth 2.0 API + +Let's follow the steps to authorize ToolJet to access your Google profile data: + +- Select **add data source** from the left sidebar, and choose **REST API** from the dialog window. + +:::info +You can rename the data source by clicking on its default name `REST API` +::: + +- In the **URL** field, enter the base URL `https://www.googleapis.com/oauth2/v1/userinfo`; the base URL specifies the network address of the API service. +- Select authentication type as `OAuth 2.0` +- Keep the default values for **Grant Type**, **Add Access Token To**, and **Header Prefix** i.e. `Authorization Code`, `Request Header`, and `Bearer` respectively. +- Enter **Access Token URL**: `https://oauth2.googleapis.com/token`; this token allows users to verify their identity, and in return, receive a unique access token. +- Enter the **Client ID** and **Client Secret** that we generated from the [Google Console](http://console.developers.google.com/). +- In the **Scope** field, enter `https://www.googleapis.com/auth/userinfo.profile`; Scope is a mechanism in OAuth 2.0 to limit an application's access to a user's account. Check the scopes available for [Google OAuth2 API here](https://developers.google.com/identity/protocols/oauth2/scopes#oauth2). +- Enter **Authorization URL:** `https://accounts.google.com/o/oauth2/v2/auth`; the Authorization URL requests authorization from the user and redirects to retrieve an authorization code from identity server. +- Create three **Custom Authentication Parameters:** + + | params | description | + | ----------- | ----------- | + | response_type | code ( `code` refers to the Authorization Code) | + | client_id | **Client ID** | + | redirect_uri | `http://localhost:8082/oauth2/authorize` if using ToolJet locally or enter this `https://app.tooljet.com/oauth2/authorize` if using ToolJet Cloud. | + +- Keep the default selection for **Client Authentication** and **Save** the data source. + +ToolJet - How To - REST API authentication using OAuth 2.0 + +## Create the query + +Let’s create a query to make a `GET` request to the URL, it will pop a new window and ask the user to authenticate against the API. + +- Add a new query and select the REST API datasource from the dropdown +- In the **Method** dropdown select `GET` and in advance tab toggle `run query on page load?` +- **Save** and **Run** the query. + +ToolJet - How To - REST API authentication using OAuth 2.0 + +A new window will pop for authentication and once auth is successful, you can run the query again to get the user data like Name and Profile Picture. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/how-to/run-action-from-runjs.md b/docs/versioned_docs/version-2.4.0/how-to/run-action-from-runjs.md new file mode 100644 index 0000000000..6e70d38c1f --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/run-action-from-runjs.md @@ -0,0 +1,206 @@ +--- +id: run-actions-from-runjs +title: Run Actions from RunJS query +--- + +# Run `Actions` from RunJS query + +Now you can trigger all the `actions` available in ToolJet from within the `RunJS` query. This guide includes the syntax for each action along with the example. + +### Run Query + +**Syntax:** + +```js +queries.queryName.run() +``` +or +```js +await actions.runQuery('queryName') +``` + +**Example:** In the screenshot below, we are triggering the two different queries `customers` and `getData` using the two different syntax available for `Run Query` action. + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/runquery.png) + +
    + +### Set Variable + +**Syntax:** + +```javascript +actions.setVariable(variableName, variableValue) +``` + +**Example:** In the screenshot below, we are setting the two variables `test` and `test2`. `test` variable includes a numerical value so we haven't wrapped it inside the quotes but the variable `test2` is a string so we have wrapped it in quotes. + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/setvariable.png) + +
    + +### Unset Variable + +**Syntax:** + +```javascript +actions.unSetVariable(variableName) +``` + +**Example:** In the screenshot below, we are unsetting the variable `test2` that we created in the previous step. + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/unsetvariable.png) + +
    + +### Logout + +**Syntax:** + +```javascript +actions.logout() +``` + +**Example:** Triggering `actions.logout()` will log out the current logged in user from the ToolJet and will redirect to sign in page. + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/logout.png) + +
    + +### Show Modal + +**Syntax:** + +```javascript +actions.showModal('modalName') +``` + +**Example:** In the screenshot below, there is a modal on the canvas (renamed it to `formModal` from `modal1`) and we are using RunJS query to show the modal. + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/showmodal.png) + +
    + +### Close Modal + +**Syntax:** + +```javascript +actions.closeModal('modalName') +``` + +**Example:** In the screenshot below, we have used RunJS query to close the modal that we showed up in previous step. + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/closemodal.png) + +
    + +### Set Local Storage + +**Syntax:** + +```javascript +actions.setLocalStorage('key','value') +``` + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/setlocalstorage.png) + +
    + +### Copy to Clipboard + +**Syntax:** + +```javascript +actions.copyToClipboard('contentToCopy') +``` + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/copytoclipboard.png) + +
    + +### Generate File + +**Syntax:** + +```javascript +actions.generateFile('fileName', 'fileType', 'data') +``` + +**Example:** `fileName` is the name that you want to give the file(string), `fileType` can be `csv` or `text`, and `data` is the data that you want to store in the file. + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/generatefile.png) + +
    + +### Go to App + +**Syntax:** + +```javascript +actions.goToApp('slug',queryparams) +``` + +- `slug` can be found in URL of the released app after the `application/`, or in the `Share` modal +- `queryparams` can be provided like this `[{"key":"value"}, {"key2":"value2"}]` + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/gotoapp1.png) + +
    + +### Show Alert + +**Syntax:** + +```javascript +actions.showAlert(alert type , message ) // alert types are info, success, warning, and danger + +ex: +actions.showAlert('error' , 'This is an error' ) +``` + +
    + +![ToolJet - How To - Run Actions from RunJS query](/img/how-to/run-actions-from-runjs/showalert.png) + +
    + +## Run multiple actions from runjs query + +To run multiple actions from a runjs query, you'll have to use **async-await** in the function. + +Here is a example code snippet for running the queries and showing alert after specific intervals. Check the complete guide on running queries at specified intervals **[here](/docs/next/how-to/run-query-at-specified-intervals)**. + +```js +actions.setVariable('interval',setInterval(countdown, 5000)); +async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') +} +``` + + + + + diff --git a/docs/versioned_docs/version-2.4.0/how-to/run-query-at-specified-intervals.md b/docs/versioned_docs/version-2.4.0/how-to/run-query-at-specified-intervals.md new file mode 100644 index 0000000000..50ff8b5f3f --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/run-query-at-specified-intervals.md @@ -0,0 +1,51 @@ +--- +id: run-query-at-specified-intervals +title: Run query at specified intervals +--- + +In this how-to guide, we will learn how to make a query trigger at the specific intervals. + +- Let's go to the ToolJet dashboard and **create a new application** +- Once the app builder opens up, drag a **table** component to canvas +- Now, create a new REST API query from the query panel at the bottom of the app builder. We will be using the data from the mock **REST API** and then load the data on the table. Let's create a REST API, choose `GET` method from the dropdown, enter the endpoint `(https://jsonplaceholder.typicode.com/posts)`, name the query `post` and then **save and run** it +
    + + REST API query + +
    +- Go to the **Table properties** and add connect the query data to table by adding value to **table data** property which is `{{queries.post.data}}` +
    + + REST API query + +
    + +- Now, we will create a RunJS query that will first set a variable called `interval` which will include the value returned by the `setInterval()` method that calls a function `countdown` at specified intervals. The countdown function has the code to trigger the `post` query that we created in the previous step. + + ```js + actions.setVariable('interval',setInterval(countdown, 5000)); + function countdown(){ + queries.post.run() + } + ``` + - Or use **async**-**await** in the function, if you're triggering multiple actions: + ```js + actions.setVariable('interval',setInterval(countdown, 5000)); + async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') + } + ``` +- Go to the **Advanced** tab of the query, enable `Run query on page load?` this will trigger this RunJS query when the app is loaded. Name the query as `set` and **Save** it. Note that you will have to save the query and not `Save and Run` because doing it will trigger the query and you won't be able to stop the query unless you reload the page or go back to dashboard. +
    + + REST API query + +
    +- To prevent the query from triggering indefinitely, we will create another RunJS query that will make use of `clearInterval()` method. In this method we will get the value from the variable that we created in `set` query. Save this query as `clear`. + ```js + clearInterval(variables.interval) + ``` +- Finally, let's add a **button** on to the canvas and add the **event handler** to the button to run the `clear` query. +- Now, whenever the app will be loaded the **set** query will be triggered and will keep triggering the `post` query at the specified intervals. Whenever the user wants to **stop** the query they can click on the **button** to trigger the **clear** query which will clear the interval. diff --git a/docs/versioned_docs/version-2.4.0/how-to/s3-custom-endpoint.md b/docs/versioned_docs/version-2.4.0/how-to/s3-custom-endpoint.md new file mode 100644 index 0000000000..da3d77558c --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/s3-custom-endpoint.md @@ -0,0 +1,18 @@ +--- +id: s3-custom-endpoints +title: Use custom endpoint for s3 hosts +--- + +In this how-to guide, we will see how we can connect to different **S3 compatible object storages** using the custom endpoint. In this guide, we are using Minio since it is an S3-compatible object storage. + +- Go to the ToolJet dashboard, and create a new application +- On the left-sidebar, go to the **Sources** and add a new AWS S3 datasource +- Now the connection modal will pop-up +
    + + Custom Endpoint - S3 hosts + +
    +- To get the **Credentials** which is **Access Key** and **Secret Key**, you'll need to go to the Minio console to generate the keys +- Enable the **Custom Endpoint** toggle switch, and enter the custom host URL i.e where your Minio server API is exposed +- Once entered the details, you can click on the **Test Connection** button to check the connection \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/how-to/upload-files-aws.md b/docs/versioned_docs/version-2.4.0/how-to/upload-files-aws.md new file mode 100644 index 0000000000..1543d8a928 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/upload-files-aws.md @@ -0,0 +1,137 @@ +--- +id: upload-files-aws +title: Upload files on AWS S3 bucket +--- + +# Upload and download files on AWS S3 bucket + +This guide will help you in quickly building a basic UI for uploading or downloading files from AWS S3 buckets. + +Before building the UI, check out the **[docs for AWS S3 data source](/docs/data-sources/s3)** to learn about setting up AWS S3 and adding the data source. + +Once you have successfully added the AWS data source, build a basic UI using the following widgets: +- **Dropdown**: For selecting a bucket in S3 storage. +- **Table**: For listing all the objects inside the selected bucket in dropdown. +- **Text Input**: For getting a path for the file that is to be uploaded. +- **File picker**: For uploading the file. +- **Button**: This will be used to fire the upload query. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/ui.png) + +
    + +## Queries + +We'll create the following queries: + +1. **getBuckets** +2. **listObjects** +3. **uploadToS3** +4. **download** + +### getBuckets + +This query will fetch the list of all the buckets in your S3. Just create a new query, select AWS S3 data source, and choose **List buckets** operation. Name the query **getBuckets** and click **Save**. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/getBuckets.png) + +
    + +Now, let's edit the properties of **dropdown** widget. + +- **Label**: Set the label as Bucket. +- **Option values**: Set option values as `{{queries.getBuckets.data.Buckets.map(bucket => bucket['Name'])}}`. We're mapping the data returned by the query as the returned data is array of abjects. +- **Option label**: Set option values as `{{queries.getBuckets.data.Buckets.map(bucket => bucket['Name'])}}`. This will display the same option label as option values. + +You can later add an event handler for running the **listObject** query whenever an option is selected from the dropdown. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/dropdown.png) + +
    + +### listObjects + +This query will list all the objects inside the selected Bucket in dropdown. Select **List objects in a bucket** operation, enter `{{components.dropdown1.value}}` in the Bucket field - this will dynamically get the field value from the selected option in dropdown. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/listObjects.png) + +
    + +Edit the properties of **table** widget: +- **Table data**: `{{queries.listObjects.data['Contents']}}` +- **Add Columns**: + - **Key**: Set the **Column Name** to `Key` and **Key** to `Key` + - **Last Modified**: Set the **Column Name** to `Last Modified` and **Key** to `LastModified` + - **Size**: Set the **Column Name** to `Size` and **Key** to `Size` +- Add a **Action button**: Set button text to **Copy signed URL**, Add a handler to this button for On Click event and Action to Copy to clipboard, in the text field enter `{{queries.download.data.url}}` - this will get the download url from the **download** query that we will create next. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/table.png) + +
    + +### download + +Create a new query and select **Signed URL for download** operation. In the Bucket field, enter `{{components.dropdown1.value}}` and in Key enter `{{components.table1.selectedRow.Key}}`. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/download.png) + +
    + +Edit the **properties** of the table, add a Event handler for running the `download` query for `Row clicked` event. This will generate a signed url for download every time a row is clicked on the table. + +### uploadToS3 + +Create a new query, select the **Upload object** operation. Enter the following values in their respective fields: +- **Bucket**: `{{components.dropdown1.value}}` +- **Key**: {{ components.textinput1.value + '/' +components.filepicker1.file[0].name}}` +- **Content type**: `{{components.filepicker1.file[0].type}}` +- **Upload data**: `{{components.filepicker1.file[0].base64Data}}` +- **Encoding**: `base64` + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/uploadToS3.png) + +
    + +#### Configure the file picker: + +Click on the widget handle to edit the file picker properties: + +- Change the **Accept file types** to `{{"application/pdf"}}` for the picker to accept only pdf files or `{{"image/*"}}` for the picker to accept only image files . In the screenshot below, we have set the accepted file type property to `{{"application/pdf"}}` so it will allow to select only pdf files: + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/result-filepicker.png) + +
    + +- Change the **Max file count** to `{{1}}` as we are only going to upload 1 file at a time. + +- Select a pdf file and hold it in the file picker. + +:::info + File types must be valid **[MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)** type according to input element specification or a valid file extension. + + To accept any/all file type(s), set `Accept file types` to an empty value. +::: + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/config-filepicker.png) + +
    + +Final steps, go to the **Advanced** tab of the **uploadToS3** query and add a query to run **listObjects** query so that whenever a file is uploaded the tabled is refreshed. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/how-to/upload-files-gcs.md b/docs/versioned_docs/version-2.4.0/how-to/upload-files-gcs.md new file mode 100644 index 0000000000..1a298174ec --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/upload-files-gcs.md @@ -0,0 +1,73 @@ +--- +id: upload-files-gcs +title: Upload files using GCS +--- + +# Upload files using GCS + +In this guide, we are going to create an interface to upload PDFs to Google Cloud Storage. + +Before adding the new data source we will need to have a private key for our GCS bucket and make sure the key has the appropriate rights. + +## Setting up Google Cloud Storage data source + +1. Go to the data source manager on the left-sidebar and click on the `+` button. +2. Add a new GCS data source from the **APIs** section in modal that pops up. +3. Enter the **JSON private key for service account** and test the connection. +4. Click on **Save** to add the data source. + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/adding-account.png) + +
    + +## Adding a file picker + +1. Drag and drop the **file picker** widget on the canvas +2. Configure the file picker: + - Change the **Accept file types** to `{{"application/pdf"}}` for the picker to accept only pdf files. In the screenshot below, we have set the accepted file type property to `{{"application/pdf"}}` so it will allow to select only pdf files: + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/result-filepicker.png) + +
    + + - Change the **Max file count** to `{{1}}` as we are only going to upload 1 file at a time. + +3. Select a pdf file and hold it in the file picker. + +:::info + File types must be valid **[MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)** type according to input element specification or a valid file extension. + + To accept any/all file type(s), set `Accept file types` to an empty value. +::: + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/config-filepicker.png) + +
    + +## Creating a query + +1. Click on the `+` button of the query manager at the bottom panel of the editor and select the GCS data source +2. Select **Upload file** operation and enter the required parameters: +- Bucket: `gs://test-1` +- File Name: `{{components.file1.file[0]['name']}}` +- Content Type: `{{components.file1.file[0]['type']}}` +- Upload data: `{{components.file1.file[0]['base64Data']}}` +- Encoding: `base64` +3. Click on **Save** to create the query + +## Running the query +1. Add a **button** that will fire the query to upload the file +2. Edit the properties of the button and add a **event handler** to **Run the query** on **On-Click** event. +3. Click on **Button** to fire the query, this will upload the pdf file that you selected earlier through the file picker and will upload it on the GCS. + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/final-result.png) + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/how-to/use-axios.md b/docs/versioned_docs/version-2.4.0/how-to/use-axios.md new file mode 100644 index 0000000000..a2f5567d83 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/use-axios.md @@ -0,0 +1,62 @@ +--- +id: use-axios-in-runjs +title: Use Axios in RunJS +--- + +ToolJet allows you to utilize the three [libraries](/docs/data-sources/run-js#libraries) - **Moment.js**, **Lodash**, and **Axios**. In this guide, we will see a few examples on how to use **Axios** library using RunJS query. + +**[Axios](https://axios-http.com/docs/intro)** is a promise-based HTTP library that lets developers make requests to either their own or a third-party server to fetch data. It offers different ways of making requests such as `GET`, `POST`, `PUT/PATCH`, and `DELETE`. + +## Making Axios HTTP requests + +In this section, you will make `GET` and `PUT` requests. You will be using a free “fake” API: **[JSONPlaceholder](https://jsonplaceholder.typicode.com/)**. + +### Making a GET request + +Create a RunJS query and copy the code below: + +```javascript +var url = "https://jsonplaceholder.typicode.com/users/1"; + +var data = (await axios.get(url)).data; + +return data +``` + +In the code snippet, a variable url is declared which is assigned the URL of the JSON API. Then another variable is decalared which sends a GET request to the JSON API. Save the query and hit Preview to view the data returned by the API. + +
    + +Use Axios in RunJS + +
    + +### Making a POST request + +A post request is a little different because you will be passing some data in the request to the server. In the request, you will be creating a user and passing in details for that user. The code snippet for the request will look something like this: + +```javascript +var url = "https://jsonplaceholder.typicode.com/users"; + +var data = axios.post(url,{ + id: 11, + name: "Shubhendra", + username: "camelcaseguy", + email: "shubhendra@tooljet.com",}) + +return data +``` + +The Axios POST request uses an object after the request URL to define the properties you want to create for your user. Once the operation has been completed, there will be a response from the server. In the screenshot below, you can see the that it return **Status: 201** which means the request has been fulfilled and resulted in a new resource being created. + +
    + +Use Axios in RunJS + +
    + +:::tip +Check out the tutorial on **[Build GitHub star history tracker](https://blog.tooljet.com/build-github-stars-history-app-in-5-minutes-using-low-code/)** that utlizes the axios library. +::: + + diff --git a/docs/versioned_docs/version-2.4.0/how-to/use-form-component.md b/docs/versioned_docs/version-2.4.0/how-to/use-form-component.md new file mode 100644 index 0000000000..51eb84ef10 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/use-form-component.md @@ -0,0 +1,90 @@ +--- +id: use-form-component +title: Use form component +--- + +In this how-to guide, we will be building a simple application that will leverage the form component for adding a record into the database. For this guide, we will be using Google Sheet datasource to read and write data. + +
    + +how-to use form + +
    + +- Let's connect to the datasource i.e. Google Sheets and give the `Read and Write` permission. +
    + + how-to use form + +
    +- Now, drag a table on the canvas and add the form component next to it. +
    + + how-to use form + +
    + +- Currently, the table component is populated with the sample data that it has by default. Let's create a **new query** from the query panel and choose the **Google Sheet** datasource. +
    + + how-to use form + +
    + +- The query will read the data from the database and we will use the returned data to populate the table. Go to the **table** property and in the table data value enter **{{queries.queryname.data}}** where queryname is the name of the query that we created in previous step. +
    + + how-to use form + +
    + +- let's go to the form and add the components inside it required for adding a record into the database. +
    + + how-to use form + +
    + +- Since our database record has five fields **Id**, **Title**, **Price**, **Category** and **Image** we will add the components in the form for the same. The form already comes with a Submit button so we don't have to add that. For Id, Title, and Image we will use text-input, for Price we will use number-input and for category we can use dropdown components. +
    + + how-to use form + +
    + +- Before editing the form properties, let's make a few changes in the components that we have added inside it. First edit the property of the **number input** and set the default value, maximum and minimum value, and then edit the **dropdown** component and set the option values and option labels. +
    + + how-to use form + +
    + +- Now, we can edit the properties of the form component. Go to its properties, in **Button To Submit Form** select the button1 that was already there on the form. Go to event handler, and for **On submit** event we will **run the query** that will get the data from the form and will store into the database. +
    + + how-to use form + +
    + +- Let's create a query that will get the data from the form and add a record in the sheet. Create a new google sheeet query and from the operation choose **Append data to a spreadsheet** + ```js + [ + { + "id":"{{components.form1.data.textinput1.value}}", + "title":"{{components.form1.data.textinput2.value}}", + "price":"{{components.form1.data.numberinput1.value}}", + "category":"{{components.form1.data.dropdown1.value}}", + "image":"{{components.form1.data.textinput4.value}}" + } + ] + ``` + +- Once done, save the query and add it to the Form's event handler. + +- Now, this application can be used to load the data from the Google Sheet and the form can be used to append more records to the sheet. + +:::tip +- Make sure to enable **Run query on page load?** option of the **read** query to populate the table everytime the app is loaded +- You can also add a event handler on the **append** query to run the **read** query when **append** is successful, this will update the table data when the append is done +- Learn more about the connecting Google sheet datasource and the CRUD **operations** available [here](/docs/data-sources/google.sheets). +::: diff --git a/docs/versioned_docs/version-2.4.0/how-to/use-inspector.md b/docs/versioned_docs/version-2.4.0/how-to/use-inspector.md new file mode 100644 index 0000000000..90e24ff47e --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/how-to/use-inspector.md @@ -0,0 +1,112 @@ +--- +id: use-inspector +title: Use Inspector +--- + +In this how-to guide, we will take a look at **Inspector** of the app-builder and see how it can be helpful in building applications. + +The Inspector can be used to inspect the data of the queries, properties and values of the components that are there on the canvas, ToolJet's global variables and the variables that have been set by the user. + +
    + +How to - Use Inspector + +
    + +## Layout + +Let's take a look at the layout of the Inspector panel: + +- On the top-right, we have a **Pin** button to pin and unpin the inspector panel. This button can be useful when you want to see the live changes on inspector while triggering a query or performing some event/action on any component. +
    + + How to - Use Inspector + +
    + +- At the bottom right, you can click and hold to resize the inspector. +
    + + How to - Use Inspector + +
    + +- On hovering an item on the inspector, the **copy path** and **copy value** buttons will appear on the right of the item. Copying the path and pasting it onto the component property or query parameter will always get the dynamic value but using `Copy value` uption will copy the current value of the item and will be static when pasted in a component property or query parameter. +
    + + How to - Use Inspector + +
    + +## Sections + +The Inspector panel has the following 4 main sections: + +- **[queries](#queries)** +- **[components](#components)** +- **[globals](#globals)** +- **[variables](#variables)** + +### queries + +The queries section can be used to inspect the query details but the data of the query will only be available if query has been run/triggered. + +:::tip +You can click on the Preview button of the button on the query manager to check the response(data) of the query without triggering it. +::: + +#### Example + +- Let's create a new query using a mock REST API endpoint (`https://fakestoreapi.com/products`). +- Now go to the Inspector and expand the **queries** section, you'll see an entry inside queries with the query name that we created in the previous step i.e. `restapi1` but if you notice the `data` and `rawData` object is empty i.e. 0 entry. The reason is the data won't show up on the inspector unless query is run. +
    + + How to - Use Inspector + +
    + +- Let's pin the inspector and then trigger the query from the query manager. You'll see that as soon as the query is triggered the `rawData` and `data` object in the query has 20 entries and the query has more properties like `request`, `response`, and `responseHeaders` data. +
    + + How to - Use Inspector + +
    + +### components + +components section can be used to inspect the properties and values of the components that are added onto the canvas. + +
    + +How to - Use Inspector + +
    + +### globals + +globals section includes the following sub-sections: + +- **currentUser:** The currentUser object contains information about the currently logged-in user such as **email**, **firstName**, and **lastName**. +- **groups:** The groups array contains the name of the groups the currently logged-in user is added to. Note: The `all_users` is default groups for everyone. +- **theme:** The theme object contains the name of the currently active theme. +- **urlparam:** The urlparams contains the information about the url parameters of the application. + +:::info +All the global variables can be accessed anywhere inside the ToolJet applications. Here's an **[example use-case](/docs/how-to/access-currentuser)** of using these variables. +::: + +
    + +How to - Use Inspector + +
    + +### variables + +variables section include all the variables set by the user in the application. These variables can be set from the event handlers from the components or from the queries. The variables will be in the **key-value** pair and can be accessed throughout the application. + +:::info + +- Setting variables from the [event handler](/docs/actions/set-variable) +- Setting variables from the [Run JavaScript code](/docs/how-to/run-actions-from-runjs#set-variable) + ::: diff --git a/docs/versioned_docs/version-2.4.0/marketplace.md b/docs/versioned_docs/version-2.4.0/marketplace.md new file mode 100644 index 0000000000..0e031decf5 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/marketplace.md @@ -0,0 +1,120 @@ +--- +id: marketplace +title: Marketplace +--- + +# ToolJet Marketplace + +ToolJet marketplace for plugins will allow users to install the custom plugins (datasources) for their ToolJet instances. This will allow ToolJet users to build their own custom plugins according to their requirements and then easily connect them to ToolJet. + +## Enabling the marketplace for your instance + +Users must add the following environment variable to the [`.env`](/docs/setup/env-vars#marketplace-feature-enable--optional-) file to enable the marketplace feature: + +```bash +ENABLE_MARKETPLACE_FEATURE=true +``` + +Once the marketplace feature is enabled, users can open the **Marketplace** page from the dropdown on the navbar of the dashboard. Users can also directly access the marketplace using the URL: `https://tooljet.yourcompany.com/integrations` + +:::info +The user logged-in should be the **Administrator** to access the marketplace page. +::: + +## Installing a plugin + +When you [create a plugin](#creating-a-marketplace-plugin) using the [tooljet cli](https://www.npmjs.com/package/@tooljet/cli), an object is created in the **plugins.json** (`ToolJet/server/src/assets/marketplace/plugins.json`) file for that particular plugin. + +Here's an example of an entry created for AWS S3 plugin: + +```json +[ + { + "name": "AWS S3 plugin", + "description": "Datasource plugin for AWS S3", + "version": "1.0.0", + "id": "s3", + "repo": "", + "author": "Tooljet", + "timestamp": "Mon, 31 Oct 2022 11:02:10 GMT" + } +] +``` + +Now to install the plugin to the marketplace, you'll have to install npm package to a plugin: + +```bash +npm i --workspace= +``` + +Finally, run the build commands: + +```bash +npm install +npm run build --workspaces +``` + +Once done, you'll find the plugin on the marketplace page. + + +## Removing a plugin + +To remove a plugin from the marketplace, you can simply remove the object entry of the plugin from the **plugins.json**(`ToolJet/server/src/assets/marketplace/plugins.json`) and then re-run the build commands. + +## Using a plugin as datasource + +The flow for installing and using a plugin as a datasource is really simple. The steps are: +- Go to the **Marketplace** +- Click the Marketplace link in the left sidebar to view all available plugins. +
    + + Marketplace + +
    +- Click on the **Install** button of the plugin that you want to install +- Once installed, you can check the installed plugins from **Installed** on the left sidebar. You can also **remove** the plugins from the Installed section of the marketplace. +
    + + Installed plugins + +
    +- Now, let's use the installed plugin as the datasource for an application. User will have to open the application, go to the **Add Datasource** button on the left sidebar of the app builder, and then select Plugins on the modal that pops-up. The Plugins section will include all the plugins installed via Marketplace. The next steps are same as connecting a datasource to the application. +
    + + Installed plugins as datasource + +
    + +## Creating a marketplace plugin + +The steps for creating a Marketplace plugin are similar to those for creating [plugins for ToolJet](/docs/contributing-guide/tutorials/creating-a-plugin) except that for a Marketplace plugin, the user will have to type `yes` when prompted `Is it a marketplace integration?` in the `tooljet command line`. + +The steps to create a marketplace plugin are: + +- Install [tooljet-cli](https://www.npmjs.com/package/@tooljet/cli): + ```bash + npm i -g @tooljet/cli + ``` +- Bootstrap a new plugin using cli + ```bash + tooljet plugin create bigquery + ``` +- On the CLI, you'll be prompted to enter a display name: + ```bash + Enter plugin display name: + ``` +- In the next step, you'll be asked to choose a plugin type **database**, **api**, or **cloud-storage** +- Now choose if `Is it a marketplace integration?` by entering `y/N` +- Enter the repository URL if the plugin is hosted on GitHub or else just press enter to skip to the next step +- Once done, all the plugin files will be generated inside the marketplace directory + ```bash + creating plugin... done + Plugin: bigquery created successfully + └─ marketplace + └─ plugin + └─ bigquery + ``` + +:::info +For more information on **[creating plugin for ToolJet](/docs/contributing-guide/tutorials/creating-a-plugin)**, please see the documentation on creating plugins. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/org-management/permissions.md b/docs/versioned_docs/version-2.4.0/org-management/permissions.md new file mode 100644 index 0000000000..5e33f5cb2c --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/org-management/permissions.md @@ -0,0 +1,21 @@ +--- +id: permissions +title: Permissions +--- + +Permissions allow you to create and share resources to easily ensure what level of access each User has to ToolJet Apps and other resources. + +Admins can invite **Users** to their workspaces and assign them to the **Groups** that have Permissions to access Apps, folders, or workspace variables. + +:::info +See **[Manage Users and Groups](/docs/tutorial/manage-users-groups)** to learn how to invite users to ToolJet. +::: + +## Role-Based Access Control (RBAC) Glossary + +- **Users -** Users can be added to more than one or more Groups. Each User is associated with an email. +- **Groups -** By default, there are two groups: **All Users** and **Admin**. Additionally, you can create custom groups like Support, Engineering, etc. + - **All Users** - Contains all the users in your workspace. When **New Users** are invited they are added to this group by default. + - **Admins** - Contains all Admins in your workspace. Everyone added to this group will Permission to access all the ToolJet resources. +- **Apps, Folder, Workspace Variables -** Resources that Admins can set permissions on. +- **Permissions -** Create, Update and Delete. diff --git a/docs/versioned_docs/version-2.4.0/release-management/multi-env.md b/docs/versioned_docs/version-2.4.0/release-management/multi-env.md new file mode 100644 index 0000000000..fe02a74824 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/release-management/multi-env.md @@ -0,0 +1,32 @@ +--- +id: multi-environment +title: Multi-Environment +--- + +
    Available on: Enterprise Edition
    + +ToolJet's **multi-environment** helps in streamlining workflows, thereby minimizing the chances of errors, and enables effective application management. Using multi-environment ensures that your ToolJet application is rigorously tested before it is made available to users. + +
    + +Multi-Environment + +
    + +## Using Multi-environments + +ToolJet comes with three default **environments**: +- **Production** +- **Development** +- **Staging** + +### Switching environments + +For switching the environment, click on the **Environment Manager** on the navbar of app-builder to open the dropdown and select a environment. + +The **datasource credentials** are required to be entered specifically for every environment. + +:::tip Best Practice +Make your default environment the **Production** environment - the environment in which the users use the final versions of your developed applications. This will help ensure that the production environment has access to all of the data sources. +::: + diff --git a/docs/versioned_docs/version-2.4.0/security.md b/docs/versioned_docs/version-2.4.0/security.md new file mode 100644 index 0000000000..6ff5ed1523 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/security.md @@ -0,0 +1,23 @@ +--- +id: security +title: Security +slug: /security +--- + +# Security + +## Data storage + +ToolJet does not store data returned from your data sources. ToolJet server acts as a proxy and passes the data as it is to the ToolJet client. The credentials for the data sources are handled by the server and never exposed to the client. For example, if you are making an API request, the query is run from the server and not from the frontend. + +## Datasource credentials +All the datasource credentials are securely encrypted using `aes-256-gcm`. The credentials are never exposed to the frontend ( ToolJet client ). + +## Other security features +- **TLS**: If you are using ToolJet cloud, all connections are encrypted using TLS. We also have documentation for setting up TLS for self-hosted installations of ToolJet. +- **Audit logs**: Audit logs are available on the enterprise edition of ToolJet. Every user action is logged along with the IP addresses and user information. +- **Request logging**: All the requests to server are logged. If self-hosted, you can easily extend ToolJet to use your preferred logging service. ToolJet comes with built-in Sentry integration. +- **Whitelisted IPs**: If you are using ToolJet cloud, you can whitelist our IP address (3.129.198.40) so that your datasources are not exposed to the public. +- **Backups**: ToolJet cloud is hosted on AWS using EKS with autoscaling and regular backups. + +If you notice a security vulnerability, please let the team know by sending an email to `security@tooljet.com`. diff --git a/docs/versioned_docs/version-2.4.0/setup/_category_.json b/docs/versioned_docs/version-2.4.0/setup/_category_.json new file mode 100644 index 0000000000..1211453a23 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Setup", + "position": 2, + "collapsed": true +} diff --git a/docs/versioned_docs/version-2.4.0/setup/client.md b/docs/versioned_docs/version-2.4.0/setup/client.md new file mode 100644 index 0000000000..71bba4ed7e --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/client.md @@ -0,0 +1,96 @@ +--- +id: client +title: Deploying ToolJet client +--- + +# Deploying ToolJet client + +ToolJet client is a standalone application and can be deployed on static website hosting services such as Netlify, Firebase, S3/Cloudfront, etc. + +You can build standalone client with the below command: +```bash +SERVE_CLIENT=false npm run build +``` + +## Deploying ToolJet client on Firebase + +:::tip +You should set the environment variable `TOOLJET_SERVER_URL` ( URL of the server ) while building the frontend and also set `SERVE_CLIENT` to `false`` for standalone client build. + +For example: `SERVE_CLIENT=false TOOLJET_SERVER_URL=https://server.tooljet.com npm run build && firebase deploy` +::: + +1. Initialize firebase project + ```bash + firebase init + ``` + Select Firebase Hosting and set build as the static file directory +2. Deploy client to Firebase + ```bash + firebase deploy + ``` + +## Deploying ToolJet client with Google Cloud Storage + +:::tip +You should set the environment variable `TOOLJET_SERVER_URL` ( URL of the server ) while building the frontend. + + +For example: `SERVE_CLIENT=false TOOLJET_SERVER_URL=https://server.tooljet.io npm run build` +::: + +#### Using Load balancer + +Tooljet client can be hosted from Cloud Storage bucket just like hosting any other static website. +Follow the instructions from google documentation [here](https://cloud.google.com/storage/docs/hosting-static-website). + +Summarising the steps below: +1. Create a bucket and upload files within the build folder such that the `index.html` is at the bucket root. + +2. Edit permissions for the bucket to assign *New principal* as `allUsers` with role as `Storage Object Viewer` and permit for public access for the bucket. + +3. Click on *Edit website configuration* from the [buckets browser](https://console.cloud.google.com/storage/browser?_ga=2.180838119.1530169400.1637242882-657891227.1637242882) and specify the main page as `index.html` + +4. Follow the [instructions](https://cloud.google.com/storage/docs/hosting-static-website#lb-ssl) on creating a load balancer for hosting a static website. + +5. Optionally, create Cloud CDN to use with the backend bucket assigned to the load balancer. + +6. After the load balancer is created there will be an IP assigned to it. Try hitting it to check the website is being loaded. + +7. Use the load balancer IP as the static IP for the A record of your domain. + +#### Using Google App Engine + +1. Upload the build folder onto a bucket + +2. Upload `app.yaml` file onto bucket with the following config + + ```yaml + runtime: python27 + api_version: 1 + threadsafe: true + + handlers: + - url: / + static_files: build/index.html + upload: build/index.html + + - url: /(.*) + static_files: build/\1 + upload: build/(.*) + ``` + +3. Activate cloud shell on your browser and create build folder + ```bash + mkdir tooljet-assets + ``` + +4. Copy the uploaded files onto an assets folder which is to be served + ```bash + gsutil rsync -r gs://your-bucket-name/path-to-assets ./tooljet-assets + ``` + +5. Deploy static assets to be served + ```bash + cd tooljet-assets && gcloud app deploy + ``` diff --git a/docs/versioned_docs/version-2.4.0/setup/digitalocean.md b/docs/versioned_docs/version-2.4.0/setup/digitalocean.md new file mode 100644 index 0000000000..017eddd99a --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/digitalocean.md @@ -0,0 +1,64 @@ +--- +id: digitalocean +title: DigitalOcean +--- + +# Deploying ToolJet on DigitalOcean + +Now you can quickly deploy ToolJet using the Deploy to DigitalOcean button. + +## Deploying + +#### Follow the steps below to deploy ToolJet on DigitalOcean: + + +1. Click on the button below to start one click deployment + +
    + + [![Deploy to DigitalOcean](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/ToolJet/ToolJet/tree/main) + +
    + +2. A new tab will open up, sign-in to your DigitalOCean account. Once signed-in, the **Create App** page will open up and **Resources** will be already selected. Click on **Next** button. + + ToolJet - Deploy on DigitalOcean - Resources + +3. Now, on **Environment Variables** page you can add new variables or edit the existing ones. Check the [environment variables here](/docs/setup/env-vars). + + ToolJet - Deploy on DigitalOcean - Environment Variables + +4. On the next page, you can change the **App name**, **Project**, and the **Region**. + + ToolJet - Deploy on DigitalOcean - App name + +5. On the last page, you'll be asked to **Review** all the app details such that we entered before such as **Resources**, **Environment Variables**, **Region**, and there will also be **Billing** section at the end. Review all the details and click the **Create Resource** button. + + ToolJet - Deploy on DigitalOcean - App name + +6. Once you click the **Create Resource** button, the build will begin. Once the build is complete, you'll see the resource and a **URL** next to it. Click on the URL to open the deployed **ToolJet**. + +:::tip +ToolJet server and client can be deployed as standalone applications. If you do not want to deploy the client on DigitalOcean, modify `package.json` accordingly. We have a [guide](/docs/setup/client) on deploying ToolJet client using services such as Firebase. +::: + +#### Deploying Tooljet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. +You can learn more about this feature [here](/docs/tooljet-database). + +Follow the steps below to deploy ToolJet Database on DigitalOcean: + +1. If you are using dev database within ToolJet deployment, upgrade it to managed database. You could also add a separate database, if you intent use a differenet database, please refer the [environment variables](/docs/setup/env-vars#tooljet-database-feature-enable--optional-) for additional env variables. + +2. Create a new app for PostgREST server. You can opt for docker hub to deploy PostgREST image of version `10.1.x`. + + ToolJet - Deploy on DigitalOcean - PostgREST resource + +3. Update the [environment variables](/docs/setup/env-vars#postgrest-server-optional) for PostgREST and expose the HTTP port `3000`. + + ToolJet - Deploy on DigitalOcean - PostgREST environment variables + +4. Add your newly created PostgREST app to the trusted sources of your managed or separate database. + +5. Update your existing ToolJet application deployment with [environment variables](/docs/setup/env-vars#tooljet-database-feature-enable--optional-) required for PostgREST. diff --git a/docs/versioned_docs/version-2.4.0/setup/docker-local.md b/docs/versioned_docs/version-2.4.0/setup/docker-local.md new file mode 100644 index 0000000000..0b10c8e4d2 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/docker-local.md @@ -0,0 +1,29 @@ +--- +id: docker-local +title: Try ToolJet locally +--- + +# Try ToolJet with Docker + +:::info +This doc is not for setting up the development environment, it is only for trying out ToolJet locally using Docker. Check out [Contributing Guide](/docs/category/contributing-guide). +::: + +You can run the command below to have ToolJet up and running right away. + +```bash +docker run \ + --name tooljet \ + --restart unless-stopped \ + -p 3000:3000 \ + -v tooljet_data:/var/lib/postgresql/13/main \ + tooljet/try:latest +``` + +## Setup information + +- Runs the ToolJet server on the port 3000 on your machine. +- Container has postgres already configured within. All the data will be available in the docker volume `tooljet_data`. +- Default user credentials to login (email: `dev@tooljet.io`, password: `password`). +- You can make use of `--env` or `--env-file` flag to test against various env configurables mentioned [here](https://docs.tooljet.com/docs/setup/env-vars). +- Use `docker stop tooljet` to stop the container and `docker start tooljet` to start the container thereafter. diff --git a/docs/versioned_docs/version-2.4.0/setup/docker.md b/docs/versioned_docs/version-2.4.0/setup/docker.md new file mode 100644 index 0000000000..c23a52343d --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/docker.md @@ -0,0 +1,149 @@ +--- +id: docker +title: Docker +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Deploying ToolJet using Docker Compose + +Follow the steps below to deploy ToolJet on a server using Docker Compose. ToolJet requires a PostgreSQL database to store applications definitions, (encrypted) credentials for datasources and user authentication data. + +:::info +If you rather want to try out ToolJet on your local machine with Docker, you can follow the steps [here](https://docs.tooljet.com/docs/setup/docker-local). +::: +### Installing Docker and Docker Compose +Install docker and docker-compose on the server. + - Docs for [Docker Installation](https://docs.docker.com/engine/install/) + - Docs for [Docker Compose Installation](https://docs.docker.com/compose/install/) + +### Deployment options + +There are two options to deploy ToolJet using Docker Compose: +1. **Using an external PostgreSQL database**. This setup is recommended if you want to use a managed PostgreSQL service such as AWS RDS or Google Cloud SQL. +2. **Using in-built PostgreSQL database**. This setup uses the official Docker image of PostgreSQL. + +Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack. + +:::info +We recommend using the managed PostgreSQL service on production for ease of administration, security, and management (backups, monitoring, etc). +If you'd want to run postgres with persistent volume rather, curl for the alternate docker compose file shared in the next step. +::: + + + + + 1. Setup a PostgreSQL database and make sure that the database is accessible. + + 2. Download our production docker-compose file into the server. + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/docker/docker-compose.yaml + ``` + + 3. Create `.env` file in the current directory (where the docker-compose.yaml file is downloaded): + + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/docker/.env.example + mv .env.example .env + ``` + + Set up environment variables in `.env` file as explained in [environment variables reference](/docs/setup/env-vars) + + `TOOLJET_HOST` environment variable can either be the public ipv4 address of your server or a custom domain that you want to use. + + Examples: + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://yourdomain.com` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` + + :::info + Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` + ::: + + :::info + If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. + ::: + + 4. Once you've populated the `.env` file, run + + :::note + Kindly uncomment PostgREST service within the [docker-compose.yaml](https://raw.githubusercontent.com/tooljet/tooljet/main/deploy/docker/docker-compose.yaml) if you intend to use tooljet database. + ::: + + ```bash + docker-compose up -d + ``` + + to start all the required services. + + :::info + If you're running a linux server, `docker` might need sudo permissions. In that case you can either run: + `sudo docker-compose up -d` + or + setup docker to run without root privileges by following the instructions written here https://docs.docker.com/engine/install/linux-postinstall/ + ::: + + 5. If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the server. + + + + + + 1. Download our production docker-compose file into the server. + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/docker/docker-compose-db.yaml + mv docker-compose-db.yaml docker-compose.yaml + mkdir postgres_data + ``` + + 2. Create `.env` file in the current directory (where the docker-compose.yaml file is downloaded): + + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/docker/.env.example + mv .env.example .env + ``` + + Set up environment variables in `.env` file as explained in [environment variables reference](/docs/setup/env-vars) + + `TOOLJET_HOST` environment variable can either be the public ipv4 address of your server or a custom domain that you want to use. + + Examples: + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://yourdomain.com` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` + + :::info + Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` + ::: + + :::info + If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. + ::: + + 3. Once you've populated the `.env` file, run + + :::note + Kindly uncomment PostgREST service within the [docker-compose.yaml](https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/docker/docker-compose-db.yaml) if you intend to use tooljet database. + ::: + + ```bash + docker-compose up -d + ``` + + to start all the required services. + + :::info + If you're running on a linux server, `docker` might need sudo permissions. In that case you can either run: + `sudo docker-compose up -d` + OR + Setup docker to run without root privileges by following the instructions written here https://docs.docker.com/engine/install/linux-postinstall/ + ::: + + 4. If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the server. + + + + + + diff --git a/docs/versioned_docs/version-2.4.0/setup/ec2.md b/docs/versioned_docs/version-2.4.0/setup/ec2.md new file mode 100644 index 0000000000..e7506d3056 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/ec2.md @@ -0,0 +1,78 @@ +--- +id: ec2 +title: AWS EC2 +--- + +# AWS EC2 + +:::info +You should setup a PostgreSQL database manually to be used by the ToolJet server. +::: + +Follow the steps below to deploy ToolJet on AWS EC2 instances. + +1. Setup a PostgreSQL database and make sure that the database is accessible from the EC2 instance. + +2. Login to your AWS management console and go to the EC2 management page. + +3. Under the `Images` section, click on the `AMIs` button. + +4. Find the [ToolJet version](https://github.com/ToolJet/ToolJet/releases) you want to deploy. Now, from the AMI search page, select the search type as "Public Images" and input the version you'd want `AMI Name : tooljet_vX.X.X.ubuntu_bionic` in the search bar. + +5. Select ToolJet's AMI and bootup an EC2 instance. + + Creating a new security group is recommended. For example, if the installation should receive traffic from the internet, the inbound rules of the security group should look like this: + + protocol| port | allowed_cidr| + ----| ----------- | ----------- | + tcp | 22 | your IP | + tcp | 80 | 0.0.0.0/0 | + tcp | 443 | 0.0.0.0/0 | + + +6. Once the instance boots up, SSH into the instance by running `ssh -i ubuntu@` + +7. Switch to the app directory by running `cd ~/app`. Modify the contents of the `.env` file. ( Eg: `vim .env` ) + + The default `.env` file looks like this: + ```bash + TOOLJET_HOST=http:// + LOCKBOX_MASTER_KEY= + SECRET_KEY_BASE= + PG_DB=tooljet_prod + PG_USER= + PG_HOST= + PG_PASS= + ``` + Read **[environment variables reference](/docs/setup/env-vars)** + + :::info + If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. + ::: + +8. `TOOLJET_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. + + Examples: + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://yourdomain.com` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` + + :::info + We use a [lets encrypt](https://letsencrypt.org/) plugin on top of nginx to create TLS certificates on the fly. + ::: + + :::info + Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` + ::: + +9. Once you've configured the `.env` file, run `./setup_app`. This script will install all the dependencies of ToolJet and then will start the required services. + +10. If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the EC2 instance. + +12. You're all done, ToolJet client would now be served at the value you've set in `TOOLJET_HOST`. + +#### Deploying Tooljet Database + +ToolJet AMI comes inbuilt with PostgREST. If you intend to use this feature, you'd only have to setup the environment variables in `~/app/.env` file and run `./setup_app` script. + +You can learn more about this feature [here](/docs/tooljet-database). \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/setup/ecs.md b/docs/versioned_docs/version-2.4.0/setup/ecs.md new file mode 100644 index 0000000000..76ffb14bad --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/ecs.md @@ -0,0 +1,77 @@ +--- +id: ecs +title: AWS ECS +--- + +# Deploying ToolJet on Amazon ECS + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. +::: + +Follow the steps below to deploy ToolJet on a ECS cluster. + +1. Setup a PostgreSQL database + ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. + +2. Create a target group and an application load balancer to route traffic onto ToolJet containers. + You can [reference](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create-application-load-balancer.html) AWS docs to set it up. Please note that ToolJet server exposes `/api/health`, which you can configure for health checks. + + :::note + This setup follows the old AWS UI for ECS as some options are missing on the latest experience. + ::: + +3. Create task definition for deploying ToolJet app as a service on your preconfigured cluster. + + 1. Select Fargate as launch type compatibility. + select launch type compatibility + + 2. Configure IAM roles and set operating system family as Linux + task definition config + + 3. Select task size to have 3GB of memory and 1vCpu + task size config + + 4. Click on add container to update container definitions + add container button + + Within the add container form that is shown: + + - Specify your container name ex: `tooljet-ce` + - Set the image you intend to deploy. ex: `tooljet/tooljet-ce:v1.26.0` + - Update port mappings at container port `3000` for tcp protocol. + container setup + + - Update container command field to be `npm,run,start:prod`. + container command + + - Specify environmental values for the container. You'd want to make use of secrets to store sensitive information or credentials, kindly refer the AWS [docs](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-secrets.html) to set it up. + + container env setup + + :::note + For the minimal setup, ToolJet requires: + `TOOLJET_HOST`, `PG_HOST`, `PG_DB`, `PG_USER`, `PG_PASSWORD`, `SECRET_KEY_BASE` & `LOCKBOX_MASTER_KEY` keys in the secret. + + Read **[environment variables reference](/docs/setup/env-vars)** + + ::: + +4. Create a service to run your task definition within your cluster. + - Select launch type as Fargate. + - Set operating system family as Linux + - Select task definition family as the one created earlier. ex: `tooljet-ce` + - Select the cluster and set the service name + - You can set the number of tasks to start with as two + - Rest of the values can be kept as default + service config + - Click on next step to configure networking options + - Select your designated VPC, Subnets and Security groups. Kindly ensure that the security group allows for inbound traffic to http port 3000 for the task. + service security group config + - Since migrations are run as a part of container boot, please specify health check grace period for 900 seconds. + - Select the application loadbalancer option and set the target group name to the one we had created earlier. This will auto populate the health check endpoints. + +:::info +The setup above is just a template. Feel free to update the task definition and configure parameters for resources and environment variables according to your needs. +::: + diff --git a/docs/versioned_docs/version-2.4.0/setup/env-vars.md b/docs/versioned_docs/version-2.4.0/setup/env-vars.md new file mode 100644 index 0000000000..ee546a8cbb --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/env-vars.md @@ -0,0 +1,297 @@ +--- +id: env-vars +title: Environment variables +--- + +# Environment variables + +Both the ToolJet server and client requires some environment variables to start running. + +## ToolJet server + +#### ToolJet host ( required ) + +| variable | description | +| ------------ | ---------------------------------------------------------------- | +| TOOLJET_HOST | the public URL of ToolJet client ( eg: https://app.tooljet.com ) | + +#### Lockbox configuration ( required ) + +ToolJet server uses lockbox to encrypt datasource credentials. You should set the environment variable `LOCKBOX_MASTER_KEY` with a 32 byte hexadecimal string. + +#### Application Secret ( required ) + +ToolJet server uses a secure 64 byte hexadecimal string to encrypt session cookies. You should set the environment variable `SECRET_KEY_BASE`. + +:::tip +If you have `openssl` installed, you can run the following commands to generate the value for `LOCKBOX_MASTER_KEY` and `SECRET_KEY_BASE`. + +For `LOCKBOX_MASTER_KEY` use `openssl rand -hex 32` +For `SECRET_KEY_BASE` use `openssl rand -hex 64` +::: + +#### Database configuration ( required ) + +ToolJet server uses PostgreSQL as the database. + +| variable | description | +| -------- | ---------------------- | +| PG_HOST | postgres database host | +| PG_DB | name of the database | +| PG_USER | username | +| PG_PASS | password | +| PG_PORT | port | + +:::tip +If you are using docker-compose setup, you can set PG_HOST as `postgres` which will be DNS resolved by docker +::: + +:::info +If you intent you use the DB connection url and if the connection does not support ssl. Please use the below format using the variable DATABASE_URL. +`postgres://username:password@hostname:port/database_name?sslmode=disable` +::: + +### Disable database and extension creation (optional) + +ToolJet by default tries to create database based on `PG_DB` variable set and additionally my try to create postgres extensions. This requires the postgres user to have CREATEDB permission. If this cannot be granted you can disable this behaviour by setting `PG_DB_OWNER` as `false` and will have to manually run them. + +#### Check for updates ( optional ) + +Self-hosted version of ToolJet pings our server to fetch the latest product updates every 24 hours. You can disable this by setting the value of `CHECK_FOR_UPDATES` environment variable to `0`. This feature is enabled by default. + +#### Comment feature enable ( optional ) + +Use this environment variable to enable/disable the feature that allows you to add comments on the canvas. + +| variable | value | +| ---------------------- | ----------------- | +| COMMENT_FEATURE_ENABLE | `true` or `false` | + +#### Multiplayer feature enable ( optional ) + +Use this environment variable to enable/disable the feature that allows users to collaboratively work on the canvas. + +| variable | value | +| -------------------------- | ----------------- | +| ENABLE_MULTIPLAYER_EDITING | `true` or `false` | + +#### Marketplace feature enable ( optional ) + +Use this environment variable to enable/disable the feature that allows users to use the [marketplace](/docs/marketplace). + +| variable | value | +| -------------------------- | ----------------- | +| ENABLE_MARKETPLACE_FEATURE | `true` or `false` | + +#### Enable ToolJet Database ( optional ) + +| variable | description | +| ----------------- | -------------------------------------------- | +| ENABLE_TOOLJET_DB | `true` or `false` | +| TOOLJET_DB | Default value is `tooljet_db` | +| TOOLJET_DB_HOST | database host | +| TOOLJET_DB_USER | database username | +| TOOLJET_DB_PASS | database password | +| TOOLJET_DB_PORT | database port | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_HOST | postgrest database host | + +Use `ENABLE_TOOLJET_DB` to enable/disable the feature that allows users to work with inbuilt data store to build apps with. Inorder to set it up, [follow the instructions here](/docs/tooljet-database#enabling-the-tooljet-database-for-your-instance). + +:::tip +When this feature is enabled, the database name provided for `TOOLJET_DB` will be utilized to create a new database during server boot process in all of our production deploy setups. +Incase you want to trigger it manually, use the command `npm run db:create` on ToolJet server. +::: + +:::info +If you intent you use the DB connection url and if the connection does not support ssl. Please use the below format using the variable TOOLJET_DB_URL. +`postgres://username:password@hostname:port/database_name?sslmode=disable` +::: + +#### Server Host ( optional ) + +You can specify a different server for backend if it is hosted on another server. + +| variable | value | +| ----------- | ------------------------------------------------------------------------------------------------- | +| SERVER_HOST | Configure a hostname for the server as a proxy pass. If no value is set, it defaults to `server`. | + +### Hide account setup link + +If you want to hide account setup link from admin in manage user page, set the environment variable `HIDE_ACCOUNT_SETUP_LINK` to `true`, please make sure you have configured SMTP to receive welcome mail for users. + +#### Disabling signups ( optional ) + +If you want to restrict the signups and allow new users only by invitations, set the environment variable `DISABLE_SIGNUPS` to `true`. + +:::tip +You will still be able to see the signup page but won't be able to successfully submit the form. +::: + +#### Serve client as a server end-point ( optional ) + +By default, the `SERVE_CLIENT` variable will be unset and the server will serve the client at its `/` end-point. +You can set `SERVE_CLIENT` to `false` to disable this behaviour. + +#### Serve client at subpath + +If ToolJet is hosted on a domain subpath, you can set the environment variable `SUB_PATH` to support it. +Please note the subpath is to be set with trailing `/` and is applicable only when the server is serving the frontend client. + +#### SMTP configuration ( optional ) + +ToolJet uses SMTP services to send emails ( Eg: invitation email when you add new users to your workspace ). + +| variable | description | +| ------------------ | ----------------------------------------- | +| DEFAULT_FROM_EMAIL | from email for the email fired by ToolJet | +| SMTP_USERNAME | username | +| SMTP_PASSWORD | password | +| SMTP_DOMAIN | domain or host | +| SMTP_PORT | port | + +#### Slack configuration ( optional ) + +If your ToolJet installation requires Slack as a data source, you need to create a Slack app and set the following environment variables: + +| variable | description | +| ------------------- | ------------------------------ | +| SLACK_CLIENT_ID | client id of the slack app | +| SLACK_CLIENT_SECRET | client secret of the slack app | + +#### Google OAuth ( optional ) + +If your ToolJet installation needs access to data sources such as Google sheets, you need to create OAuth credentials from Google Cloud Console. + +| variable | description | +| -------------------- | ------------- | +| GOOGLE_CLIENT_ID | client id | +| GOOGLE_CLIENT_SECRET | client secret | + +#### Google maps configuration ( optional ) + +If your ToolJet installation requires `Maps` widget, you need to create an API key for Google Maps API. + +| variable | description | +| ------------------- | ------------------- | +| GOOGLE_MAPS_API_KEY | Google maps API key | + +#### APM VENDOR ( optional ) + +Specify application monitoring vendor. Currently supported values - `sentry`. + +| variable | description | +| ---------- | ----------------------------------------- | +| APM_VENDOR | Application performance monitoring vendor | + +#### SENTRY DNS ( optional ) + +| variable | description | +| ---------- | ------------------------------------------------------------------------------------------------- | +| SENTRY_DNS | DSN tells a Sentry SDK where to send events so the events are associated with the correct project | + +#### SENTRY DEBUG ( optional ) + +Prints logs for sentry. + +| variable | description | +| ------------ | ------------------------------------------- | +| SENTRY_DEBUG | `true` or `false`. Default value is `false` | + +#### Server URL ( optional) + +This is used to set up for CSP headers and put trace info to be used with APM vendors. + +| variable | description | +| ------------------ | ------------------------------------------------------------ | +| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: https://server.tooljet.com ) | + +#### RELEASE VERSION ( optional) + +Once set any APM provider that supports segregation with releases will track it. + +#### NODE_EXTRA_CA_CERTS (optional) + +Tooljet needs to be configured for custom CA certificate to be able to trust and establish connection over https. This requires you to configure an additional env var `NODE_EXTRA_CA_CERTS` to have absolute path to your CA certificates. This file named `cert.pem` needs to be in PEM format and can have more than one certificates. + +| variable | description | +| ------------------- | ------------------------------------------------------------------ | +| NODE_EXTRA_CA_CERTS | absolute path to certificate PEM file ( eg: /ToolJet/ca/cert.pem ) | + +#### Disable telemetry ( optional ) + +Pings our server to update the total user count every 24 hours. You can disable this by setting the value of `DISABLE_TOOLJET_TELEMETRY` environment variable to `true`. This feature is enabled by default. + +#### Password Retry Limit (Optional) + +The maximum retry limit of login password for a user is by default set to 5, account will be locked after 5 unsuccessful login attempts. Use the variables mentioned below to control this behavior: + +| variable | description | +| ---------------------------- | ------------------------------------------------------------------------------------------------------ | +| DISABLE_PASSWORD_RETRY_LIMIT | (true/false) To disable the password retry check, if value is `true` then no limits for password retry | +| PASSWORD_RETRY_LIMIT | To change the default password retry limit (5) | + +#### SSO Configurations (Optional) + +Configurations for instance level SSO. + +| variable | description | +| ---------------------------- | -------------------------------------------------------------- | +| SSO_GOOGLE_OAUTH2_CLIENT_ID | Google OAuth client id | +| SSO_GIT_OAUTH2_CLIENT_ID | GitHub OAuth client id | +| SSO_GIT_OAUTH2_CLIENT_SECRET | GitHub OAuth client secret | +| SSO_GIT_OAUTH2_HOST | GitHub OAuth host name if GitHub is self hosted | +| SSO_ACCEPTED_DOMAINS | comma separated email domains that supports SSO authentication | +| SSO_DISABLE_SIGNUPS | Disable user sign up if authenticated user does not exist | + +## ToolJet client + +#### Server URL ( optionally required ) + +This is required when client is built separately. + +| variable | description | +| ------------------ | ------------------------------------------------------------ | +| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: https://server.tooljet.com ) | + +#### Server Port ( optional) + +This could be used to for local development, it will set the server url like so: `http://localhost:` + +| variable | description | +| ------------------- | --------------------------------------- | +| TOOLJET_SERVER_PORT | the port of ToolJet server ( eg: 3000 ) | + +#### Asset path ( optionally required ) + +This is required when the assets for the client are to be loaded from elsewhere (eg: CDN). +This can be an absolute path, or relative to main HTML file. + +| variable | description | +| ---------- | -------------------------------------------------------------- | +| ASSET_PATH | the asset path for the website ( eg: https://app.tooljet.com/) | + +#### Serve client as a server end-point ( optional ) + +By default the client build will be done to be served with ToolJet server. +If you intend to use client separately then can set `SERVE_CLIENT` to `false`. + +## PostgREST server (Optional) + +| variable | description | +| ---------------- | ----------------------------------------------- | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_DB_URI | database connection string for tooljet database | +| PGRST_LOG_LEVEL | `info` | + +If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). + +:::tip +If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + +If this parameter is not specified then PostgREST refuses authentication requests. +::: + +:::info +Please make sure that DB_URI is given in the format `postgrest://[USERNAME]:[PASSWORD]@[HOST]:[PORT]/[DATABASE]` +::: diff --git a/docs/versioned_docs/version-2.4.0/setup/google-cloud-run.md b/docs/versioned_docs/version-2.4.0/setup/google-cloud-run.md new file mode 100644 index 0000000000..d4f35ab641 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/google-cloud-run.md @@ -0,0 +1,151 @@ +--- +id: google-cloud-run +title: Google Cloud Run +--- + +# Deploying ToolJet on Google Cloud Run + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. +::: + +Follow the steps below to deploy ToolJet on Cloud run with `gcloud` CLI. + + +## Deploying ToolJet application + +1. Cloud Run requires prebuilt image to be present within cloud registry. You can pull specific tooljet image from docker hub and then tag with your project to push it to cloud registry. + + ```bash + gcloud auth configure-docker + docker pull tooljet/tooljet-ce:latest + docker tag tooljet/tooljet-ce:latest gcr.io//tooljet/tooljet-ce:latest + docker push gcr.io//tooljet/tooljet-ce:latest + ``` + + Please run the above command by launching GoogleCLI which will help to push the Tooljet application image to Google container registry. + +
    + CLI +
    + + +2. Create new cloud run service + + Select and add the pushed Tooljet application image as shown below. + +
    + tooljet-app-service +
    + +3. Ingress and Authentication can be set as shown below, to begin with. Feel free to change the security configurations as per you see fit. + +
    + ingress-auth +
    + +4. Under containers tab, please make sure the port is set 3000 and command `npm, run, start:prod` is entered in container argument field with CPU capacity is set to 2GiB. + +
    + port-and-capacity-tooljet +
    + + +5. Under environmental variable please add the below Tooljet application variables. You can also refer env variable [**here**](/docs/setup/env-vars). + + Update `TOOLJET_HOST` environment variable if you want to use the default url assigned with Cloud run after the initial deploy. + +
    + env-variable-tooljet +
    + +:::tip +If you are using [Public IP](https://cloud.google.com/sql/docs/postgres/connect-run) for Cloud SQL, then database host connection (value for `PG_HOST`) needs to be set using unix socket format, `/cloudsql/`. +::: + + +6. Please go to the connection tab. Under Cloud SQL instance please select the PostgreSQL database which you have set-up. + +
    + cloud-SQL-tooljet +
    + + +Click on deploy once the above parameters are set. + +:::info +Once the Service is created and live, to make the Cloud Service URL public. Please follow the steps [**here**](https://cloud.google.com/run/docs/securing/managing-access) to make the service public. +::: + + + + + +### Deploying ToolJet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. + +#### PostgREST server + +1. Cloud Run requires prebuilt image to be present within cloud registry. You can pull specific PostgREST image from docker hub and then tag with your project to push it to cloud registry. + + ```bash + gcloud auth configure-docker + docker pull postgrest/postgrest:v10.1.1.20221215 + docker tag postgrest/postgrest:v10.1.1.20221215 gcr.io/tooljet-test-338806/postgrest/postgrest:v10.1.1.20221215 + docker push gcr.io/tooljet-test-338806/postgrest/postgrest:v10.1.1.20221215 + ``` + + Please run the above command by launching googleCLI which will help to push the PostgREST image to Google container registry. + +
    + CLI +
    + + +2. Once the PostgREST image is pushed. Click on create service. + + Select and add the pushed PostgREST image as shown in below. + +
    + create-service-cloud-run-postgrest +
    + + +3. Ingress and Authentication can be set as shown below, to begin with. Feel free to change the security configurations as per you see fit. + +
    + ingress-auth +
    + + +4. Under containers tab, please make sure the port is set 3000 and CPU capacity is set to 1GiB. + +
    + port-and-capacity-postgrest +
    + +5. Under environmental variable please add corresponding Tooljet database env variables. You can also refer [env variable](/docs/setup/env-vars#tooljet-database). + +6. Please go to connection tab. Under Cloud SQL instance please select the PostgreSQL database which you have set-up for Tooljet application or the separate PostgreSQL database created respective to Tooljet Database from the drop-down option. + + +
    + Cloud-SQL-instance +
    + + +Click on deploy once the above parameters are set. + +:::info +Once the Service is created and live, to make the Cloud Service URL public. Please follow the steps [**here**](https://cloud.google.com/run/docs/securing/managing-access) to make the service public. +::: + + + +7. Additional Environmental variable to be added to Tooljet application or Tooljet Server connect to PostgREST server. You can also refer env variable [**here**](/docs/setup/env-vars#tooljet-database) + + +
    + env-for-tooljet +
    diff --git a/docs/versioned_docs/version-2.4.0/setup/heroku.md b/docs/versioned_docs/version-2.4.0/setup/heroku.md new file mode 100644 index 0000000000..143306f9ce --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/heroku.md @@ -0,0 +1,142 @@ +--- +id: heroku +title: Heroku +--- + +# Deploying ToolJet on Heroku + + + +### Follow the steps below to deploy ToolJet on Heroku: + +1. Click the button below to start one click deployment. +
    + + [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/tooljet/tooljet/tree/main) + +
    + +2. On Heroku tab, you'll be asked to provide an `App name` and `Choose a region`. Enter the name for your deployment and select the region according to your choice. + +
    + + heroku appname + +
    + +3. Now let's enter the `Config vars` to configure additional [environment variables](/docs/setup/env-vars) that are required for the installation. + - **LOCKBOX_MASTER_KEY**: ToolJet server uses lockbox to encrypt datasource credentials. You should set the environment variable LOCKBOX_MASTER_KEY with a 32 byte hexadecimal string. If you have OpenSSL installed, you can run the command `openssl rand -hex 32` to generate the key. + - **NODE_ENV**: By default NODE_ENV is set to production. + - **NODE_OPTIONS**: Node options are configured to increase node memory to support app build. + - **SECRET_KEY_BASE**: ToolJet server uses a secure 64 byte hexadecimal string to encrypt session cookies. You should set the environment variable SECRET_KEY_BASE. If you have OpenSSL installed, you can run the command `openssl rand -hex 64` to generate the key. + - **TOOLJET_HOST**: Public URL of ToolJet installation. This is usually `https://.herokuapp.com`. + - **TOOLJET_SERVER_URL**: URL of ToolJet server installation. (This is same as the TOOLJET_HOST for Heroku deployments) + + +4. Click on `Deploy app` button at the bottom to initiate the build. + +5. After the successful build, you'll see two buttons at the bottom: `Manage App` and `View`. Click on the `View` to open the app or click on `Manage App` to configure any settings. + +
    + +heroku build + +
    + + +:::tip +ToolJet server and client can be deployed as standalone applications. If you do not want to deploy the client on Heroku, modify `package.json` accordingly. We have a [guide](/docs/setup/client) on deploying ToolJet client using services such as Firebase. +::: + + + +### Deploying Tooljet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. + +This feature is only enabled if `ENABLE_TOOLJET_DB` is set to `true` in the Tooljet application. + +#### Follow the steps below to deploy ToolJet Database on Heroku: + +:::note +Please install Heroku CLI on your local machine. Please refer Heroku CLI installation steps [**here**](https://devcenter.heroku.com/articles/heroku-cli). +::: + +1. **Create a new Heroku app using the PostgREST buildpack** + + 1.1 Create a folder with your app name. Please give a unique name to the app. + + ```bash + mkdir ${YOUR_PGRST_APP_NAME} + cd $${YOUR_PGRST_APP_NAME} + git init + ``` + + 1.2 Add PostgREST buildpack to your app. + + ```bash + heroku apps:create ${YOUR_PGRST_APP_NAME} --buildpack https://github.com/PostgREST/postgrest-heroku.git + heroku git:remote -a ${YOUR_PGRST_APP_NAME} + ``` + +2. **Attach the Tooljet app’s PostgreSQL database your Tooljet database app** + + `${HEROKU_PG_DB_NAME` Should be the name of the PostgreSQL created by the Tooljet app. + + You can get the `${HEROKU_PG_DB_NAME` of the Tooljet application from the Resources tab under Heroku Postgre attachments as shown below. (eg: `${HEROKU_PG_DB_NAME = postgresql-transparent-24158` ). + + ```bash + heroku addons:attach ${HEROKU_PG_DB_NAME} -a ${YOUR_PGRST_APP_NAME} + ``` + +
    + PostgreSQL-database +
    + + +3. **Create a Procfile** + + :::info + The Procfile is a simple text file that is named Procfile without a file extension. For example, Procfile.txt is not valid. + ::: + + Please paste the below string within the Procfile file. + + ```bash + web: PGRST_SERVER_HOST=0.0.0.0 PGRST_SERVER_PORT=${PORT} PGRST_DB_URI=${PGRST_DB_URI:-${DATABASE_URL}} ./postgrest-${POSTGREST_VER} + ``` + + +4. **Set environment variables** + + You can also refer environment variable [**here**](/docs/setup/env-vars#tooljet-database). + + :::tip + If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + + If this parameter is not specified then PostgREST refuses authentication requests. + ::: + + ```bash + heroku config:set PGRST_JWT_SECRET= + heroku config:set POSTGREST_VER=10.0.0 + ``` + + You can also refer environment variable [**here**](/docs/setup/env-vars#tooljet-database). + + +5. **Build and deploy your app** + + ```bash + git add Procfile + git commit -m "PostgREST on Heroku" + git push --set-upstream heroku main + ``` + + Your Heroku app should be live at `${YOUR_APP_NAME}.herokuapp.com`. + + +6. **Additional environment variables for Tooljet application** + + + Please enter the below env variables in the Tooljet application, under the setting tab. You can also refer environment variable [**here**](/docs/setup/env-vars#tooljet-database). diff --git a/docs/versioned_docs/version-2.4.0/setup/http-proxy.md b/docs/versioned_docs/version-2.4.0/setup/http-proxy.md new file mode 100644 index 0000000000..c52eea2e40 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/http-proxy.md @@ -0,0 +1,12 @@ +--- +id: http-proxy +title: Connecting via HTTP proxy +--- + +#### Connecting via HTTP proxy + +Server will connect to internet via the configured HTTP proxy when this environment variable is set. + +| variable | description | +| ----------------------- | ------------------------------------- | +| TOOLJET_HTTP_PROXY | used for both HTTP and HTTPS requests | diff --git a/docs/versioned_docs/version-2.4.0/setup/index.md b/docs/versioned_docs/version-2.4.0/setup/index.md new file mode 100644 index 0000000000..f376d508bc --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/index.md @@ -0,0 +1,12 @@ +# Setup ToolJet + +Check out the different methods you can use to deploy ToolJet on your machine + +```mdx-code-block +import {DocsCardList} from '../../../src/components/DocsCard'; +import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; + + +``` + +If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/setup/kubernetes-aks.md b/docs/versioned_docs/version-2.4.0/setup/kubernetes-aks.md new file mode 100644 index 0000000000..9cf94982a7 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/kubernetes-aks.md @@ -0,0 +1,53 @@ +--- +id: kubernetes-aks +title: Kubernetes (AKS) +--- + +# Deploying ToolJet on Kubernetes (AKS) + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using Azure Database for PostgreSQL since this guide is for deploying using AKS. +::: + +Follow the steps below to deploy ToolJet on a AKS Kubernetes cluster. + +1. Create an AKS cluster and connect to it to start with the deployment. You can follow the steps as mentioned on the [Azure's documentation](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough-portal). + +2. Create k8s deployment + + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/AKS/deployment.yaml + ``` + +Make sure to edit the environment variables in the `deployment.yaml`. We advise to use secrets to setup sensitive information. You can check out the available options [here](https://docs.tooljet.com/docs/setup/env-vars). + +:::info +If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. +::: + +3. Create k8s service and reserve a static IP and inorder expose it via a service load balancer as mentioned in the [doc](https://docs.microsoft.com/en-us/azure/aks/static-ip). You can refer `service.yaml`. + ```bash + curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/AKS/service.yaml + ``` + +4. Apply YAML configs + + ```bash + kubectl apply -f deployment.yaml, service.yaml + ``` + +You will be able to access your ToolJet installation once the pods and services running. + + + +## ToolJet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars#tooljet-database) for additional environment variables configuration to be done. + +1. Setup PostgREST server + + ```bash + kubectl apply -f https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/AKS/postgrest.yaml + ``` + +2. Update ToolJet deployment with the appropriate env variables [here](https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/AKS/deployment.yaml) and apply the changes. diff --git a/docs/versioned_docs/version-2.4.0/setup/kubernetes-gke.md b/docs/versioned_docs/version-2.4.0/setup/kubernetes-gke.md new file mode 100644 index 0000000000..020b2cedda --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/kubernetes-gke.md @@ -0,0 +1,79 @@ +--- +id: kubernetes-gke +title: Kubernetes (GKE) +--- + +# Deploying ToolJet on Kubernetes (GKE) + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using Cloud SQL since this guide is for deploying using GKE. +::: + +Follow the steps below to deploy ToolJet on a GKE Kubernetes cluster. + +1. Create an SSL certificate. + +```bash +curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/certificate.yaml +``` + +Change the domain name to the domain/subdomain that you wish to use for ToolJet installation. + +2. Reserve a static IP address using `gcloud` cli + +```bash +gcloud compute addresses create tj-static-ip --global +``` + +3. Create k8s deployment + +```bash +curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/deployment.yaml +``` + +Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](https://docs.tooljet.com/docs/setup/env-vars). + +:::info +If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. +::: + +4. Create k8s service + +```bash +curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/service.yaml +``` + +5. Create k8s ingress + +```bash +curl -LO https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/ingress.yaml +``` + +Change the domain name to the domain/subdomain that you wish to use for ToolJet installation. + +6. Apply YAML configs + +```bash +kubectl apply -f certificate.yaml, deployment.yaml, service.yaml, ingress.yaml +``` + +:::info +It might take a few minutes to provision the managed certificates. [Managed certificates documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs). +::: + +You will be able to access your ToolJet installation once the pods, service and the ingress is running. + + + + +## ToolJet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars#tooljet-database) for additional environment variables configuration to be done. + +1. Setup PostgREST server + + ```bash + kubectl apply -f https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/postgrest.yaml + ``` + +2. Update ToolJet deployment with the appropriate env variables [here](https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/GKE/deployment.yaml) and apply the changes. diff --git a/docs/versioned_docs/version-2.4.0/setup/kubernetes.md b/docs/versioned_docs/version-2.4.0/setup/kubernetes.md new file mode 100644 index 0000000000..31735dafff --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/kubernetes.md @@ -0,0 +1,61 @@ +--- +id: kubernetes +title: Kubernetes +--- + +# Deploying ToolJet on Kubernetes + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. +::: + +Follow the steps below to deploy ToolJet on a Kubernetes cluster. + +1. Setup a PostgreSQL database + ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. We do not have plans to support other databases such as MySQL. + +2. Create a Kubernetes secret with name `server`. For the minimal setup, ToolJet requires `pg_host`, `pg_db`, `pg_user`, `pg_password`, `secret_key_base` & `lockbox_key` keys in the secret. + + Read **[environment variables reference](/docs/setup/env-vars)** + +3. Create a Kubernetes deployment + + ```bash + kubectl apply -f https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/deployment.yaml + ``` + +:::info +The file given above is just a template and might not suit production environments. You should download the file and configure parameters such as the replica count and environment variables according to your needs. +::: + +:::info +If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. +::: + +4. Verify if ToolJet is running + + ```bash + kubectl get pods + ``` + +5. Create a Kubernetes services to publish the Kubernetes deployment that you've created. This step varies with cloud providers. We have a [template](https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/service.yaml) for exposing the ToolJet server as a service using an AWS loadbalancer. + + **Examples:** + - [Application load balancing on Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html) + - [GKE Ingress for HTTP(S) Load Balancing](https://cloud.google.com/kubernetes-engine/docs/concepts/ingress) + +:::tip +If you want to serve ToolJet client from services such as Firebase or Netlify, please read the client Setup documentation **[here](/docs/setup/client)**. +::: + +## ToolJet Database + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars#tooljet-database) for additional environment variables configuration to be done. + +1. Setup PostgREST server + + ```bash + kubectl apply -f https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/postgrest.yaml + ``` + +2. Update ToolJet deployment with the appropriate env variables [here](https://github.com/ToolJet/ToolJet/blob/chore/main/kubernetes/deployment.yaml#L83) and apply the changes. diff --git a/docs/versioned_docs/version-2.4.0/setup/openshift.md b/docs/versioned_docs/version-2.4.0/setup/openshift.md new file mode 100644 index 0000000000..d7dc7ebe11 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/openshift.md @@ -0,0 +1,68 @@ +--- +id: openshift +title: Openshift +--- + +# Deploying ToolJet on Openshift + +:::info +You should setup a PostgreSQL database manually to be used by ToolJet. +::: + +Follow the steps below to deploy ToolJet on Openshift. + +1. Setup a PostgreSQL database ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. We do not have plans to support other databases such as MySQL. + +2. Create a Kubernetes secret with name `server`. For the minimal setup, ToolJet requires `pg_host`, `pg_db`, `pg_user`, `pg_password`, `secret_key_base` & `lockbox_key` keys in the secret. + +Read **[environment variables reference](https://docs.tooljet.com/docs/setup/env-vars)** + +3. Once you have logged into the Openshift developer dashboard click on `+Add` tab. Select import YAML from the local machine. + +:::note +When entering one or more files and use --- to separate each definition +::: + +Copy paste depolyment.yaml to the online editor + +``` +https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/openshift/deployment.yaml +``` + + +Copy paste the service.yaml to the online editor + +``` +https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/openshift/service.yaml +``` + +
    + +online yaml editor + +
    + +Once you have added the files click on create. + +:info +If there are self signed HTTPS endpoints that Tooljet needs to connect to, please make sure that `NODE_EXTRA_CA_CERTS` environment variable is set to the absolute path containing the certificates. You can make use of kubernetes secrets to mount the certificate file onto the containers. +::: + + +4. Navigate to topology tab and use the visual connector to establish the connect between tooljet-deployment and postgresql as shown in the screenshot below. + +
    + +toplogy + +
    + +## ToolJet Database + +You can know more about tooljet database [here](https://docs.tooljet.com/docs/tooljet-database) + +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](https://docs.tooljet.com/docs/setup/env-vars#tooljet-database) for additional environment variables configuration to be done. + +``` +https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/openshift/postgrest.yaml +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/setup/tooljet-subpath.md b/docs/versioned_docs/version-2.4.0/setup/tooljet-subpath.md new file mode 100644 index 0000000000..5bee3604e8 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/tooljet-subpath.md @@ -0,0 +1,21 @@ +--- +id: tooljet-subpath +title: Deploying ToolJet on a subpath +--- + +ToolJet can now be deployed at a subpath rather than the root (`/`) of a public domain. Example subpath installation URL: **`http://www.yourcompany.com/apps/tooljet`** + +You'll need to setup the following environment variables if ToolJet installation is on a domain subpath: + +| variable | value | +| -------- | ---------------------- | +| TOOLJET_HOST | the public URL ( eg: https://www.yourcompany.com ) | +| SERVE_CLIENT | By default, this variable will be unset and the server will serve the client at its `/` end-point. You can set `SERVE_CLIENT` to `false` to disable this behaviour. | +| SUB_PATH | Set a subpath to this variable. The subpath is to be set with trailing `/` and is applicable only when the server is serving the frontend client. ( eg: `/apps/tooljet/` ) | + + +:::info +See all **[Environment Variables](/docs/setup/env-vars)** here. +::: + + diff --git a/docs/versioned_docs/version-2.4.0/setup/try-tooljet.md b/docs/versioned_docs/version-2.4.0/setup/try-tooljet.md new file mode 100644 index 0000000000..00084e426b --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/try-tooljet.md @@ -0,0 +1,38 @@ +--- +id: try-tooljet +title: Try ToolJet +--- + +# Try ToolJet +## On local with Docker + +You can run the command below to have ToolJet up and running right away. + +```bash +docker run \ + --name tooljet \ + --restart unless-stopped \ + -p 80:80 \ + -v tooljet_data:/var/lib/postgresql/13/main \ + tooljet/try:latest +``` + +#### Setup information + +- Runs the ToolJet server on the port 80 on your machine. +- Container has postgres already configured within. All the data will be available in the docker volume `tooljet_data`. +- You can make use of `--env` or `--env-file` flag to test against various env configurables mentioned [here](https://docs.tooljet.com/docs/setup/env-vars). +- Use `docker stop tooljet` to stop the container and `docker start tooljet` to start the container thereafter. + +## On Play with docker + +You can deploy ToolJet on PWD for free with the one-click-deployment button below. + + + Try in PWD + + +#### Setup information + +- Open port 80 after the docker containers are up and running +- Visit the url shared on the dashboard to try out tooljet diff --git a/docs/versioned_docs/version-2.4.0/setup/v2-migration.md b/docs/versioned_docs/version-2.4.0/setup/v2-migration.md new file mode 100644 index 0000000000..c44bacd808 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/setup/v2-migration.md @@ -0,0 +1,33 @@ +--- +id: v2-migration-guide +title: V2 migration guide +--- +# Version 2 migration guide + +ToolJet version 2 comes with a bunch of exciting features, with the major ones being: +1. Multi page +2. Multi env +3. Forms widget +4. [Database](/docs/tooljet-database) (Requires opt-in) +5. [Marketplace](/docs/marketplace) (Requires opt-in) + +Checkout the latest changelog for v2 [here](https://github.com/ToolJet/ToolJet/releases). + +## Deployment + +Based on your opted deployment method from our [setup doc](/docs/setup/), you can directly deploy v2 without any additional configuration for the default setup. + +Additional configuration are only required for the opt-in features mentioned above. You can check the respective documentation of those features for the configuration changes needed. + +:::info +Server may take some time to be ready to handle the HTTP request as v2 changes requires some data migrations for the initial deployment. This is automatically triggered as a part of the server boot. +:::: + +## Deprecations + +#### Deployments +- Docker compose deployments with [auto SSL](/docs/1.x.x/setup/docker) is deprecated + +## Help and Support +- Feel free to join our highly active **[Slack Community](https://tooljet.com/slack)** or you can also e-mail us at **hello@tooljet.com**. +- If you have found a bug, please create a **[GitHub issue](https://github.com/ToolJet/ToolJet/issues)** for the same. diff --git a/docs/versioned_docs/version-2.4.0/tooljet_database.md b/docs/versioned_docs/version-2.4.0/tooljet_database.md new file mode 100644 index 0000000000..9c03d20ba1 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tooljet_database.md @@ -0,0 +1,302 @@ +--- +id: tooljet-database +title: ToolJet Database +--- + +Use the ToolJet-hosted database to build apps faster, and manage your data with ease. ToolJet database require no setup and give you a powerful user interface for managing your data. + +
    + +ToolJet Database + +
    + +## Enabling the ToolJet Database for your instance + +Requires: +- PostgREST server +- Additional configuration for ToolJet server + +This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#tooljet-database-feature-enable--optional-) is set to `true`. + +### PostgREST server + +PostgREST is a standalone web server that turns your PostgreSQL database directly into queryable RESTful APIs which is utilized for Tooljet Database. This server only talks with ToolJet server and therefore does not have to be publicly exposed. + +:::tip +If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + +If this parameter is not specified then PostgREST refuses authentication requests. +::: + +| variable | description | +| ------------------ | ----------------------------------------------- | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_DB_URI | database connection string for tooljet database | +| PGRST_LOG_LEVEL | `info` | + +:::info +Please make sure that DB_URI is given in the format `postgres://[USERNAME]:[PASSWORD]@[HOST]:[PORT]/[DATABASE]` +::: + +#### Additional ToolJet server configuration + + +| variable | description | +| ------------------ | -------------------------------------------- | +| ENABLE_TOOLJET_DB | `true` or `false` | +| TOOLJET_DB | Default value is `tooljet_db` | +| TOOLJET_DB_HOST | database host | +| TOOLJET_DB_USER | database username | +| TOOLJET_DB_PASS | database password | +| TOOLJET_DB_PORT | database port | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_HOST | postgrest database host | + + +If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). + +:::tip +When this feature is enabled, the database name provided for `TOOLJET_DB` will be utilized to create a new database during server boot process in all of our production deploy setups. +Incase you want to trigger it manually, use the command `npm run db:create` on ToolJet server. +::: + +## Features + +ToolJet database allows you to: + +- **[Maintain tables of data](#accessing-tooljet-database)** in a secure database that's only accessible within your ToolJet organization. +- **[Edit, search, filter, sort, and filter](#database-editor)** data using a spreadsheet-like interface. +- **[Quickly build applications and write queries](#querying-data-from-the-tooljet-database)** to interact with the ToolJet Database, just like any other datasource but without any setup. + +## Accessing ToolJet Database + +Once you log-in to your ToolJet account, from the left sidebar of the dashboard you can navigate to **ToolJet Database**. + +The ToolJet Database is available on: **[ToolJet Cloud](https://tooljet.com)**, **[Self-Host](/docs/setup/)**, and **Enterprise Edition**. You can view and manage your database and the data it contains using the **Database editor UI**. + +
    + +ToolJet Database editor + +
    + +## Database Editor + +You can manage the ToolJet Database directly from the Database Editor. ToolJet Database organizes the data into **tables** that can have different structures. All the tables will be listed lexicographically on the left, click on any of the table to view the table data. + +
    + +ToolJet Database editor + +
    + +### Add table + +For creating a new table in ToolJet Database, click on the **Add table** button on the top left corner of the Database editor. + +
    + +ToolJet Database editor + +
    + +When the **Add table** button is clicked, a drawer opens up from the right where you can enter the details of your new table. + +
    + +ToolJet Database editor + +
    + +#### For creating a new table, you'll need to: +- Enter a **Table name** +- Add **Columns** (Any one column is required to be set as Primary key) + +#### Supported data types +- **varchar**: varchar data type is used to store characters of indefinite length +- **serial**: serial is used to generate a sequence of integers which are often used as the Primary key of a table. +- **int**: It is a numeric data type used to store whole numbers, that is, numbers without fractional components. +- **float**: float is also a numeric data type that is used to store inexact, variable-precision values. +- **boolean**: boolean data type can hold true, false, and null values. + +Click on **Create** button to create a new table. + +
    + +ToolJet Database editor + +
    + +### Search Table + +You can enter a search term to search through all tables in the database. + +
    + +ToolJet Database editor + +
    + +### Add column + +You can add a new column to the existing table by clicking on the **Add new column** button from the top of the database editor. + +A drawer from the right will open up from where you can create a new column by entering the values for the new column such as: +- **Column name**: name of the column (key) +- **Data type**: Check available data types [here](#supported-data-types) +- **Default Value** Any default value for the column (not mandatory) + +
    + +ToolJet Database editor + +
    + +### Filter + +You can add as many filter as you want into the table by clicking on the **Filter** button present on the top of the database editor. + +#### Adding a filter on the table data +- Select a **column** from the Columns dropdown +- Choose an **[operation](#available-operations-are)** +- Enter a **value** for the selected operation + +#### Available operations are: +- **equals** +- **greater than** +- **greater than or equal** +- **less than** +- **less than or equal** +- **not equal** +- **like** +- **ilike** +- **match** +- **imatch** +- **in** +- **contains** +- **contained** +- **not** + +
    + +ToolJet Database editor + +
    + +### Sort + +To sort the table data, click on the **Sort** button on top, select a **column** from the dropdown, and then choose an order **ascending** or **descending**. + +
    + +ToolJet Database editor + +
    + +### Add new row + +To add a new row to the existing table data, click on the **Add new row** button. A drawer will open from the right where you can **enter the values** for the new row. + +
    + +ToolJet Database editor + +
    + +### Edit row + +To edit the rows from the ToolJet database dashboard, click on the **Edit row** button. A drawer will open from the right from where first you need to **select the id** of the row to be edited from the dropdown and then you can edit the cell values of the selected row. + +
    + +ToolJet Database editor + +
    + +### Delete records + +To delete one or many records/rows, select on the checkbox at the right of the record or records that you want to delete. As soon as you select a single record, the button to delete record will appear on the top, click on the **Delete record** button to delete the selected records. + +
    + +ToolJet Database editor + +
    + +### Delete column + +To delete a particular column, just click on the column name and the **delete** button will appear, click on it to delete the column. + +
    + +ToolJet Database editor + +
    + +### Edit or Delete a table + +When you click on the kebab menu (three vertical dots icon) on the right of the table name, you'll get two options: Edit and Delete. +- **Edit** will allow you to rename the table +- **Delete** will allow you to delete the table permanently + +
    + +ToolJet Database editor + +
    + +## Querying data from the ToolJet database + +Querying ToolJet database is as easy as querying any other datasource on ToolJet. + +- Go to the **query panel**, and click on the **+Add** button to add a new query, and select **Run ToolJetDb query** +
    + + ToolJet Database editor + +
    + +- Enter the **Name** of the table that you want to query, select an **Operation** from the dropdown, **Create** the query, and then **Run** the query to get the response. +
    + + ToolJet Database editor + +
    + +:::info +- **Preview** button on the query panel returns the query response without executing the query. Once clicked, the response will be displayed on the Preview section of the query panel which can be viewed in JSON or Raw. +- When a new query is created, by default the query name is set to `tooljetdbN` (where N is a number) - you can rename the query by click on the query name or from the left sidebar of query panel. +::: + +### Available operations + +#### List rows +This operation returns the list of all the records in the table + +#### Optional parameters +- **Filter**: Add a filter to the query response by setting a column, operation and value. +- **Sort**: Add a sort to the query response by setting a column and direction. +- **Limit**: Limit the query response. This parameter expects a numerical value. ex: 5 + +#### Create row +This operation creates a new record in the table + +#### Required parameters +- **Columns**: Choose a column from the dropdown and enter a value for the new record. + +#### Update row +This operation updates an existing record in the table + +#### Required parameter +- **Filter**: Add a condition by choosing a column, an operation, and the value for updating a particular record. + +#### Delete row +This operation deletes a record from the table + +#### Required parameters +- **Filter**: Add a condition by choosing a column, an operation, and the value for deleting a particular record. + +:::info +If you have any other questions or feedback about **ToolJet Database**, please reach us out at hello@tooljet.com or join our **[Slack Community](https://www.tooljet.com/slack)** +::: diff --git a/docs/versioned_docs/version-2.4.0/tracking.md b/docs/versioned_docs/version-2.4.0/tracking.md new file mode 100644 index 0000000000..6033e14f19 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tracking.md @@ -0,0 +1,23 @@ +--- +id: tracking +title: Tracking +slug: /tracking +--- + +# Tracking + +:::tip +ToolJet does not store any data fetched from the data sources. ToolJet acts as a proxy and the data from data sources is sent to the client application without storing. +::: + +## Server + +:::tip +Self-hosted version of ToolJet pings our server to fetch the latest product updates every 24 hours. You can disable this by setting the value of `CHECK_FOR_UPDATES` environment variable to `0`. This feature is enabled by default. +::: + +## Client + +ToolJet tracks anonymous usage data such as page loads and clicks. ToolJet tracks only the events and doesn't capture data from data sources. + +Tracking can be disabled by setting the value environment variable `ENABLE_TRACKING` to `0`. diff --git a/docs/versioned_docs/version-2.4.0/tutorial/_category_.json b/docs/versioned_docs/version-2.4.0/tutorial/_category_.json new file mode 100644 index 0000000000..1ed20f00b1 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tutorial", + "position": 4, + "collapsed": false +} diff --git a/docs/versioned_docs/version-2.4.0/tutorial/actions.md b/docs/versioned_docs/version-2.4.0/tutorial/actions.md new file mode 100644 index 0000000000..92586941e0 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/actions.md @@ -0,0 +1,31 @@ +--- +id: actions +title: Adding actions +--- + +# Adding actions + +ToolJet supports several actions that can be invoked as the handler for any `event` that is triggered in an application. + +## To add actions + +To attach an action for component events, click on the component's handle, and then click on the `Add handler` button on the +inspector panel available on the right side. + +To attach an action for query events, select the query, go to the `advanced` tab and then click on the `Add handler` button. + +## Available actions + +Some of the actions that ToolJet Support are + + Action| Description| + ----| ----------- | + Show alert | Show an alert message as a bootstrap toast | + Run query | Run any of the data queries that you have created | + Open webpage | Go to another webpage in a new tab | + Goto app | Go to another ToolJet application | + Show modal | Open any modal that you've added | + Close modal | Close any modal that you've added if its already open | + Copy to clipboard | Copy any available text that you see on the application to clipboard | + Set localStorage | Set a key and corresponding value to localStorage | + Generate file | Construct file using data available in your application and let the user download it | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/tutorial/adding-a-datasource.md b/docs/versioned_docs/version-2.4.0/tutorial/adding-a-datasource.md new file mode 100644 index 0000000000..a8e2d9fb8e --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/adding-a-datasource.md @@ -0,0 +1,36 @@ +--- +id: adding-a-datasource +title: Adding a data source +--- + +# Adding a data source + +:::tip +The data sources are created on app level and not on workspace level. +::: + +**Datasource manager** is on the left-sidebar of the app builder. To add a new data source, click on the
    `Add datasource` button. + + +adding datasource + + +You will be prompted to select the data source that you wish to add. Let's select PostgreSQL for this tutorial. You will then need to provide the credentials of your PostgreSQL database. The fields that are marked as `encrypted` will be encrypted before saving to ToolJet's database. + +
    + +![ToolJet - Tutorial - Adding a data source](/img/tutorial/adding-datasource/datasources.png) + +
    + +The name of the data source must be unique (within the app) and can be changed by clicking on the data source name at the top of the prompt. Click on `Test Connection` button to verify the connection, this might take a couple of minutes. Once verified, save the data source. + +:::tip +If you are using ToolJet cloud and if your data source is not publicly accessible, please white-list our IP address ( shown while creating a new data source ). +::: + +
    + +postgre add datasource + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/tutorial/adding-widget.md b/docs/versioned_docs/version-2.4.0/tutorial/adding-widget.md new file mode 100644 index 0000000000..f1e69e62ee --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/adding-widget.md @@ -0,0 +1,66 @@ +--- +id: adding-widget +title: Adding a widget +--- + +# Adding a widget + +To add a widget, navigate to the `Widget manager` on the right sidebar. It will display the list of built-in widgets that can be added to the app. Use the search functionality to quickly find the widget that you want. + +widget + +## Drag and drop a widget + +Let's add a `table` widget to the app to show the customer data from the query that we created in the previous steps. +To add a widget, drag and drop the widget to the canvas. + +## Resize a widget + +The widgets can be resized and repositioned within the canvas. + +resize + +## Adding widgets to Modal + +To add a widget to Modal, we need to trigger [Show modal action](/docs/tutorial/actions#available-actions) + +:::info +Before triggering `Show modal action` we need to add a modal widget to the canvas. +::: + +- Add a `modal widget` to the app +- Trigger the **Show modal action** +- Click on the canvas area for the `Widget manager` sidebar +- Navigate to the Widget manager on the right sidebar and Drag and drop a widget into the Modal + +adding-widget + +## Resize table columns + +We can resize the column width using the resize handle of the column. + +resize-table-column + +## Change widget properties + +Click on the widget to open the inspect panel on right sidebar. Here you can change the properties of the widgets. Let's configure the table columns to display the customer data. The display order of columns can be changed by dragging icon near the column name. + +inspect panel + +## Connecting data with widget + +Now we will connect the `data` object of the `fetch customers` query with the table. Click on the table widget to open the inspector on the right sidebar. We can see that the data property of the table has an empty array as the value. The data field, like almost every other field on the editor supports single-line javascript code within double brackets. Variable suggestions will be shown as a dropdown while you type the code in the field. + +Let's select the `data` object of the 'postgresql' query. + +` {{queries.postgresql1.data}}` + +Since we have already run the query in the previous step, the data will be immediately displayed in the table. + +table data + +So far in this tutorial, we have connected to a PostgreSQL database and displayed the data on a table. + +:::tip +Read the widget reference of table [here](/docs/widgets/table) for more customizations such as server-side pagination, actions, editing data. +::: diff --git a/docs/versioned_docs/version-2.4.0/tutorial/app-menu-options.md b/docs/versioned_docs/version-2.4.0/tutorial/app-menu-options.md new file mode 100644 index 0000000000..65425b0782 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/app-menu-options.md @@ -0,0 +1,69 @@ +--- +id: app-menu-options +title: App menu options +--- + +# App menu options + +Options that are available in the overflow menu of the app card are: + +- **[Change Icon](#change-icon)** +- **[Add to folder](#add-to-folder)** +- **[Clone app](#clone-app)** +- **[Export app](#export-app)** +- **[Delete app](#delete-app)** + +
    + +App menu options + +
    + +## Change Icon + +The icon on the app cards can be customised by selecting the `Change Icon` option. + +
    + +App menu options + +
    + +## Add to folder + +ToolJet allows you to create folders (`+ Create new folder` from the left sidebar) on the dashboard, and any application can be added to these folders. + +
    + +App menu options + +
    + +## Clone app + +Any application created on ToolJet can be cloned using the `Clone app` option. The cloned application is the exact copy of the original app except that the user will have to re-enter the datasource credentials in cloned app. + +## Export app + +Export app option will allow the users to download `JSON` file with all the information about your application(excluding credentials). This JSON file can be used to import this application to the same or other workspace. + +Users get the option to export: +- the currently released version +- a particular version from list latest version to oldest version +- all versions + +
    + +App menu options + +
    + +## Delete app + +Use this option to complete remove the app from the workspace. + +
    + +App menu options + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/tutorial/building-queries.md b/docs/versioned_docs/version-2.4.0/tutorial/building-queries.md new file mode 100644 index 0000000000..9598c2f9da --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/building-queries.md @@ -0,0 +1,53 @@ +--- +id: building-queries +title: Building Queries +--- + +# Building Queries + +Query Editor lives at the bottom of the page. We will now build a query for the PostgreSQL datasource that we connected in the previous step. + +:::tip +You can click on the 'enlarge' icon to enlarge query editor pane. +::: + +- Click on the `+` icon of the query editor to create a new query. +- Select the PostgreSQL datasource created in previous step. +- Copy the query given below and paste on the query area. +- Select SQL mode + +```sql +SELECT * FROM customers; +``` + + +query + + +Query results can be previewed by clicking the `preview` button. Previewing queries will not alter the state of the app. + + +preview + + + +## Advanced options + + +advanced options + + +#### Run query on page load +If this option is enabled, the query will be run when the app is loaded for the first time. The queries can have more than one trigger, ie the same query can later be triggered again using a button's click event or table's row selected event or any other events. + +#### Request confirmation before running query +Enable this option to show a prompt to confirm the action before a query is run. The confirmation prompt will look like this: + +
    + +confirm + +
    + +#### Show notification on success +Enable this option to show a custom message on query completion. Duration of the notification can also be set. diff --git a/docs/versioned_docs/version-2.4.0/tutorial/creating-app.md b/docs/versioned_docs/version-2.4.0/tutorial/creating-app.md new file mode 100644 index 0000000000..08d97e2496 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/creating-app.md @@ -0,0 +1,31 @@ +--- +id: creating-app +title: Creating new app +--- + +# Creating new app + +:::info +Apps in ToolJet binds the widgets, data sources and queries together. +::: + +This tutorial will walk you through building a simple app to fetch customer information from a PostgreSQL database and display the data using the table widget. +To create a new ToolJet app, click on the **'Create new application'** button on the ToolJet dashboard. + + +dashboard create new app + + +You will be redirected to the visual app editor once the app has been created. Create the first version of your app to start building. The name of the app can be changed by clicking on the app name at top-left of the app builder. + +
    + +![ToolJet - Creating an app](/img/tutorial/creating-new-app/visual-app-editor.png) + +
    + +The main components of an app: + +- **[Widgets](https://docs.tooljet.com/docs/tutorial/adding-widget)** - UI components such as tables, buttons, dropdowns. +- **[Data sources](https://docs.tooljet.com/docs/tutorial/adding-a-datasource)** - ToolJet can connect to databases, APIs and external services to fetch and modify data. +- **[Queries](https://docs.tooljet.com/docs/tutorial/building-queries)** - Queries are used to access the connected data sources. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/tutorial/debugger.md b/docs/versioned_docs/version-2.4.0/tutorial/debugger.md new file mode 100644 index 0000000000..bc61761ba4 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/debugger.md @@ -0,0 +1,19 @@ +--- +id: debugger +title: Debugger +--- + +# Debugger + +The debugger captures errors that happens while running the queries. For example, when a database query fails due to the unavailability of a database or when a REST API query fails due to an incorrect URL, the errors will be displayed on the debugger. The debugger also displays relevant data related to the error along with the error message. Debugger is located on the left-sidebar. + + +debugger + + + +## Pin Debugger +You can click on the `pin` icon at the top-right corner of the debugger if you do not want the debugger to close. The debugger will remain open until it is unpinned. + + +pinned debugger diff --git a/docs/versioned_docs/version-2.4.0/tutorial/keyboard-shortcuts.md b/docs/versioned_docs/version-2.4.0/tutorial/keyboard-shortcuts.md new file mode 100644 index 0000000000..f534298ff4 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/keyboard-shortcuts.md @@ -0,0 +1,122 @@ +--- +id: keyboard-shortcuts +title: Keyboard Shortcuts +--- + +# Keyboard Shortcuts + +You can perform operations like undo, redo, clone, or removing the widget directly using the keyboard shortcuts. + +## Copy + +You can copy the component on the visual app editor using the following shortcut keys: + +**On Mac:** `cmd + c` + +**On Linux/Windows:** `ctrl + c` + +
    + +Copy + +
    + +## Cut + +You can cut the component on the visual app editor using the following shortcut keys: + +**On Mac:** `cmd + x` + +**On Linux/Windows:** `ctrl + x` + +
    + +Cut + +
    + +## Paste + +You can paste the selected component using the following shortcut keys: + +**On Mac:** `cmd + v` + +**On Linux/Windows:** `ctrl + v` + +
    + +Paste + +
    + +:::caution +There are few edge cases when copy-paste commands might not work: +- The URL should be `https` and it won't work on http on many browsers +- Recent Firefox versions has some issue with copy functionality +::: + +## Undo + +You can undo any operation performed on the visual app editor using the following shortcut keys: + +**On Mac:** `cmd + z` + +**On Linux/Windows:** `ctrl + z` + +
    + +Undo + +
    + +## Redo + +If you have `undo` an operation and want to redo that again than you can use the following shortcut keys: + +**On Mac:** `cmd + shift + z` + +**On Linux/Windows:** `ctrl + shift + z` + +
    + +Redo + +
    + +## Clone + +Now you can create multiple clones of any widget without having to drag and drop the widget again from the sidebar. Just select any widget that you want to create a clone and use the following shortcut keys: + +**On Mac:** `cmd + d` + +**On Linux/Windows:** `ctrl + d` + +
    + +Clone + +
    + +## Remove widget + +Now you can delete a selected widget by using the following shortcut keys: + +**On Mac:** `delete` + +**On Linux/Windows:** `backspace` + +
    + +Remove + +
    + +## Unselect the selected widget + +You can quickly deselect a widget using the `esc` key. + +
    + +Unselect + +
    diff --git a/docs/versioned_docs/version-2.4.0/tutorial/manage-users-groups.md b/docs/versioned_docs/version-2.4.0/tutorial/manage-users-groups.md new file mode 100644 index 0000000000..95991fd7fa --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/manage-users-groups.md @@ -0,0 +1,184 @@ +--- +id: manage-users-groups +title: Managing Users and Groups +--- + +# Managing Users and Groups + +## Managing Users + +Admin of a workspace can add users to the workspace. To manage the users in your workspace, just go to the **Workspace Settings** from the left sidebar on the dashboard and click on the **Users** option. + +
    + +Manage Users + +
    + +### Inviting users + +Admins can invite anyone to a workspace using the email address. To invite a user: + +- On the **Users** page click on the `Invite new user` button. +
    + + Manage Users + +
    + +- Now enter the details of new user such as first name, last name, email, and then click on the **Create User**. +
    + + add new user + +
    + + +- An email including the **Invite Link** to join your workspace will be send to the created user. The status will turn from **invited** to **active** after the user successfully joins your workspace using the invite link. + + :::tip + You can also copy the invitation url by clicking on the copy icon next to `invited` status of the created user. + ::: + +
    + + add new user + +
    + +:::tip +You can also **Bulk Invite Users** by editing and uploading the sample CSV file including all the users details. +
    + +add new user + +
    +::: + +### Disabling a user's access + +You can disable any active user's access to your workspace by clicking on the **Archive** button and the status of the user will change from **active** to **archived**. + +
    + +archived + +
    + +### Enabling a user's access + +Similar to archiving a user's access, you can enable it again by clicking on **Unarchive**. The status of user will change from **archived** to **invited** and the user will have to join again using the invite link received via the e-mail. + +
    + +status + +
    + +## Managing Groups + +On ToolJet, Admins can create groups for users added in a workspace and grant them access to particular app(s) with specific permissions. To manage groups, just go to the **Workspace Settings** from the left-sidebar of the dashboard and click on the **Groups**. + +
    + +Manage Groups + +
    + +### Group properties + +Every group on ToolJet has three sections: + +#### Apps: + +Admins can add or remove any number of apps for a group of users. To add an app to a group, select an app from the dropdown and click on `Add` button next to it. You can also set app permissions such as `View` or `Edit` for the group. You can set different permissions for different apps in a group. + +
    + +apps + +
    + +#### Users: + +Admins can add or remove any numbers of users in a group. Just select a user from the dropdown and click on `Add` button to add it to a group. To delete a user from a group, click on `Delete` button next to it. + +
    + +users + +
    + +#### Permissions: + +Admins can set granular permission like creating/deleting apps or creating folder for a group of users. + +
    + +permissions + +
    + +:::tip +All the activities performed by any Admin or any user in a workspace is logged in `Audit logs` - including any activity related with managing users and groups. +::: + +### Predefined Groups + +By default, every workspace will have two User Groups: + +**1. All Users** + +This group contains all the users and admins. + +| Apps | Users | Permissions | +| ----------- | ----------- | ----------- | +| You can add or remove apps. | Modification is disabled. This group will have all the users and admins added in a workspace. | You can edit permissions for all the users globally. | + +
    + +all users + +
    + +**2. Admin** + +This group contains admins by default. Admins can add more admins or remove the users in this group. + +| Apps | Users | Permissions | +| ----------- | ----------- | ----------- | +| Modification is disabled. By default, this group has `Edit` permission for all the apps in a workspace | Admins can add or remove users in this group. | Modification is disabled. By default, all the admins can create and delete apps or create folders. | + +
    + +admin + +
    + +### Creating new group + +- Click on `Create new group` button in the **User Groups** page. +
    + + new group + +
    + +- Enter a name for the group and click `Create Group` button. +
    + + new group 2 + +
    + +- Once the group is created, you can add **Apps**, **Users** and set their **Permissions** for that group. + +### Deleting a group + +To delete a group, click on `Delete` next to it. It will confirm whether you want to delete it or not, Click on `Yes` to delete the group. + +
    + +delete group + +
    diff --git a/docs/versioned_docs/version-2.4.0/tutorial/mobile-layout.md b/docs/versioned_docs/version-2.4.0/tutorial/mobile-layout.md new file mode 100644 index 0000000000..6d53baf5fe --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/mobile-layout.md @@ -0,0 +1,26 @@ +--- +id: mobile-layout +title: Mobile layout +--- + +# Mobile layout + +Mobile layout is activated when the width of the window is less than 600px. + +:::tip +Widgets can be shown on desktop, mobile, or both. +::: + + +mobile layout + + +## Adding existing widget to mobile layout +Click on the widget to open inspector. Scroll down to the `layout` section and enable mobile layout. The width of the widget will be adjusted to fit the mobile layout. + +## Adding a new widget to mobile layout +Switch the layout to mobile by clicking the button on the top navigation bar. Drag and drop a widget to the canvas. This widget will not be shown on desktop layout unless enabled from the widget inspector via the "Show on desktop" button manually. + +:::tip +Width of the widgets will be automatically adjusted to fit the screen while viewing the application in app viewer. +::: diff --git a/docs/versioned_docs/version-2.4.0/tutorial/pages.md b/docs/versioned_docs/version-2.4.0/tutorial/pages.md new file mode 100644 index 0000000000..f492fcb32c --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/pages.md @@ -0,0 +1,205 @@ +--- +id: pages +title: Pages +--- + +Pages allows you to have multiple pages in a single application, making your ToolJet applications more robust and user-friendly. + +
    + +Multi-page app + +
    + +## Pages Panel + +You can open the **Pages Panel** by clicking on the **Pages** icon on the left sidebar of the app-builder. + +
    + +Pages Panel + +
    + +## Panel Options + +- **[Add Page](#add-page)** +- **[Settings](#settings)** +- **[Pin](#pin)** +- **[Search](#search)** + +### Add Page + +On the header of the Pages Manager, the **+** button that allows you to add more pages to your application + +
    + +Pages Panel + +
    + +On clicking the **+** button, a new page will be added, enter the name for the page and press enter. +
    + +Pages Panel + +
    + +### Settings + +From **Settings**, you can hide the **page navigation sidebar** in viewer mode, by enabling the **Disable Menu** option. +
    + +Pages Panel + +
    + +### Pin + +You can pin the pages panel from the **Pin** button and the panel won't close until you **unpin** it. +
    + +Pages Panel + +
    + +### Search + +If there are many pages on the panel then you can use the **Search bar** to look for specific page. +
    + +Pages Panel + +
    + +## Page options + +There are several options available for a Page. To use these options, click on the kebab menu on the right of the page card. + +- **[Page Handle](#page-handle)** +- **[Rename](#rename)** + +- **[Mark Home](#mark-home)** +- **[Hide Page](#hide-page)** +- **[Delete Page](#delete-page)** +- **[Event Handlers](#event-handlers)** + +
    + +Pages Panel + +
    + +### Page Handle + +Page Handle is the slug that is added at the end of the application URL. Page Handle get its default value when the page name is entered on the creation of the page. You can change the Page Handle from this option. + +
    + +Pages Panel + +
    + +### Rename + +Rename option will allow you to rename the page. + +
    + +Pages Panel + +
    + + + +### Mark Home + +Mark home option can be used to make a page the default landing page of the application, so whenever the app will be loaded the page that is marked home will be loaded. + +
    + +Pages Panel + +
    + +:::info +The page which is marked home will have a **Home** icon on the left of the Page Card. +
    + +Pages Panel + +
    +::: + + +### Hide Page + +Hide Page option can be used to hide a page from the **page navigation sidebar** in viewer mode. + +
    + +Pages Panel + +
    + +:::info +If a page is hidden then you'll see an **eye** icon on the right of the card. +
    + +Pages Panel + +
    +::: + +You can go to the options again and **unhide** the app from the **page navigation sidebar** + +
    + +Pages Panel + +
    + + +### Delete Page + +You can **delete** a page from an application using this option. + +
    + +Pages Panel + +
    + +:::info +If a page is **Marked Home** then you won't be able to delete and the delete page option will be disabled. +
    + +Pages Panel + +
    +::: + +### Event Handlers + +Just like other Event Handlers on ToolJet, you can add event handlers too pages too. + +Currently, there is **On page load** event available. You can use all the available actions for this event along with the new actions added specifically for the pages: +- **[switch page](/docs/actions/switch-page)** +- **[set page variable](/docs/actions/set-page-variable)** +- **[unset page variable](/docs/actions/unset-page-variable)** + +
    + +Pages Panel + +
    diff --git a/docs/versioned_docs/version-2.4.0/tutorial/sharing-and-deploying.md b/docs/versioned_docs/version-2.4.0/tutorial/sharing-and-deploying.md new file mode 100644 index 0000000000..4931337d82 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/sharing-and-deploying.md @@ -0,0 +1,55 @@ +--- +id: sharing-and-deploying +title: Preview and Sharing Apps +--- + +# Preview and Sharing Apps + +## Preview + +Clicking on `Preview` will open up the currently opened version of the app in the new tab. This is useful if you want to immediately check the app in production. + + +preview + +## Sharing an app + +Once you have released a version of your app, you can share the app with others using a customised url. To share an app: + +- Click on the **Share** button on the top-right corner + +
    + + +share + + +
    + +- In the dialog box, turn on the toggle switch to `Make the application public` and shareable + +
    + + +toggle + + +
    + +- Create your own `customised URL` for the app and click on `copy` to copy the URL + +
    + +url + + +
    + +- You can also `Embedd` your application using the embeddable link + +
    + +embed + + +
    diff --git a/docs/versioned_docs/version-2.4.0/tutorial/transformations.md b/docs/versioned_docs/version-2.4.0/tutorial/transformations.md new file mode 100644 index 0000000000..deca9fad6f --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/transformations.md @@ -0,0 +1,93 @@ +--- +id: transformations +title: Transformations +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Transformations + +Transformations can be enabled on queries to transform the query results. ToolJet allows you to transform the query results using two programming languages: + +- **[JavaScript](#transform-using-javascript)** +- **[Python](#transform-using-python)** + +:::caution +- Every transformation is scoped to the query it's written for. +- Actions and CSA(Component Specific Actions) cannot be called within the transformation, they can only be called within **[RunJS](/docs/data-sources/run-js)** query or **[RunPy](/docs/data-sources/run-py)** query. +::: + +## Transform using JavaScript + +Let's assume a query is returning the customers data with a `name` row, so we will write a simple transformation to compute `first_name` and `last_name` for all the customers. + +```javascript +// write your code here +// return value will be set as data and the original data will be available as rawData +return data.map((row) => { + return { + ...row, + first_name: row.name.split(' ')[0], + last_name: row.name.split(' ')[1], + }; +}); +``` + +The query will now look like this: + +
    + +Transformation + +
    + +## Transform using Python + +Let's use Python transformation to compute `first_name` and `last_name` for all the customers that we fetch in the previous step. + +```python +return list(map(lambda row: { + **row, + 'first_name': row['name'].split(' ')[0], + 'last_name': row['name'].split(' ')[1], +}, data)) +``` + +#### Example + +- Let's take a look at the data returned by a RESTAPI (using mock data here): +
    + + raw data + +
    + +- Now we will transform the returned data using Python that will append a new key in the returned data called `user` and that user will have the value from the exposed global variables of ToolJet which is `globals.currentUser.email` + ```python + return list(map(lambda item: {**item, "user": f"{globals['currentUser']['email']}"}, data)) + ``` + +- Now, you can click on the preview button to check the transformed data. +
    + + raw data + +
    + +--- + +Click the `Save` button to create the query. Saved queries can be run using the `Run` button on the top-right of query panel. Queries run using the run button will behave just as if it was triggered by an app event like button click and thus will alter the state of the app. You can view the query results using the state inspector on the left side-bar of the app builder. + +
    + +result + +
    + +We can see that `first_name` and `last_name` are added to all the rows in the `data` object of the query. If you need the original data of the query, it will be available in the `rawData` object of the query. + +
    + +raw data + +
    diff --git a/docs/versioned_docs/version-2.4.0/tutorial/versioning-and-release.md b/docs/versioned_docs/version-2.4.0/tutorial/versioning-and-release.md new file mode 100644 index 0000000000..06ff52467a --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/versioning-and-release.md @@ -0,0 +1,67 @@ +--- +id: versioning-and-release +title: Versioning and Release +--- + +# Versioning and Release + +Versioning and Release lets you version control your apps and release app changes to the users. + +## Versioning + +Versioning is really useful if multiple developers are working on an app, it allows them to save their own version of the app. This also prevents developers from overwriting the other developer's work. + +### Creating a Version + +You can create new versions from **App Version Manager** on the top-right corner. It displays the version of the app that you're currently working and can be used to switch between the different version of the app. To create a new version: + +- Go to the **App Version Manager** from the toolbar and click on the dropdown. It will display all the versions of the app that have been created. +
    + + app version + +
    + +- Click on **Create Version** and a modal will pop-up. Enter a **Version Name** and click on **Create version from** dropdown that will include all the versions of the app, choose a version that you want to use for your new version and then click on `Create Version`. +
    + + modal + +
    + +## Release + +Making a release let's you publish the app and push the changes to production. + +### Releasing a version + +To release a version: + +- Go to the **App Version Manager** and select the `version` from the dropdown that you want to release. +
    + + version dropdown + +
    + +- Click on the `Release` button on the top-right corner. +
    + + release + +
    + + +:::tip +ToolJet will block editing of the `Released version` of an app and will display a prompt to create a new version to make the changes. This is to prevent accidentally pushing an unfinished app to the live version. +
    + +release + +
    +::: + + + + + diff --git a/docs/versioned_docs/version-2.4.0/tutorial/workspace-variables.md b/docs/versioned_docs/version-2.4.0/tutorial/workspace-variables.md new file mode 100644 index 0000000000..675103c526 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/workspace-variables.md @@ -0,0 +1,65 @@ +--- +id: workspace-variables +title: Workspace Variables +--- + +Workspace Variables are the variables with some value(usually tokens/secret keys/API keys) that can be used in different apps across the same Workspace. + +## How can we add these variables to an Workspace? + +Suppose there is an `API key` or a value that you want to use in the queries or widgets in the multiple apps of the same Workspace then the Workspace admin or the user with permissions can add an environment variable. + +#### Adding the environment variable +- Go to the ToolJet Dashboard, and click on the dropdown on the navigation bar to show `Workspace` options +- Select `Manage Environment Variables` +- Click on `Add New Variable` button +- Give a `Name` to the variable, set the value, choose `Type`, toggle `Encryption`, and click **Add Variable** button +- Now this variable can be used inside any application of this Workspace + +
    + +add variable + +
    + +### Types of variables + +- **Client**: The client variable can be used in widgets and queries. + +- **Server**: The server variables can be used with all the queries except the `RunJS`. The reason why we don't allow the server variables to be used with the widgets is that these variables are only resolved during the runtime so they're highly secured. + +:::info +Variable Type cannot be changed once it has been created. +::: + +
    + +variable-type + +
    + +### Encryption + +This feature enables us to add a client variable with and without `encryption`. The server variables are always encrypted by default. + +### Using variable in an app + +Let's use the variable that we created [here](Workspace-environment-variables#adding-the-environment-variable). If you have used ToolJet before, then you know that for getting the values from any variable we use JS notation i.e. `{{}}` but for using the Workspace variables we have different opening and closing notation `%% %%`. The environment variables will not work inside js code `{{}}`. + +So, the syntax for using the variable that we created before will be `%%client.pi%%` + +**Example for client variable usage:** + +
    + +variable-usage + +
    + +**Example for server variable usage:** + +
    + +server-variable-usage + +
    diff --git a/docs/versioned_docs/version-2.4.0/tutorial/workspace_overview.md b/docs/versioned_docs/version-2.4.0/tutorial/workspace_overview.md new file mode 100644 index 0000000000..cba6a9aa33 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/tutorial/workspace_overview.md @@ -0,0 +1,42 @@ +--- +id: workspace_overview +title: 'Workspace: Overview' +--- + +# Workspace: Overview + +User can create their own workspaces, user who created workspace will be having admin privileges for the workspace. + +
    + +multi workspace + +
    + +## Hierarchy + +
    + +tooljet workspace + +
    + +## Permissions + +:::tip +Please check the detailed doc on **[Permissions](/docs/org-management/permissions)**. +::: + +- The administrator can manage [users and groups](/docs/tutorial/manage-users-groups) of each workspace +- Applications and settings can not be shared between workspaces +- A user authorised to login to ToolJet will not have access to all workspaces, Users should be invited or signed up to a workspace to log-in to it. +- When Multi-Workspace feature is enabled, user should login with username and password to log in to Tooljet. +- Administrator can configure authentication methods for their workspaces. +- If password login is enabled, switching to the workspace will happen without any other authorization since the user is already authorized with password login. +- User logged in to Toojet and trying to switch to a workspace where SSO is enabled and password login is disabled, will be redirected to workspace login page and enabled SSO options will be shown +- User can directly login to a workspace using workspace login URL, Administrator can view the URL **Manage SSO -> General Settings -> Login URL**. + +### When disabled (Super Admin) +- Only **[Super Admins](/docs//Enterprise/superadmin#restrict-creation-of-personal-workspace-of-users)** can disable the option for creating personal workspaces for a user. +- If creating personal workspaces is disabled, Create workspace feature won’t be available. +- No separate login page for workspace and SSO configured for the workspace will be reflected to the main login page/login. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/user-authentication/general-settings.md b/docs/versioned_docs/version-2.4.0/user-authentication/general-settings.md new file mode 100644 index 0000000000..e0e6098e43 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/user-authentication/general-settings.md @@ -0,0 +1,38 @@ +--- +id: general-settings +title: General Settings +--- + +# Single Sign-On General Settings + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
    + + General Settings: SSO + +
    + +- Select `SSO` from sidebar and then select **General Settings** +
    + + General Settings: SSO + +
    + +## Enable Signup + +You can enable/disable `Enable signup`. If it is enabled, new account will be created for user's first time SSO sign in else only existing users will be allowed to sign in via SSO. + +## Allowed domains + +You can set allowed domains for SSO login, can add multiple domains comma separated. Allowed all domains by default. + +## Login URL + +You can use the login URL to login directly to the workspace. This will be hidden if Multi-Workspace is disabled. + +
    + +General Settings: SSO + +
    diff --git a/docs/versioned_docs/version-2.4.0/user-authentication/password-login.md b/docs/versioned_docs/version-2.4.0/user-authentication/password-login.md new file mode 100644 index 0000000000..8dfb6e405f --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/user-authentication/password-login.md @@ -0,0 +1,32 @@ +--- +id: password-login +title: Password Login +--- + +# Password Login + +Password login is enabled by default for all workspaces. User with admin privilege can enable/disable it. + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
    + + General Settings: SSO + +
    + +- Select `SSO` from sidebar +
    + + General Settings: SSO + +
    + +- Select **Password Login**. You can enable/disable it +
    + + General Settings: SSO + +
    + +## Retry limits +The user password authentication method will be disabled after predefined numbers of wrong password attempts. This feature can be disabled using setting `DISABLE_PASSWORD_RETRY_LIMIT` to `true` in environment variables. Number of retries allowed will be 5 by default, it can be override by `PASSWORD_RETRY_LIMIT` environment variable. diff --git a/docs/versioned_docs/version-2.4.0/user-authentication/sso/_category_.json b/docs/versioned_docs/version-2.4.0/user-authentication/sso/_category_.json new file mode 100644 index 0000000000..109724a4fd --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/user-authentication/sso/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Single Sign-on", + "position": 10, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/user-authentication/sso/github.md b/docs/versioned_docs/version-2.4.0/user-authentication/sso/github.md new file mode 100644 index 0000000000..2333addaed --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/user-authentication/sso/github.md @@ -0,0 +1,67 @@ +--- +id: github +title: GitHub +--- + +# GitHub Single Sign-on + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
    + + General Settings: SSO + +
    + +- Select `SSO` from sidebar and then select **GitHub**. GitHub login will be **disabled** by default, +
    + + General Settings: SSO + +
    + +- Enable GitHub. You can see `Redirect URL` generated +
    + + General Settings: SSO + +
    + +- Go to **[GitHub Developer settings](https://github.com/settings/developers)** and navigate to `OAuth Apps` and create a project. `Authorization callback URL` should be the generated `Redirect URL` in Git manage SSO page. +
    + + General Settings: SSO + +
    + +- Open the application details, and you can see the `Client ID` +
    + + General Settings: SSO + +
    + +- Then create `Client secrets` by clicking `Generate new client secret` +
    + + General Settings: SSO + +
    + +Lastly, enter **Client Id** and **Client Secret** in GitHub manage SSO page and save. + +The GitHub sign-in button will now be available in your ToolJet login screen. + +:::info +Should configure `Host Name` if you are using GitHub Enterprise self hosted. Host name should be a URL and should not ends with `/`, example: `https://github.tooljet.com` +::: + +## Setting default SSO +To set GitHub as default SSO for the instance use environment variable. + +| variable | description | +| ------------------------------------- | ----------------------------------------------------------- | +| SSO_GIT_OAUTH2_CLIENT_ID | GitHub OAuth client id | +| SSO_GIT_OAUTH2_CLIENT_SECRET | GitHub OAuth client secret | +| SSO_GIT_OAUTH2_HOST | GitHub OAuth host name if GitHub is self hosted | + +**Redirect URL should be `/sso/git`** \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/user-authentication/sso/google.md b/docs/versioned_docs/version-2.4.0/user-authentication/sso/google.md new file mode 100644 index 0000000000..ed5f8f7b41 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/user-authentication/sso/google.md @@ -0,0 +1,85 @@ +--- +id: google +title: Google +--- + +# Google Single Sign-on + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
    + + General Settings: SSO + +
    + +- Select `SSO` from sidebar and then select **Google**. Google login will be **disabled** by default, +
    + + General Settings: SSO + +
    + +- Enable Google. You can see `Redirect URL` generated +
    + + General Settings: SSO + +
    + +- Go to **[Google cloud console](https://console.cloud.google.com/)** and create a project. +
    + + General Settings: SSO + +
    + +- Go to the **[Google cloud console credentials page](https://console.cloud.google.com/apis/credentials)**, and create an OAuth client ID +
    + + General Settings: SSO + +
    + +- You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise, +select 'External'. +
    + + General Settings: SSO + +
    + +- You'll be led to an app registration page where you can set OAuth scopes. Select 'Add or remove scopes' and add the scopes +userinfo.email and userinfo.profile as shown in the image. This will allow ToolJet to store the email and name of the +user who is signing in +
    + + General Settings: SSO + +
    + +- Set the domain on which ToolJet is hosted as an authorized domain +
    + + General Settings: SSO + +
    + +- Set the `Redirect URL` generated at manage SSO `Google` page under Authorised redirect URIs +
    + + General Settings: SSO + +
    + +Lastly, set the `client id` in google manage SSO page. This value will be available from your [Google cloud console credentials page](https://console.cloud.google.com/apis/credentials) + +The Google sign-in button will now be available in your ToolJet login screen. + +## Setting default SSO +To set Google as default SSO for the instance use environment variable. + +| variable | description | +| ------------------------------------- | ----------------------------------------------------------- | +| SSO_GOOGLE_OAUTH2_CLIENT_ID | Google OAuth client id | + +**Redirect URL should be `/sso/google`** diff --git a/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/azuread.md b/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/azuread.md new file mode 100644 index 0000000000..c124c7a852 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/azuread.md @@ -0,0 +1,67 @@ +--- +id: azuread +title: AzureAD +--- + +# AzureAD Single Sign-on + +:::info +To construct a Well Known URL refer this link :: https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-protocols-oidc +::: + +- Open your organisation page and select `app registration` +
    + + Azure AD: SSO + +
    + +- Select `new registration` +
    + + Azure AD: SSO + +
    + +- Open your organisation page and select App registration. + +- Enter name, select supported account type and enter the redirect URL which can be copied from `Manage SSO -> Open Id -> Redirect URL, click on register`. +
    + + Azure AD: SSO + +
    + +- Application will be registered and will be able to view the details + +- Configure Application (Client) ID as `client id` in Open Id configuration page. +
    + + Azure AD: SSO + +
    + +- Click on `Add certificate or secret` next to the **Client credentials**. + +- Click on `+New Client Secret` +
    + + Azure AD: SSO + +
    + +- Give a description, set the expiry, and then click on the `Add` button. +
    + + Azure AD: SSO + +
    + +- Secret will be created, copy value and add it to the `client secret` section of Open Id SSO config. + +- You can brand the redirect page using the branding and properties option. +
    + + Azure AD: SSO + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/google-openid.md b/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/google-openid.md new file mode 100644 index 0000000000..1fdb46e62b --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/google-openid.md @@ -0,0 +1,82 @@ +--- +id: google-openid +title: Google (Open ID) +--- + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
    + + Google Open ID + +
    + +- Select `SSO` from workspace options +
    + + Google Open ID + +
    + +- Select `Open ID Connect` from the left sidebar +
    + + Google Open ID + +
    + +- Set **Name** as `Google` and get the **Client ID** and **Client Secret** from your [Google Clound Console](https://console.cloud.google.com/apis/credentials). + +- Set the **Well Known URL** to `https://accounts.google.com/.well-known/openid-configuration` + +#### Generating Cliend ID and Cliend Secret on GCS + +- Go to [Google cloud console](https://console.cloud.google.com/) and create a project. +
    + + Google Open ID + +
    + +- Go to the [Google cloud console credentials page](https://console.cloud.google.com/apis/credentials), and create an OAuth client ID +
    + + Google Open ID + +
    + +- You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise, +select 'External'. +
    + + Google Open ID + +
    + +- You'll be led to an app registration page where you can set OAuth scopes. Select 'Add or remove scopes' and add the scopes +userinfo.email and userinfo.profile as shown in the image. This will allow ToolJet to store the email and name of the +user who is signing in +
    + + Google Open ID + +
    + +- Set the domain on which ToolJet is hosted as an authorized domain +
    + + Google Open ID + +
    + +- Set the `Redirect URL` generated at manage SSO `Open ID` page under Authorised redirect URIs +
    + + Google Open ID + +
    + +- Now, you can view your **client ID** and **client secret** from the [Credentials page](https://console.developers.google.com/apis/credentials) in API Console: + - Go to the Credentials page. + - Click the name of your credential or the pencil icon. Your client ID and secret are at the top of the page. + + diff --git a/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/okta.md b/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/okta.md new file mode 100644 index 0000000000..c10c68592c --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/okta.md @@ -0,0 +1,53 @@ +--- +id: okta +title: Okta +--- + +# Okta Single Sign-on + +- Sign in to [Okta developer console](https://developer.okta.com/) + +- Go to the `Applications` section and click on the `Create App Integration` +
    + + Okta: SSO + +
    + +- Select `Sign-in method` as `OIDC - OpenID Connect` and `Application type` as `Web Application`. Go to the next step +
    + + Okta: SSO + +
    + +- Enter `App integration name` and then enter `Sign-in redirect URIs` as `/sso/okta`. +
    + + Okta: SSO + +
    + +- Create application and configure `Client Credentials` in the UI. +
    + + Okta: SSO + +
    + +- If you wish to show your application on Okta, edit the application and select `Login initiated by` section as `Either Okta or App`, set visibility according to your preference and `Login flow` should `Redirect to app to initiate login (OIDC Compliant)`. +
    + + Okta: SSO + +
    + +:::info Change Grant type +To change the Login flow to `Redirect to app to initiate login (OIDC Compliant)`, its mandatory to change the `Grant type` - `Client acting on behalf of a user` section to `Implicit (hybrid)` and tick `Allow Access Token with implicit grant type`. +::: + +- The Okta sign-in button will now be available in your ToolJet login screen. + +:::info Find Well Known URL +Refer to this Link: https://developer.okta.com/docs/concepts/auth-servers/#org-authorization-server +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/setup.md b/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/setup.md new file mode 100644 index 0000000000..60868de59e --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/user-authentication/sso/openid/setup.md @@ -0,0 +1,33 @@ +--- +id: setup +title: Setup +--- + + +
    Available on: Enterprise Edition
    + +# Configure OpenId Connect Single Sign-on + + +- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard +
    + + General Settings: SSO + +
    + +- Select `SSO` from workspace options +
    + + Okta: SSO + +
    + +- Select `OpenId Connect`. +
    + + Okta: SSO + +
    + +- Find and set **Name**, **Client Id**, **Client Secret**, and **Well Known URL** from your Open Id provider. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/user-authentication/user-lifecycle.md b/docs/versioned_docs/version-2.4.0/user-authentication/user-lifecycle.md new file mode 100644 index 0000000000..48f536b873 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/user-authentication/user-lifecycle.md @@ -0,0 +1,100 @@ +--- +id: user-lifecycle +title: User Lifecycle +--- + +# User Lifecycle + +:::info +Check Workspace docs [here](/docs/tutorial/workspace_overview). +::: + +### User onboarding + + - User can sign up using the sign up link provided on the login page, user will receive a welcome email with activation link. New workspace will be created for the user. + +
    + + ![ToolJet - Workspace sign up](/img/user-lifecycle/signup-mw.png) + +
    + + - Users can be added to multiple workspaces. Users can create their own workspaces and manage them. + +
    + + ![ToolJet - Workspace sign up](/img/user-lifecycle/user-mw.png) + +
    + + - Existing user in active state for a workspace can be invited and on boarded to other workspaces, User will receive an invitation email with join link. If a user does not exist in the system, then they will receive a welcome email to setup the account, user can follow the link and on setup the account, once its done the user will be assigned to the new workspace created for the user. + +
    + + ![ToolJet - Workspace sign up](/img/user-lifecycle/invite-link-mw.png) + +
    + + - Invited user can onboard through SSO login, without using an invitation link from the workspace [login page](/docs/user-authentication/general-settings#login-url) + +
    + + ![ToolJet - Workspace accept invite](/img/user-lifecycle/sso-onboard-sw.png) + +
    + + - If `enable sign up` option in enabled in SSO [general settings](/docs/user-authentication/general-settings#enable-signup) for the workspace, user can setup account through SSO login without an invite from the workspace [login page](/docs/user-authentication/general-settings#login-url) + +
    + + ![ToolJet - Workspace sign up using SSO](/img/user-lifecycle/sso-enable-signup-sw.png) + +
    + +### Archive user + - User can be archived by workspace admin from using `Manage User` page + +
    + + ![ToolJet -Workspace Archive user](/img/user-lifecycle/archive-user.png) + +
    + +### Unarchive user + - User can be unarchive by workspace admin from using `Manage User` page + +
    + + ![ToolJet - Single-Workspace Unarchive user](/img/user-lifecycle/unarchive-user-mw.png) + +
    + + :::info + Archive or unarchive will not affect user login, user can login and use other workspaces where user is in active state. + ::: + +### Switch between workspaces + +
    + + ![ToolJet - Workspace sign up using SSO](/img/user-lifecycle/switch.png) + +
    + + +## User status + +| Status | Able to log in | How to activate | +| -------- | ---------------- | ------------------------------------ | +| active | Yes | | +| invited | No (Yes with SSO)| Login through SSO or invitation link | +| archived | No | Not able to activate. Invite from `Manage Users` page, status will be changed to invited | + +## Workspace SSO flow + - Diagram shows how SSO configurations are chosen in common login page and workspace login page. Instance level SSO is configured in environment variables and Workspace level SSO is configured in respective `Manage SSO` page. + +
    + + ![ToolJet - SSO Flow](/img/user-lifecycle/sso-flow.png) + +
    diff --git a/docs/versioned_docs/version-2.4.0/widgets/_category_.json b/docs/versioned_docs/version-2.4.0/widgets/_category_.json new file mode 100644 index 0000000000..28ad4a4735 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Widget Reference", + "position": 6, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/bounded-box.md b/docs/versioned_docs/version-2.4.0/widgets/bounded-box.md new file mode 100644 index 0000000000..4a7edb33be --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/bounded-box.md @@ -0,0 +1,100 @@ +--- +id: bounded-box +title: Bounded Box +--- + +# Bounded box + +A bounded box is an infinitely customizable image annotation component that can be used to select and tag areas of an image. It supports selection using specific points (landmarking) or draw rectangular areas (bounding boxes). + +
    + +Bounded Box + +
    + +## Properties + +
    + +Bounded Box + +
    + +### Image URL + +The bounding box required an image to display, enter the URL of the image to display it on the component. + +### Selector + +The bounded box support selection using: +- **Rectangle** +- **Point** + +You can also click on the **Fx** to set the value programmatically. + +### List of labels + +This property will include the list of label that will be displayed in the dropdown while selection in the bounded-box. This property requires the label in array format. + +## Events + +To add an event to a bounded-box, click on the component handle to open its properties on the right. Go to the **Events** accordion and click on **Add handler**. + +
    + +Button group events + +
    + +### On change + +On change event is triggered when the label from the dropdown in the selector is changed in the bounded box. Just like any other event on ToolJet, you can set multiple handlers for on-change event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General + +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Hovering over the component will display the string as the tooltip. + +
    + +Button group Tooltip + +
    + +## Layout + +
    + +Button group layout + +
    + +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +
    + +Bounded box properties + +
    + +| Style | Description | +| ----------- | ----------- | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the component will not be visible when the app is loaded. By default, it's set to `{{true}}`. | +| Disable | Toggle on to disable the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the component will be disabled and becomes non-functional. By default, its value is set to `{{false}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/button-group.md b/docs/versioned_docs/version-2.4.0/widgets/button-group.md new file mode 100644 index 0000000000..f415e830c7 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/button-group.md @@ -0,0 +1,95 @@ +--- +id: button-group +title: Button Group +--- +# Button group + +Button group widget can be used to take actions. + +
    + +Button group + +
    + +## Properties +### Events + +To add an event to a button group, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +
    + +Button group events + +
    + +#### On click +On click event is triggered when the button group is clicked. Just like any other event on ToolJet, you can set multiple handlers for on click event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +### Properties + +
    + +Button group properties + +
    + +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| label | label is used to set the heading of the button group. | Any **String** value | +| values |Values for button group items. | **Array** of strings and numbers | +| labels | It can be used to set the labels of the button group items. | **Array** of strings and numbers | +| Default selected | Initial selected values can be set using this. | **Array** of strings and numbers | +| Enable multiple selection | Toggle this to allow multiple button selection. | Toggle to true/false | + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +Button group Tooltip + +
    + +### Layout + +
    + +Button group layout + +
    + +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +### Styles + +
    + +Button group properties + +
    + +| Style | Description | +| ----------- | ----------- | +| Background color | You can change the background color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. | +| Text color | You can change the color of the Text in button by entering the Hex color code or choosing a color of your choice from the color picker. | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | Toggle on to lock the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the button. | +| Selected text color | Use this property to modify the background colour of text in selected button | +| Selected background color | Use this property to modify the background colour of selected button | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/button.md b/docs/versioned_docs/version-2.4.0/widgets/button.md new file mode 100644 index 0000000000..dd86c3b615 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/button.md @@ -0,0 +1,96 @@ +--- +id: button +title: Button +--- +# Button + +Button widget can be used to take actions. + + + +## Properties + +To add an event to a button, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +### Events + +
    + +ToolJet - Widget Reference - Button Events List + +
    + +#### On click + +**On Click** event is triggered when the button is clicked. + +#### On hover + +**On hover** event is triggered when the mouse cursor is moved over the button. Just like any other event on ToolJet, you can set multiple handlers for on click event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +### Properties + +
    + +ToolJet - Widget Reference - Button Properties + +
    + +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| Button Text | It can be used to set the label of the button. | Any **String** value: `Send Message`, `Delete`, or `{{queries.xyz.data.action}}` | +| Loading state | Loading state can be used to show a spinner as the button content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. | Switch the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}` | + + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Tooltip + +
    + +### Layout + +
    + +ToolJet - Widget Reference - Layout + +
    + +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +### Styles + +
    + +ToolJet - Widget Reference - Button Styles + +
    + + +| Style | Description | +| ----------- | ----------- | +| Background color | You can change the background color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. | +| Text color | You can change the color of the Text in button by entering the Hex color code or choosing a color of your choice from the color picker. | +| Loader color | You can change the color of the loader in button by entering the Hex color code or choosing a color of your choice from the color picker. This will only be affective if the [loading state](#properties-1) property of the button is enabled. | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | Toggle on to lock the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the button. | +| Border color | Add a color to the border of the button using this property. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/calendar.md b/docs/versioned_docs/version-2.4.0/widgets/calendar.md new file mode 100644 index 0000000000..454a2393da --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/calendar.md @@ -0,0 +1,199 @@ +--- +id: calendar +title: Calendar +--- +# Calendar + +Calendar widget comes with the following features: +- **Day, month and week level views** +- **Events** +- **Resource scheduling** + +
    + +ToolJet - Widget Reference - Calendar + +
    + +## Properties + +### Date format +Determines the format in which any date passed to the calendar via any of the properties will be parsed. It also determines the format in which any date made available by the calendar via exposed variables will be displayed. It uses the date format conventions of [moment.js](https://momentjs.com/). The default Date format is set to `MM-DD-YYYY HH:mm:ss A Z`. +### Default date +Determines the date on which the calendar's view will be centered on. By default, the default date is set to the current date using moment.js i.e. `{{moment().format("MM-DD-YYYY HH:mm:ss A Z")}}`. If the calendar is on `month` view, it will show the month on which this date exists. If the calendar is on `week` view, it will show the week on which this date exists. This property needs to be formatted using the `Date format` property which is configurable on the inspector. + +### Events +`Events` property should contain an array of objects, each of which describes the events that the calendar needs to display. + +Assuming that you set the date format to `MM-DD-YYYY HH:mm:ss A Z`, setting the `Events` property to the following code snippet will display an event titled `Sample Event` at the first hour of this day, as displayed in the image of calendar at the beginning of this page. + +```javascript +{{[ + { + title: 'Sample event', + start: `${moment().startOf('day').format('MM-DD-YYYY HH:mm:ss A Z')}`, + end: `${moment().endOf('day').format('MM-DD-YYYY HH:mm:ss A Z')}`, + allDay: false, + tooltip: 'Sample event', + color: 'lightgreen', + } +]}} +``` + +### Event object properties + +| Name | Description | +|------|-------------| +| title | Title of the event | +| start | The date(and time) on which this event begins. Needs to be formatted in the `Date format` you've supplied | +| end | The date(and time) on which this event ends. Needs to be formatted in the `Date format` you've supplied | +| allDay | Optional. Qualifies the event as an 'All day event', which will pin it to date headers on `day` and `week` level views | +| tooltip | Tooltip which will be display when the user hovers over the event | +| color | Background color of the event, any css supported color name or hex code can be used | +| textColor | Color of the event title, any css supported color name or hex code can be used | +| textOrientation | Optional. If it is set to `vertical`, the title of the event will be oriented vertically. | +| resourceId | Applicable only if you're using resource scheduling. This is the id of the resource to which this event correspond to. | + +You may supply any other additional property to the event(s). These additional properties will available to you when the calendar widget +exposes any of the events via its exposed variables. + +### Resources + +Specifying resources will make the calendar categorize `week` view and `day` view for each of the resources specified. + + For example, to categorize week/day view into for three rooms, we specify `resources` this way: + +```javascript +{{[ + {resourceId: 1, title: 'Room A'}, + {resourceId: 2, title: 'Room B'}, + {resourceId: 3, title: 'Room C'}, + ]}} +``` + +If we specify the `resourceId` of any of the events as `1`, then that event will be assigned to `Room A`, generating the following calendar, assuming that we've set the view to `day` and are viewing the day on which this event exists. + +
    + +ToolJet - Widget Reference - Calendar + +
    + +### Default view + +Determines whether the calendar would display a `day`, a `week` or a `month`. Setting this property to anything other than these values will make the calendar default to `month` view. + +The view that is currently selected will be exposed as the variable `currentView`. + +### Start time on week and day view + +This determines the time at which week view and day view cells begins. Keep in mind that this field accepts a date, but still only the time and timezone(if provided) are taken from this date. The date should be provided in the date format chosen by you in the first property field. + +### End time on week and day view + +This determines the time at which week view and day view cells ends. Keep in mind that this field accepts a date, but still only the time and timezone(if provided) are taken from this date. The date should be provided in the date format chosen by you in the first property field. + +### Show toolbar + +Determines whether the calendar toolbar should be displayed or not. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +### Show view switcher + +Determines whether the calendar's buttons that allow user to switch between `month`, `week` and `day` level views will be displayed. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +### Highlight today + +Determines whether the today's card on the calendar should be highlighted or not. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +### Show popover when the event is clicked + +Determines whether to display a popover whenever an event is clicked. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +## Events + +
    + +ToolJet - Widget Reference - Calendar + +
    + +### On Event selected + +This event is fired when the user clicks on a calendar event. + +Last selected event is exposed as `selectedEvent`. + +### on Slot selected + +This event is fired when the user either clicks on an calendar slot(empty cell or empty space of a cell with event) or when they click and drag to select multiple slots. + +Last selected slot(s) are exposed as `selectedSlots`. + +### On Date Navigate + +This event is fired when the user clicks on `Today`, `Next` or `Back` buttons on the calendar. + +The corresponding date to which the user navigated, will be exposed as `currentDate`. + +### On View Change + +This event is fired when a different view is selected by the user. + +The current view is exposed as `currentView`. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. Under the General accordion,you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Calendar + +
    + +## Layout + +
    + +ToolJet - Widget Reference - Calendar + +
    + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
    + +ToolJet - Widget Reference - Calendar + +
    + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Cell size in views classified by resource + +When `resources` are specified, the calendar could take up quite a lot of horizontal space, making the horizontal scroll bar of calendar having to be relied upon all the time. + +If we set this property to `compact`, the cell sizes will be smaller in `week` and `day` views. + +### Header date format on week view + +This format determines how the column header for each day in week view will be displayed. As with every other date format field in ToolJet, this follows the **momentjs** standard of date formatting. By default, its set to `DD MMM`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + diff --git a/docs/versioned_docs/version-2.4.0/widgets/chart.md b/docs/versioned_docs/version-2.4.0/widgets/chart.md new file mode 100644 index 0000000000..9760de273f --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/chart.md @@ -0,0 +1,389 @@ +--- +id: chart +title: Chart +--- +# Chart + +Chart widget takes the chart type, data and styles to draw charts using Plotly.js. + +## How To Use Chart Widget + + + +## Chart types +### Line charts + +**Data requirements:** The data needs to be an array of objects and each object should have `x` and `y` keys. + +**Example:** +```json +[ + { "x": "Jan", "y": 100}, + { "x": "Feb", "y": 80}, + { "x": "Mar", "y": 40}, + { "x": "Apr", "y": 100}, + { "x": "May", "y": 80}, + { "x": "Jun", "y": 40} +] +``` + +The chart will look like this: + +
    + +ToolJet - Widget Reference - Chart + +
    + +### Bar charts + +**Data requirements:** The data needs to be an array of objects and each object should have `x` and `y` keys. + +**Example:** + +```json +[ + { "x": "Jan", "y": 100}, + { "x": "Feb", "y": 80}, + { "x": "Mar", "y": 40}, + { "x": "Apr", "y": 100}, + { "x": "May", "y": 80}, + { "x": "Jun", "y": 40}, + { "x": "Jul", "y": 100}, + { "x": "Aug", "y": 80}, + { "x": "Sep", "y": 40} +] +``` + +The chart will look like this: + +
    + +ToolJet - Widget Reference - Chart + +
    + +### Pie charts + +**Data requirements:** The data needs to be an array of objects and each object should have `label` and `value` keys. + +**Example:** + +```json +[ + { "x": "Jan", "y": 100}, + { "x": "Feb", "y": 80}, + { "x": "Mar", "y": 40}, + { "x": "Apr", "y": 100}, + { "x": "May", "y": 80}, + { "x": "Jun", "y": 40} +] +``` + +The chart will look like this: + +
    + +ToolJet - Widget Reference - Chart + +
    + +## Properties + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +### Title + +This field is used to add a title to your selected chart. + +### Plotly JSON chart schema + +In the chart widget, you can also plot a chart with JSON data. So the JSON will contain the information about the chart type, chart data, etc. You can learn more about the JSON properties from [here](https://plotly.com/javascript/reference/). + +Anyway, to work with the JSON you need to enable the `Use Plotly JSON schema` toggle from the properties section. + +
    + +ToolJet - Widget Reference - Chart + +
    + +It will show the [JSON description](https://plotly.com/chart-studio-help/json-chart-schema/) field to put the JSON data. + +The result will be like this: + +
    + +ToolJet - Widget Reference - Chart + +
    + +### Using Plotly JSON chart schema + +In the **JSON description**, the value needs to be the `data` array with x and y axis values and at the end we need to specify the `type`. let's take a look at the examples for different chart types. +#### Line + +```bash + { + "data": [ + { + "x": [ + "Jan", + "Feb", + "Mar" + ], + "y": [ + 100, + 80, + 40 + ], + "type": "line" + }, + { + "x": [ + "Jan", + "Feb", + "Mar" + ], + "y": [ + 300, + 30, + 20 + ], + "type": "line" + } + ] + } +``` + +
    + +ToolJet - Widget Reference - Chart + +
    + +#### Bar + +```bash +{ + "data": [ + { + "name": "SF Zoo", + "type": "bar", + "x": [ + 20, + 14, + 23 + ], + "y": [ + "giraffes", + "orangutans", + "monkeys" + ], + "marker": { + "line": { + "color": "rgba(55, 128, 191, 1.0)", + "width": 1 + }, + "color": "rgba(55, 128, 191, 0.6)" + }, + "orientation": "h" + }, + { + "name": "LA Zoo", + "type": "bar", + "x": [ + 12, + 18, + 29 + ], + "y": [ + "giraffes", + "orangutans", + "monkeys" + ], + "marker": { + "line": { + "color": "rgba(255, 153, 51, 1.0)", + "width": 1 + }, + "color": "rgba(255, 153, 51, 0.6)" + }, + "orientation": "h" + } + ], + "layout": { + "barmode": "stack" + }, + "frames": [] +} +``` +
    + +ToolJet - Widget Reference - Chart + +
    + +#### Area + +```bash +{ + "data": [ + { + "uid": "babced", + "fill": "tonexty", + "mode": "none", + "name": "Col2", + "type": "scatter", + "x": [ + "2000-01-01", + "2001-01-01", + "2002-01-01", + "2003-01-01", + "2004-01-01", + "2005-01-01", + "2006-01-01", + "2007-01-01", + "2008-01-01", + "2009-01-01", + "2010-01-01", + "2011-01-01", + "2012-01-01", + "2013-01-01", + "2014-01-01", + "2015-01-01", + "2016-01-01" + ], + "y": [ + "17087182", + "29354370", + "38760373", + "40912332", + "51611646", + "64780617", + "85507314", + "121892559", + "172338726", + "238027855", + "206956723", + "346004403", + "697089489", + "672985183", + "968882453", + "863105652", + "1068513050" + ], + "fillcolor": "rgb(224, 102, 102)" + } + ], + "layout": { + "title": "Total Number of Websites", + "width": 800, + "xaxis": { + "type": "date", + "range": [ + 946702800000, + 1451624400000 + ], + "title": "Source: Scribblrs
    Source: Internet Live Stats", + "showgrid": false, + "autorange": true, + "tickformat": "%Y" + }, + "yaxis": { + "type": "linear", + "range": [ + 0, + 1124750578.9473684 + ], + "title": "", + "autorange": true + }, + "height": 500, + "autosize": false + }, + "frames": [] +} +``` + +
    + +ToolJet - Widget Reference - Chart + +
    + +#### Few more exmaples: + +**Link to JSON description:** https://raw.githubusercontent.com/plotly/plotly.js/master/test/image/mocks/0.json + +
    + +ToolJet - Widget Reference - Chart + +
    + +**Link to JSON description:** https://raw.githubusercontent.com/plotly/plotly.js/master/test/image/mocks/12.json + +
    + +ToolJet - Widget Reference - Chart + +
    + +:::tip +Check the **[Plotly documentation](https://plotly.com/chart-studio-help/json-chart-schema/#more-examples)** to explore the all type of charts available. +::: + +## Marker color + +Modify the color of marker using the color picker or by providing a `HEX color code`. + +## Options +### Loading state + +Toggle `on` the switch to display a loader on the widget. You can also programmatically define it's value by clicking on `Fx`, acceptable values are - `{{true}}` and `{{false}}`. + +### Show Axes + +Enable or disable the `x` and `y` axes on the chart through this property. You can also programmatically define it's value by clicking on `Fx`, acceptable values are - `{{true}}` and `{{false}}`. + +### Show grid lines + +Toggle `on` or `off` to show or hide the grid lines on the chart. You can also programmatically define it's value by clicking on `Fx`, acceptable values are - `{{true}}` and `{{false}}`. + +## Layout + +
    + +ToolJet - Widget Reference - Chart + +
    + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
    + +ToolJet - Widget Reference - Chart + +
    + +### Padding + +Define a space between the widget element and the widget border using `Padding` property. Use any numerical value between `1` to `100`. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. diff --git a/docs/versioned_docs/version-2.4.0/widgets/checkbox.md b/docs/versioned_docs/version-2.4.0/widgets/checkbox.md new file mode 100644 index 0000000000..dbdc0f0650 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/checkbox.md @@ -0,0 +1,108 @@ +--- +id: checkbox +title: Checkbox +--- +# Checkbox + +Checkbox widget can be used for allowing the users to make a binary choice, e.g,. unselected or selected. + +:::info +The checkbox widget consists of a single checkbox input. +::: + +## How To Use Checkbox Widget + + + +## Properties + +### Label + +The text is to be used as the label for the checkbox. This field expects a `String` input. + +### Default Status + +The property is used to set the default status (enabled or disabled) of the checkbox widget when the app is loaded. By default, the checkbox component is set to `{{false}}`/disabled. + +### Events + +To add an event to a checkbox component, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **+ Add handler**. + +
    + +ToolJet - Widget Reference - Checkbox + +
    + +#### On check + +On check event is triggered when checkbox input is checked. +#### On uncheck + +On uncheck event is triggered when checkbox input is unchecked. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Checkbox + +
    + +### Layout + +
    + +ToolJet - Widget Reference - Checkbox + +
    + +#### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +#### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
    + +ToolJet - Widget Reference - Checkbox + +
    + +### Text color + +Change the color of the Text in checkbox by entering the `Hex color code` or choosing a color of your choice from the color-picker. + +### Checkbox color + +You can change the color of the checkbox by entering the `Hex color code` or choosing a color of your choice from the color-picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| `setChecked` | Set checkbox state. | pass status as parameter. ex: `components.checkbox1.setChecked(true)` | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/circular-progressbar.md b/docs/versioned_docs/version-2.4.0/widgets/circular-progressbar.md new file mode 100644 index 0000000000..47064de88e --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/circular-progressbar.md @@ -0,0 +1,78 @@ +--- +id: circular-progress-bar +title: Circular Progress Bar +--- +# Circular Progress Bar + +Circular progress bar widget can be used to show progress in a progress circle. + +
    + +ToolJet - Widget Reference - Circular progress bar + +
    + +## Properties + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +
    + +ToolJet - Widget Reference - Circular progress bar + +
    + +| properties | description | Expected Value | +| ----------- | ----------- | --------------- | +| Text | We can set a text inside the progress circle.| It expects a `String`, you can also use js to dynamically update the text as the progress changes. | +| Progress | It can be used to set the progress of the widget. | Progress should be an integer between 0 and 100.| + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Circular progress bar + +
    + +## Layout + +
    + +ToolJet - Widget Reference - Circular progress bar + +
    + +| Layout | description | +| ----------- | ----------- | +| Show on desktop | Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | + +## Styles + +
    + +ToolJet - Widget Reference - Circular progress bar + +
    + +| properties | description | Expected Value | +| ----------- | ----------- | ------------------- | +| Color | To define stroke color.| `HEX color code` or choose color from color-picker. | +| Text color | To define color of the text inside circular progress bar.| `HEX color code` or choose color from color-picker. | +| Text size | To define the size of the text | Value must between 0-100. | +| Stroke width | To define the width of stroke | Value must between 0-100.| +| Counter Clockwise | Whether to rotate progress bar in counterclockwise direction. | It accepts `{{true}}` and `{{false}}`, Default value is `false`.| +| Circle ratio | To define ratio of the full circle diameter the progressbar should use. | It accepts numerical value and the default is `1`. | +| Visibility | Toggle on or off to control the visibility of the widget. | You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Circular progress bar widget uses [react-circular-progress](https://github.com/kevinsqi/react-circular-progressbar) package. Check the repo for further more details about properties and styles. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/code-editor.md b/docs/versioned_docs/version-2.4.0/widgets/code-editor.md new file mode 100644 index 0000000000..612593221e --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/code-editor.md @@ -0,0 +1,209 @@ +--- +id: code-editor +title: Code Editor +--- +# Code Editor + +Code Editor widget is a versatile text editor for editing code and supports several languages. + +
    + +ToolJet - Widget Reference - Code editor + +
    + +## Properties + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +
    + +ToolJet - Widget Reference - Code editor + +
    + +| properties | description | Expected value | +| ----------- | ----------- | ----------------- | +| Placeholder | It specifies a hint that describes the expected value.| This field requires a `String` value | +| Mode | It is used to specify the language to be used for the code-editor.| See `info` below for the list of all supported languages | +| Show Line Number | This property is used to show or hide line numbers to the left of the editor.| This fields expects a boolean value `{{true}}` or `{{false}}` | + +:::info +
    +Supporting all commonly used languages. +
      +
    • APL
    • +
    • ASN.1
    • +
    • Asterisk dialplan
    • +
    • Brainfuck
    • +
    • C, C++, C#
    • +
    • Ceylon
    • +
    • Clojure
    • +
    • Closure Stylesheets (GSS)
    • +
    • CMake
    • +
    • COBOL
    • +
    • CoffeeScript
    • +
    • Common Lisp
    • +
    • Crystal
    • +
    • CSS
    • +
    • Cypher
    • +
    • Cython
    • +
    • D
    • +
    • Dart
    • +
    • Django (templating language)
    • +
    • Dockerfile
    • +
    • diff
    • +
    • DTD
    • +
    • Dylan
    • +
    • EBNF
    • +
    • ECL
    • +
    • Eiffel
    • +
    • Elixir
    • +
    • Elm
    • +
    • Erlang
    • +
    • Factor
    • +
    • FCL
    • +
    • Forth
    • +
    • Fortran
    • +
    • F#
    • +
    • Gas (AT&T-style assembly)
    • +
    • Gherkin
    • +
    • Go
    • +
    • Groovy
    • +
    • HAML
    • +
    • Handlebars
    • +
    • Haskell
    • +
    • Haxe
    • +
    • HTML embedded (JSP, ASP.NET)
    • +
    • HTML mixed-mode
    • +
    • HTTP
    • +
    • IDL
    • +
    • Java
    • +
    • JavaScript (JSX)
    • +
    • Jinja2
    • +
    • Julia
    • +
    • Kotlin
    • +
    • LESS
    • +
    • LiveScript
    • +
    • Lua
    • +
    • Markdown (GitHub-flavour)
    • +
    • Mathematica
    • +
    • mbox
    • +
    • mIRC
    • +
    • Modelica
    • +
    • MscGen
    • +
    • MUMPS
    • +
    • Nginx
    • +
    • NSIS
    • +
    • N-Triples/N-Quads
    • +
    • Objective C
    • +
    • OCaml
    • +
    • Octave (MATLAB)
    • +
    • Oz
    • +
    • Pascal
    • +
    • PEG.js
    • +
    • Perl
    • +
    • PGP (ASCII armor)
    • +
    • PHP
    • +
    • Pig Latin
    • +
    • PowerShell
    • +
    • Properties files
    • +
    • ProtoBuf
    • +
    • Pug
    • +
    • Puppet
    • +
    • Python
    • +
    • Q
    • +
    • R
    • +
    • RPM
    • +
    • reStructuredText
    • +
    • Ruby
    • +
    • Rust
    • +
    • SAS
    • +
    • Sass
    • +
    • Spreadsheet
    • +
    • Scala
    • +
    • Scheme
    • +
    • SCSS
    • +
    • Shell
    • +
    • Sieve
    • +
    • Slim
    • +
    • Smalltalk
    • +
    • Smarty
    • +
    • Solr
    • +
    • Soy
    • +
    • Stylus
    • +
    • SQL (several dialects)
    • +
    • SPARQL
    • +
    • Squirrel
    • +
    • Swift
    • +
    • sTeX, LaTeX
    • +
    • Tcl
    • +
    • Textile
    • +
    • Tiddlywiki
    • +
    • Tiki wiki
    • +
    • TOML
    • +
    • Tornado (templating language)
    • +
    • troff (for manpages)
    • +
    • TTCN
    • +
    • TTCN Configuration
    • +
    • Turtle
    • +
    • Twig
    • +
    • VB.NET
    • +
    • VBScript
    • +
    • Velocity
    • +
    • Verilog/SystemVerilog
    • +
    • VHDL
    • +
    • Vue.js app
    • +
    • Web IDL
    • +
    • WebAssembly Text Format
    • +
    • XML/HTML
    • +
    • XQuery
    • +
    • Yacas
    • +
    • YAML
    • +
    • YAML frontmatter
    • +
    • Z80
    • +
    +
    +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Code editor + +
    + +## Layout + +
    + +ToolJet - Widget Reference - Code editor + +
    + +| Layout | description | +| ----------- | ----------- | +| Show on desktop | Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | + +## Styles + +
    + +ToolJet - Widget Reference - Code editor + +
    + +| Styles | description | +| ----------- | ----------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the editor. The field expects only numerical value from `1` to `100`, default is `0`. | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/color-picker.md b/docs/versioned_docs/version-2.4.0/widgets/color-picker.md new file mode 100644 index 0000000000..36a8fc6658 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/color-picker.md @@ -0,0 +1,84 @@ +--- +id: color-picker +title: Color Picker +--- + +# Color Picker + +Color Picker widget is used to select the desired color from the color picker + +
    + +ToolJet - Widget Reference - Color Picker + +
    + +## Properties + +### Default Color + +The data needs to be an valid hex color + +- One can change default color either from color picker or using fx (need to provide only respective hex value) + +**Example:** + +```json +Valid color : #000000 or #000 +Invalid Color : #0000, "black" , rgb(0,0,0) , +``` + +
    + +ToolJet - Widget Reference - Color Picker + +
    + +## Events + +To add an event to a color-picker component, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **+ Add handler**. + +
    + +ToolJet - Widget Reference - Color Picker + +
    + +### On change + +On change event is triggered when the color is changed on the color-picker. + +## Layout + +| Layout | description | Expected value | +| --------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +### Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| setColor | Set the color. | `color` eg - `#ffffff` | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Example: Selecting/changing color from the color picker and getting respective hex, rgb and rgba value of selected color +- Let's start by creating a new app and then dragging the Color Picker widget onto the canvas. +- Click on the Color Picker widget, a picker pop-up will appear, one can select desired color from the picker. +- In order to close the appeared picker pop-up, one need's to move away mouse from the picker pop-up and picker pop-up will fade away. +- In the Inspector, inside component, look for colorpicker, where one can get respective hex, rgb and rgba color + +
    + +ToolJet - Widget Reference - Color Picker + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/container.md b/docs/versioned_docs/version-2.4.0/widgets/container.md new file mode 100644 index 0000000000..fc58141f51 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/container.md @@ -0,0 +1,60 @@ +--- +id: container +title: Container +--- +# Container + +Containers are used to group widgets together. You can move the desired number of widgets inside a container to organize your app better. + +
    + +ToolJet - Widget Reference - Container + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers themouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Container + +
    + +## Layout + +
    + +ToolJet - Widget Reference - Container + +
    + +| Layout | description | +| ----------- | ----------- | +| Show on desktop | This property have toggle switch. If enabled, the Container widget will display in the desktop view else it will not appear. This is enabled by default.| +| Show on mobile | This property have toggle switch. If enabled, the Container wisget will display in the mobile view else it will not appear.| + +## Styles + +
    + +ToolJet - Widget Reference - Container + +
    + +| Style | Description | +| ----------- | ----------- | +| Background Color | You can change the background color of the Container by entering the `Hex color code` or choosing a color of your choice from the color picker. | +| Border radius | Use this property to modify the border radius of the container. The field expects only numerical value from `1` to `100`, default is `0`. | +| Border Color | You can change the border color of the Container by entering the `Hex color code` or choosing a color of your choice from the color picker. | +| Visibility | This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | + + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/custom-component.md b/docs/versioned_docs/version-2.4.0/widgets/custom-component.md new file mode 100644 index 0000000000..385252605d --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/custom-component.md @@ -0,0 +1,105 @@ +--- +id: custom-component +title: Custom Component +--- + +# Custom Component + +Custom Component can be used to do create your own React component when the needed functionality isn't available in other components. + +
    + +ToolJet - Widget Reference - Custom Component + +
    + +## Properties + +### Data + +The data needs to be an objects which needs to be passed as `data` props to the custom component + +**Example:** + +```json +{{{ + title: "Hi! There", + buttonText: "Updated Text", + queryName: "runjs1" +}}} +``` + +### Code + +This field is used to add a React code for your custom component. The packages for the custom component can be imported from [Skypack](https://www.skypack.dev/). For example, to import `React` package into the custom component it can be imported as `import React from 'https://cdn.skypack.dev/react'`. + +Tooljet provides 3 props to interact with the app: `data`, `updateData` and `runQuery`. + +- `data` is a shared object between custom component and Tooljet app. +- `updateData` is a function which accepts a single object used to update the data passed to the custom component. +- `runQuery` is a function which accepts a query name as a string used to run the query from the custom component. + +**Example:** + +```js +import React from "https://cdn.skypack.dev/react"; +import ReactDOM from "https://cdn.skypack.dev/react-dom"; +import { Button, Container, Link } from "https://cdn.skypack.dev/@material-ui/core"; + +const MyCustomComponent = ({data, updateData, runQuery}) => ( + +

    {data.title}

    + + +
    +); + +const ConnectedComponent = Tooljet.connectComponent(MyCustomComponent); + +ReactDOM.render(, document.body); +``` + +:::info +`Tooljet.connectComponent` acts as a HOC and it is required to get access to the data passed into the custom component and run the query +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Custom Component + +
    + +## Layout + +| Layout | description | Expected value | +| --------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/date-range-picker.md b/docs/versioned_docs/version-2.4.0/widgets/date-range-picker.md new file mode 100644 index 0000000000..642c97b427 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/date-range-picker.md @@ -0,0 +1,81 @@ +--- +id: date-range-picker +title: Date-range picker +--- +# Date-range picker + +The date-range picker widget allows users to select a range of dates. + +## How To Use Date Range Picker Widget + + + +## Properties + +### Default start date + +Set the start date to be selected by default in the widget + +### Default end date + +Set the start date to be selected by default in the widget + +### Format + +The format of the date selected by the date picker. Default date format is **DD/MM/YYYY**. Date format should be followed as ISO 8601 as mentioned in the [moment documentation](https://momentjs.com/docs/). + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Date range picker + +
    + +## Events + +Date range picker supports the following events: + +### On select + +The On select event is triggered when the a start date and end date is selected on the picker. Just like any other event on ToolJet, you can set multiple handlers for on select event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +ToolJet - Widget Reference - Date range picker + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Border Radius + +Use this property to modify the border radius of the date range picker. The field expects only numerical value from `1` to `100`, default is `0`. +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/datepicker.md b/docs/versioned_docs/version-2.4.0/widgets/datepicker.md new file mode 100644 index 0000000000..19001e9fb6 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/datepicker.md @@ -0,0 +1,108 @@ +--- +id: datepicker +title: Datepicker +--- +# Datepicker + +The Datepicker widget allows users to select a single value for date and time from a pre-determined set. + +
    + +ToolJet - Widget Reference - Date picker + +
    + +## How To Use Datepicker Widget + + + +## Events + +To add an event to a date-picker component, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **+ Add handler**. + +### On select + +On select event is triggered when an date is selected. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +### Default value + +This value acts as placeholder for the date picker widget, if any value is not provided then the default value will be used from the picker. The default value needs to be a `String` with respect to the `format` field. Ex: If format is set to `MM/YYYY` then provide default value as `04/2022`. + +### Format + +The format of the date selected by the date picker. Default date format is **DD/MM/YYYY**. Date format should be followed as ISO 8601 as mentioned in the [moment documentation](https://momentjs.com/docs/). This field requires a `String` input. Ex: `DD/MM`, `MM/YYYY`, `YY/MM`, `DD/MM/YYYY` etc. + +### Enable time selection? + +Toggle on or off to enable the time selection. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +### Enable date selection? + +Toggle on or off to enable the date selection. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +### Disabled dates + +We can give disabled dates property which will make specific dates disabled and cannot be selected. The default value needs to be an array of`Strings`. + +Example for disabling the 9th of January: +```js +{{['09-01']}} +``` + +Now user won't be able to select the mentioned date since it will be disabled. + +## Validation + +### Custom Validation + +Add a validation for the date input in the widget using the ternary operator. + +Example of validation for selecting dates that are after the current date: +```js +{{moment(components.datepicker1.value, 'DD/MM/YYYY').isAfter(moment()) ? true : 'Date should be after today'}} +``` +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Date picker + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +### Border Radius + +Use this property to modify the border radius of the date-picker. The field expects only numerical value from `1` to `100`, default is `0`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/divider.md b/docs/versioned_docs/version-2.4.0/widgets/divider.md new file mode 100644 index 0000000000..b027ae96d2 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/divider.md @@ -0,0 +1,56 @@ +--- +id: divider +title: Divider +--- +# Divider + +Divider widget is used to add separator between components. + +
    + +ToolJet - Widget Reference - Divider + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Divider + +
    + +## Layout + +
    + +ToolJet - Widget Reference - Divider + +
    + +| properties | description | +| ----------- | ----------- | +| Show on Desktop | This property have toggle switch. If enabled, the divider will display in the desktop view else it will not appear. | +| Show on Mobile | This property have toggle switch. If enabled, the divider will display in the mobile view else it will not appear. | + +## Styles + +
    + +ToolJet - Widget Reference - Divider + +
    + +| properties | description | +| ----------- | ----------- | +| Divider Color | It is used to set the color of the divider. Use hex code to set the background color. | +| Visibility | This property is used to set the visibility of the divider. The property accepts Boolean value. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/dropdown.md b/docs/versioned_docs/version-2.4.0/widgets/dropdown.md new file mode 100644 index 0000000000..e4cdca4a72 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/dropdown.md @@ -0,0 +1,140 @@ +--- +id: dropdown +title: Dropdown +--- +# Dropdown + +The Dropdown widget can be used to collect user input from a list of options. + +## How To Use Dropdown Widget + + + +:::tip +Dropdown options can be referred to your query data with dynamic variables. +::: + +
    + +ToolJet - Widget Reference - Dropdown + +
    + +## Events + +
    + +ToolJet - Widget Reference - Dropdown + +
    + +### Event: On select + +On select event is triggered when an option is selected. + +### Event: On search text changed + +This event is triggered whenever the user searches through the options by typing on the dropdown's input box. The corresponding search text will be exposed as `searchText`. + +## Properties + +
    + +ToolJet - Widget Reference - Dropdown + +
    + +### Label + +The text is to be used as the label of the dropdown. + +### Default value + +Value of the default option + +### Option value + +Option values are values for different options in the list of the dropdown. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.value)}}` or populate it with sample values `{{[1,2,3]}}` + +### Option labels + +Option labels are labels for different options in the list of the dropdown. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.label)}}` or populate it with sample values `{{["one", "two", "three"]}}` + +### Options loading state + +Show a loading state in the widget using this property. It is off by default, toggle on to enable it. You can also programmatically set the values `{{true}}` or `{{false}}` by clicking on the `Fx` button. + +## Validation + +### Custom validation + +Add a validation for the options in dropdown widget using the ternary operator. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Dropdown + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
    + +ToolJet - Widget Reference - Dropdown + +
    + +### Border Radius + +Use this property to modify the border radius of the dropdown. The field expects only numerical value from `1` to `100`, default is `0`. + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Selected text color + +Change the text color of the selected option in the widget by providing the `HEX color code` or choosing the color from color picker. + +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +### Align text + +You can align the text inside the widget in following ways: left, right, center, justified + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Exposed variables + +
    + +ToolJet - Widget Reference - Dropdown widget + +
    + +| Variable | Description | +| -------- | ----------- | +| Value | This variable holds the value of the currently selected item on the dropdown. Value can be accesed using `{{components.dropdown1.value}}` | +| searchText | This variable is initially empty and will hold the value whenever the user searches on the dropdown. searchText's value can be accesed using`{{components.dropdown1.searchText}}` | +| label | The variable label holds the label name of the dropdown. label's value can be accesed using`{{components.dropdown1.searchText}}` | +| optionLabels | The optionLabels holds the option labels for the values of the dropdown. optionLabels can be accesed using`{{components.dropdown1.optionLabels}}` for all the option labels in the array form or `{{components.dropdown1.optionLabels[0]}}` for particular option label | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/file-picker.md b/docs/versioned_docs/version-2.4.0/widgets/file-picker.md new file mode 100644 index 0000000000..6d7efd4219 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/file-picker.md @@ -0,0 +1,172 @@ +--- +id: file-picker +title: Filepicker +--- +# Filepicker + +Filepicker widget allows the user to drag and drop files or upload files by browsing the filesystem and selecting one or more files in a directory. + +
    + +ToolJet - Widget Reference - File Picker + +
    + +:::info + File types must be a valid [MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) type according to input element specification or a valid file extension. + + To accept any/all file type(s), set `Accept file types` to an empty value. +::: + +
    + +ToolJet - Widget Reference - File Picker + +
    + +:::tip +[MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) type determination is not reliable across platforms. CSV files, for example, are reported as text/plain under macOS but as application/vnd.ms-excel under Windows. +::: + +## Events + +
    + +ToolJet - Widget Reference - File Picker + +
    + +### On file selected + +On file selected event is triggered when one or more files are selected by the selector dialogue box. + +### On file loaded + +On file loaded event is triggered when a file is loaded in the browser. + +### On file deselected + +On file selected event can be triggered when one or more files are removed from the picker. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +### Instruction Text + +Instruction text can be set to give information on the file picker. + +### Use Drop zone + +Creates a drag & drop zone. Files can be dragged and dropped to the "drag & drop" zone. + +### Use File Picker + +On clicking it invokes the default OS file prompt. + +### Pick multiple files + +Allows drag and drop (or selection from the file dialog) of multiple files. `Pick multiple files` is disabled by default. + +### Max file count + +The maximum accepted number of files The default value is `2`. + +### Accept file types + +By providing types, you can make the dropzone accept specific file types and reject the others. + +### Max size limit + +Maximum file size (in bytes). + +### Min size limit + +Minimum file size (in bytes). + +:::tip +Files can be accepted or rejected based on the file types, maximum file count, maximum file size (in bytes) and minimum file size (in bytes). +If `Pick multiple files` is set to false and additional files are dropped, all files besides the first will be rejected. +Any file that does not have a size in the range of `Max size limit` and `Min size limit` will be rejected. +::: + +## Options + +
    + +ToolJet - Widget Reference - File Picker + +
    + +### Parse content + +Parse the selected files, supports **CSV**, **xls**, and **xlsx** files. + +### File type + +If **Parse content** is enabled, options to auto-detect files and parse content or parse selected file types. + +:::info +- If **Parse content** option is toggled off, **File Type** option will not be available. +- If the **Parse content** option is toggled on, it only parses the next file that is selected, not the already selected one. +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - File Picker + +
    + +## Layout + +
    + +ToolJet - Widget Reference - File Picker + +
    + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
    + +ToolJet - Widget Reference - File Picker + +
    + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +### Border Radius + +Use this property to modify the border radius of the filepicker widget. The field expects only numerical value from `1` to `100`, default is `0`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------ | +| `clearFiles()` | It will clear the selected files | None | diff --git a/docs/versioned_docs/version-2.4.0/widgets/form.md b/docs/versioned_docs/version-2.4.0/widgets/form.md new file mode 100644 index 0000000000..8d368d65fd --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/form.md @@ -0,0 +1,76 @@ +--- +id: form +title: Form +--- + +# Form + +Form component can be used to get input from the user and store it in the connected datasource. Form component serves as a parent widget that can store different widgets like texts, input box, dropdown to allow selection, and a button for triggering the event. + +
    + +Form + +
    + +## Properties + +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| Button To Submit Form | The dropdown can be used to select the button that will be used as the submit button for the form | Any button that will be added as a child component inside the form component can be selected from the dropdown | +| Loading state | Loading state can be used to show a spinner as the form content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. | Switch the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}` | + +
    + +Form + +
    + +### Events + +To add an event to a button group, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +#### On submit + +**On submit** event is triggered when the button on the form component is clicked. Just like any other event on ToolJet, you can set multiple handlers for on submit event. + +#### On invalid + +**On invalid** event is triggered when the input on the form is invalid. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +### Layout + +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +
    + +Form + +
    + +| Style | Description | +| ----------- | ----------- | +| Background color | You can change the background color of the form by entering the Hex color code or choosing a color of your choice from the color picker. | +| Border radius | Use this property to modify the border radius of the form component. | +| Border color | You can change the color of the border of the form by entering the Hex color code or choosing a color of your choice from the color picker. | +| Visibility | Toggle on or off to control the visibility of the form. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | Toggle on to lock the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Box shadow | This property adds a shadow to the widget. | You can use different values for box shadow property like offsets, blur, spread, and the color code. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/html.md b/docs/versioned_docs/version-2.4.0/widgets/html.md new file mode 100644 index 0000000000..cdb523f9d7 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/html.md @@ -0,0 +1,72 @@ +--- +id: html +title: HTML +--- + +# HTML + +HTML widget can be used to create your own HTML-CSS layout. + +
    + +HTML component + +
    + +## Properties + +### Raw HTML + +The Raw HTML needs to be an HTML. In order to provide styles, one can add inline css to the respective HTML tags + +**Example:** + +```json + + + +
    +
    + You can build your custom HTML-CSS template here +
    +
    + + + +``` + +
    + +HTML component + +
    + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +HTML component + +
    + +## Layout + +| Layout | description | Expected value | +| --------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/icon.md b/docs/versioned_docs/version-2.4.0/widgets/icon.md new file mode 100644 index 0000000000..9cd9fe3bd9 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/icon.md @@ -0,0 +1,64 @@ +--- +id: icon +title: Icon +--- + +An Icon widget can be used to add icons(sourced from icon library). It supports events like on hover and on click. + +
    + +ToolJet - Widget - Icon + +
    + +## Properties + +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| Icon | Use this to choose an icon form the list of available icons | You can also use the search bar in it to look for the icons | + +## Events + +
    + +ToolJet - Widget - Icon + +
    + +To add an event, click on the icon widget's configuration handle to open the widget properties on the components drawer on the right. Go to the **Events** section and click on **+ Add handler**. + +The Icon widget supports the following events: + +| Event | Description | +| ----------- | ----------- | +| On hover | This event is triggered when the cursor is hovered over the icon| +| On click | This event is triggered when the icon is clicked | + +Just like any other event on ToolJet, you can set multiple handlers for any of the above-mentioned events. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General + +Tooltip: Set a tooltip text to specify the information when the user moves the mouse pointer over the widget. + +## Layout + +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to show/hide the widget on desktop screens. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to show/hide the widget on mobile screens. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | Expected value | +| ----------- | ----------- | ------------- | +| Icon color | You can change the color of the icon widget by entering the Hex color code or choosing a color of your choice from the color picker. | +| Visibility | This is to control the visibility of the widget. | If `{{false}}` the widget will not visible after the app is deployed. | It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. | +| Box shadow | This property adds a shadow to the widget. | You can use different values for box shadow property like offsets, blur, spread, and the color code. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/iframe.md b/docs/versioned_docs/version-2.4.0/widgets/iframe.md new file mode 100644 index 0000000000..3157b9f979 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/iframe.md @@ -0,0 +1,67 @@ +--- +id: iframe +title: Iframe +--- +# Iframe + +Iframe widget is used to embed another HTML page into the current one and display iframes in your app. + +
    + +ToolJet - Widget Reference - Iframe + +
    + +## Properties + +### URL + +Set the **URL** of the page to embed. + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Iframe + +
    + +## Layout + +
    + +ToolJet - Widget Reference - Iframe + +
    + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
    + +ToolJet - Widget Reference - Iframe + +
    + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/image.md b/docs/versioned_docs/version-2.4.0/widgets/image.md new file mode 100644 index 0000000000..f84ee6f9c3 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/image.md @@ -0,0 +1,107 @@ +--- +id: image +title: Image +--- +# Image + +Image widget is used to display images in your app. + +
    + +ToolJet - Widget Reference - Image + +
    + +## Events + +
    + +ToolJet - Widget Reference - Image + +
    + +### On click + +On click event is triggered when an image is clicked. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +
    + +ToolJet - Widget Reference - Image + +
    + +### URL +Enter the URL of the image to display it on the widget. + +### Loading state +Loading state can be used to show a spinner as the image content. Loading state is commonly used with `isLoading` property of the queries to show a loading status while a query is being run. Switch the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}`. + +### Alternative text +Used for alt text of images. + +### Zoom buttons +Toggle this to enable zoom options inside image. + +### Rotate buttons +Toggle this on to enable rotate button in the image. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Image + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}`. + +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Border type +Choose a border type for the image from available options: +- **None** +- **Rounded** +- **Circle** +- **Thumbnail** + +### Image fit +Choose a image fit - similar to object fit for the image from available options: +- **fill** +- **cover** +- **contain** +- **scale-down** + +### Background color +Add a background color to widget by providing the `HEX color code` or choosing the color of your choice from the color-picker. + +### Padding +Adds padding between the image and widget border. It accepts any numerical value from `0` to `100`. + +### Visibility +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/kanban-board.md b/docs/versioned_docs/version-2.4.0/widgets/kanban-board.md new file mode 100644 index 0000000000..0dbb693192 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/kanban-board.md @@ -0,0 +1,137 @@ +--- +id: kanban +title: Kanban +--- + +# Kanban + +Kanban widget allows you to visually organize and prioritize your tasks with a transparent workflow. You can set the number of columns to display, enable/disable the add cards button, and bind data to the cards. + +
    + +ToolJet - Widget Reference - Kanban widget + +
    + +## Events + +To add an event, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +- **[On update](#on-update)** +- **[On add card click](#on-add-card-click)** +- **[Card removed](#card-removed)** +- **[Card added](#card-added)** +- **[Card moved](#card-moved)** +- **[Card selected](#card-selected)** + +
    + +ToolJet - Widget Reference - Kanban widget + +
    + +Just like any other event on ToolJet, you can set multiple handlers for any of the above mentioned events. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. + +Check the **[Component Specific Action](/docs/next/actions/control-component)** available for Kanban. +::: + +### On Update +On update event is triggered whenever the card data (id, title, description, or columnID) is updated using the component specific actions. + +### On add card click +This event is triggered whenever the **Add card** button on the kanban is clicked. + +### Card removed +This event is triggered whenever the card is **deleted** from the kanban by dragging it into the bottom delete box or using component specific action. + +### Card added +This event is triggered whenever a card is **added** on the kanban using the component specific action. + +### Card moved +This event is triggered whenever the card's position is changed on the kanban or using the component specific action. + +### Card selected +This event is triggered whenever a card is clicked to open the modal. + +## Properties + +
    + +ToolJet - Widget Reference - Kanban widget + +
    + +:::caution +- It is mandatory to provide `id` for each column in the `column data` field. The `id` can be of type `string` or `number`. +- It is mandatory to provide `id`, and `columnId` for each card in the `Card data` field. The `id` and `columnId` can be of type `string` or `number`. +::: + +| Properties | description | Expected value | +| ----------- | ----------- | ----------- | +| Column Data | Enter the columns data - `id` and `title` in the form of array of objects or from a query that returns an array of objects. | `{{[{ "id": "c1", "title": "to do" },{ "id": "c2", "title": "in progress" },{ "id": "c3", "title": "Completed" }]}}` or `{{queries.xyz.data}}` | +| Card Data | Enter the cards data - `id`, `title` and `columnId` in the form of array of objects or from a query that returns an array of objects. | `{{[{ id: "r1", title: "Title 1", description: "Description 1", columnId: "c1" },{ id: "r2", title: "Title 2", description: "Description 2", columnId: "c2" },{ id: "r3", title: "Title 3", description: "Description 3",columnId: "c3" }]}}` or `{{queries.abc.data}}` | +| Card Width | Set the width of the card | This property expects a numerical value. By default, the value is set to `{{302}}` | +| Card Height | Set the width of the card | This property expects a numerical value. By default, the value is set to `{{100}}` | +| Enable Add Card | This property allows you to show or hide the **+Add Cards** button on the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the `Fx` next to it | +| Show Delete button | This property allows you to show or hide the **Drop here to delete cards** section at the bottom of the kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the `Fx` next to it | + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Kanban widget + +
    + +## Layout + +
    + +ToolJet - Widget Reference - Kanban widget + +
    + +| Layout | description | Expected value | +| --------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display the widget in desktop view. | You can programmatically set the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display the widget in mobile view. | You can programmatically set the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +
    + +ToolJet - Widget Reference - Kanban widget + +
    + +| Style | Description | +| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Disable | If disabled or set to `{{false}}` the widget will be locked and becomes non-functional. By default, its disabled i.e. its value is set to `{{true}}` . | +| Visibility | This is to control the visibility of the widget. If `{{false}}`/disabled the widget will not visible after the app is deployed. By default, it's enabled (set to `{{true}}`). | +| Accent color | You can change the accent color of the column title by entering the Hex color code or choosing a color of your choice from the color picker. | + +## Exposed variables + +
    + +ToolJet - Widget Reference - Kanban widget + +
    + +| Variable | Description | +| -------- | ----------- | +| updatedCardData | The `updatedCardData` variable will hold the latest values of all the cards in the kanban. This variable won't have any values initially, it will have values only when any action on any of the card is performed like when the card is moved, added, deleted, or updated. | +| lastAddedCard | The variable `lastAddedCard` holds the values of the the last added card. It holds the following data - `id`, `title`, `description` and `columnId` of the last added card. You can get the values using `{{components.kanban1.lastAddedCard.title}}` | +| lastRemovedCard | The variable `lastRemovedCard` holds the properties of the card that has been recently deleted from the kanban. It holds the following data - `id`, `title`, `description` and `columnId` of the recently deleted card. You can get the values using `{{components.kanbanboard1.lastRemovedCard.title}}` | +| lastCardMovement | The variable `lastCardMovement` holds the properties of the card that has been recently moved from its original position. It holds the following data - `originColumnId`, `destinationColumnId`, `originCardIndex`, `destinationCardIndex` and an object `cardDetails` which includes `id`, `title`, `description` and `columnId` of the moved card. You can get the values using `{{components.kanbanboard1.lastCardMovement.cardDetails.title}}` or `{{components.kanbanboard1.lastCardMovement.destinationCardIndex}}` | +| lastSelectedCard | The variable `lastSelectedCard` holds the `id`, `title`, `columnId`, and `description` of the last selected(clicked to view) card on the kanban. You can get the values using `{{components.kanban1.lastSelectedCard.columnId}}` | +| lastUpdatedCard | The variable `lastUpdatedCard` holds the `id`, `title`, `description`, and `columnId` of the last updated card(using componenet specific action). You can get the values using `{{components.kanban1.lastUpdatedCard.columnId}}` | +| lastCardUpdate | The variable `lastCardUpdate` holds the old an new values of the property that has been changed in the card(using componenet specific action). You can get the values using `{{components.kanban1.lastCardUpdate[0].title.oldValue}}` | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/link.md b/docs/versioned_docs/version-2.4.0/widgets/link.md new file mode 100644 index 0000000000..ca20002102 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/link.md @@ -0,0 +1,68 @@ +--- +id: link +title: Link +--- + +# Link + +Link widget allows you to add a hyperlink and navigate to the external URL. + +
    + +ToolJet - Widget - Link + +
    + +## Properties + +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| Link Target | This property sets the URL where the user needs to be taken on clicking the link | example: `https://dev.to/tooljet` or `{{queries.xyz.data.url}}` | +| Link Text | This property sets the text for the link widget | example: `Click here` or `Open webpage` | +| Target Type | This property specifies the link to be opened in the same tab or new tab on clickinh the link | Options: `New Tab` & `Same Tab` | + +## Events +To add an event to a link, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +### On Click +**On Click** event is triggered when the link is clicked. Just like any other event on ToolJet, you can set multiple handlers for on click event. + +### On hover +**On Hover** event is triggered when the link is hovered. Just like any other event on ToolJet, you can set multiple handlers for on click event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +## Layout + +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to show/hide the widget on desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to show/hide the widget on mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +
    + +ToolJet - Widget - Link + +
    + +| Style | Description | +| ----------- | ----------- | +| Text Color | You can change the background color of the text by entering the Hex color code or choosing a color of your choice from the color picker. | +| Text Size | By default, the text size is set to 14. You can enter any value from 1-100 to set custom text size. | +| Underline | You can change the underline of the text in the following ways: **on-hover (default), never, always** | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/listview.md b/docs/versioned_docs/version-2.4.0/widgets/listview.md new file mode 100644 index 0000000000..41a8d42385 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/listview.md @@ -0,0 +1,140 @@ +--- +id: listview +title: List view +--- +# List view + +List view widget allows to create a list of repeatable rows of data. Just like a container widget, you can nest other widgets inside of it and control how many times they repeat. + +
    + +ToolJet - List view widget + +
    + +## How To Use List view Widget + + + +## Events + +### Row clicked + +
    + +ToolJet - List view widget + +
    + +To add an event to a button, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +**Row clicked** event is triggered when the button is clicked. Just like any other event on ToolJet, you can set multiple actions for a row clicked event. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +
    + +ToolJet - List view widget + +
    + +| Properties | description | Expected value | +| ----------- | ----------- | -------------- | +| List data | Enter the data that you want to display into the widget. Data in the form of an array of objects or data from a query that returns an array of objects.| `{{ [ {id: 0, name: ABC, email: abc@bla.com}, {id: 1, name: XYZ, email: xyz@bla.com} ] }}` or `{{queries.xyz.data}}` | +| Row height | Enter a numerical value to set the row height accordingly. | Any number between `1` to `100` | +| Show bottom border | This property allows you to show or hide the row bottom border. | By default its `{{true}}`, set `{{false}}` to hide the border | +| Enable pagination | Enable it to set the number of rows per page. | Pagination is disabled by default. You can programmatically set to `{{true}}` to show a particular number of rows per page. | + + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - List view widget + +
    + +## Layout + +
    + +ToolJet - List view widget + +
    + +| Layout | description | Expected value | +| ----------- | ----------- | ------------ | +| Show on desktop | Toggle on or off to display the desktop view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display the mobile view. | You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +
    + +ToolJet - List view widget + +
    + +| Style | Description | +| ----------- | ----------- | +| Background Color | You can change the background color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. | +| Border Color | You can change the border color of the listview by entering the `Hex color code` or choosing a color of your choice from the color picker. | +| Visibility | This is to control the visibility of the widget. If `{{false}}` the widget will not be visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the list view. The field expects only numerical value from `1` to `100`, default is `0`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Example: Displaying data in the list view + +- Let's start by creating a new app and then dragging the List view widget onto the canvas. + +
    + +ToolJet - List view widget + +
    + +- Now lets create a query and select the REST API from the datasource dropdown. Choose the `GET` method and enter the API endpoint - `https://reqres.in/api/users?page=1`. Save this query and fire it. Inspect the query results from the left sidebar, you'll see that it resulted in the `data` object having an array of objects. + +
    + +ToolJet - List view widget + +
    + + +- Now lets edit the `List data` property of the list view widget for displaying the query data. We will use JS to get the data from the query - `{{queries.restapi1.data.data}}`. Here the last `data` is a data object that includes an array of objects, the first `data` is the data resulted from the `restapi1` query. This will automatically create the rows in the widget using the data. + +
    + +ToolJet - List view widget + +
    + + +- Finally, we will need to nest widgets into the first row of list view widget and the widget will automatically create the subsequent instances. The subsequent rows will appear the same way you'll display the data in the first row. + +
    + +ToolJet - List view widget + +
    + + +:::tip + +Use `{{listItem.key}}` to display data on the nested widgets. Example: For displaying the images we used `{{listItem.avatar}}` where **avatar** is one of the key in the objects from the query result. + +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/map.md b/docs/versioned_docs/version-2.4.0/widgets/map.md new file mode 100644 index 0000000000..2469048e68 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/map.md @@ -0,0 +1,87 @@ +--- +id: map +title: Map +--- +# Map + +The map widget can be used to pick or select locations on the Google map with the location's coordinates. + +
    + +ToolJet - Widget Reference - Map + +
    + +## Exposed variables + +Exposed variables can be used to get data from the widget. + +| variable | description | +| ----------- | ----------- | +| bounds | Viewport area of the map | +| center | It contains the locations' coordinates at the center of the bounding area | +| markers | A marker identifies a location on the map. `markers` contains the list of markers on the map | +| selectedMarker | Object with the marker selected by the user | + +## Events + +| events | description | +| ----------- | ----------- | +| On bounds change | Triggered when the bounding area is changed. This event is triggered after `bounds` variable is updated | +| On create marker | This event is triggered when a new marker is created on the map | +| On marker click | This event is triggered when any of the markers in the map is clicked | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +| properties | description | Expected value | +| ----------- | ----------- | ------------------ | +| Initial location | It is the default location's coordinates that the map should focus on. | An object containing the latitude and langitude as key value pairs. ex: `{{ {"lat": 40.7128, "lng": -73.935242} }}` | +| Default Markers | List of markers that should be shown on the map | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}] }}` | +| Add new markers | This property should be enabled to add new markers to the map on click. | `On` by default, toggle `off` to disable adding new markers on the map. Can be programmatically configured by clicking on `Fx`, accepts values `{{true}}` or `{{false}}` | +| Search for places | It can be used to show or hide auto-complete search box. | `On` by default, toggle `off` to disable search on the map. Can be programmatically configured by clicking on `Fx`, accepts values `{{true}}` or `{{false}}` | + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Map + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| `setLocation` | Set map's location. | Latitude and Longitude values as parameters. ex: `component.map1.setLocation(40.7128, -73.935242)` | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/modal.md b/docs/versioned_docs/version-2.4.0/widgets/modal.md new file mode 100644 index 0000000000..eb196123ac --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/modal.md @@ -0,0 +1,101 @@ +--- +id: modal +title: Modal +--- +# Modal + +Modal widget renders in front of a backdrop, and it blocks interaction with the rest of the application until the modal is closed. It can be used to add dialog boxes to your app for lightboxes, user notifications, forms, etc. + +
    + +ToolJet - Widget Reference - Modal + +
    + +## How To Use Modal Widget + + + +## Add widgets to Modal + +To add widgets to the Modals please refer to **[Tutorial - Adding widgets to a modal](/docs/tutorial/adding-widget#adding-widgets-to-modal)** + +## Properties + +### Title + +Title that should be shown on the header of the modal. + +### Loading State + +Loading state can be used to show a spinner on the modal content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. Enable the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}` . + +### Hide title bar + +Enabling this option hides the title bar in the modal. The value `{{true}}` or `{{false}}` can be set programmatically by clicking on the `Fx` button next to it. + +### Hide close button + +Enabling this option hides the close button in the modal. The value `{{true}}` or `{{false}}` can be set programmatically by clicking on the `Fx` button next to it. + +### Hide on escape + +Enabling this option closes the modal(opened) whenever the escape key is pressed. The value `{{true}}` or `{{false}}` can be set programmatically by clicking on the `Fx` button next to it. This property is enabled by default. + +:::info +Now hide the modal by simply clicking anywhere outside the modal (for preview or released apps). +::: + +### Modal size + +Size of the modal. Options are `medium`, `small` and `large`. The default is `small`. You can also programmatically configure the value by clicking on the `Fx` and set the value to `sm`, `md` or `lg`. + +## Options + +### Use default trigger button + +The default trigger button is enabled by default, this button can be used to show the modal. The value `{{true}}` or `{{false}}` can be set programmatically by clicking on the `Fx` button next to it. + +:::info +A modal can be triggered using the default trigger button, [action](/docs/actions/show-modal) or via [JavaScript](/docs/how-to/run-actions-from-runjs#show-modal). +::: + +### Trigger button label + +It can be used to set the label of the trigger button. + +## Events + +Modal supports the following two events: +- **On open** +- **On close** + +:::info +Just like any other event on ToolJet, you can set multiple handlers for the events supported by Modal. Check all the [actions here](/docs/category/actions-reference). +::: + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + + +| Style | Description | value | +| ----------- | ----------- | ------ | +| Header background color | Change the background color of the header in modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Header title color | Change the color of the Title in modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Body background color | Change the background color of the body in modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Visibility | Toggle on or off to control the visibility of the default trigger button that comes with modal | You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the button will not visible after the app is released. By default, it's set to `{{true}}`. | +| Disable | Toggle on to disable the default trigger button that comes with modal | You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the button will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Trigger button background color | Change the background color of the default trigger button of modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Trigger button text color | Change the color of the label in default trigger button of modal | Enter the Hex color code or choose a color of your choice from the color picker | + +:::info +Trigger Button styles are only visible when **Use default trigger button** under Options is toggled on. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/multiselect.md b/docs/versioned_docs/version-2.4.0/widgets/multiselect.md new file mode 100644 index 0000000000..cdc83f7ab9 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/multiselect.md @@ -0,0 +1,89 @@ +--- +id: multiselect +title: Multiselect +--- +# Multiselect + +Multiselect widget can be used to collect multiple user inputs from a list of options. + +
    + +ToolJet - Widget Reference - Multiselect + +
    + +## Events + +### On select + +On select event is triggered when an option is selected. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +### Label + +The text is to be used as the label for the multiselect widget. + +### Default value + +The value of the default option. This should always be an array. +### Option values + +Values for different items/options in the list of the multiselect. + +### Option labels + +Labels for different items/options in the list of the multiselect. + +### General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Multiselect + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Border radius + +Add a border radius to the multiselect using this property. It accepts any numerical value from `0` to `100`. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| `selectOption` | Select options. | pass options as parameter. ex: `components.multiselect1.selectOption(1)` | +| `deselectOption` | Deselect options.| pass options as parameter. ex: `components.multiselect1.deselectOption(1)` | +| `clearSelections` | Clear all selection. | ex: `components.multiselect1.clearSelections()` | + + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/number-input.md b/docs/versioned_docs/version-2.4.0/widgets/number-input.md new file mode 100644 index 0000000000..f72242234c --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/number-input.md @@ -0,0 +1,97 @@ +--- +id: number-input +title: Number Input +--- +# Number Input + +Number Input widget lets users enter and change numbers. + +## How To Use Number Input Widget + + + +:::tip +Numbers can be changed by using the arrow keys. +::: + +## Properties + +### Default value + +A predefined value that can be fetched from the number input widget if no changes are made in widget. + +### Minimum value + +It specifies the minimum value the number input can go to. This field accepts any numerical value. + +### Maximum value + +It specifies the maximum value the number input can go to. This field accepts any numerical value. + +### Placeholder +It specifies a hint that describes the expected value. This field accepts any numerical value. + +## Events + +
    + +Events-Number Input + +
    + +### On change +This event fires whenever the value of the number input widget is changed. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +Events-Number Input + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +### Border radius + +Add a border radius to the number input widget using this property. It accepts any numerical value from `0` to `100`. + +### Border color + +Change the border color number-input component by entering the Hex color code or choosing a color of your choice from the color picker. + +### Background color + +Change the background color of the number-input component by entering the Hex color code or choosing a color of your choice from the color picker. + +### Text color + +Change the color of the number in number-input component by entering the Hex color code or choosing a color of your choice from the color picker. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/overview.md b/docs/versioned_docs/version-2.4.0/widgets/overview.md new file mode 100644 index 0000000000..3d87e1b6b8 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/overview.md @@ -0,0 +1,85 @@ +--- +id: overview +title: Overview +--- + +# Components : Overview + +Components are used to build the UI of the applications. They can be dragged onto the canvas from the Component Library and can be modified from the Properties Panel without needing to write any code. **[Event Handlers](/docs/actions/event-handler)** in Components allow end users to trigger queries and other application events to perform the **[Actions](/docs/category/actions-reference)**. + +## Adding components + +Components can be dragged and dropped from the Component Library(from the right side on app builder) on to the canvas. Components can be moved by simply click and hold, and can be resized from edges or borders. + +
    + +Components: Overview + +
    + +### Select multiple components + +For moving the **multiple components** at once, simply **shift+click**, to select multiple components. Once grouped, the components can be moved on the canvas while maintaining their relative positions. + +
    + +Components: Overview + +
    + +You can also create a selection triangle and move multiple components together by `click and drag` + +
    + +Components: Overview + +
    + +:::tip +You can also use many other **[Keyboard Shortcuts](/docs/tutorial/keyboard-shortcuts)** in ToolJet to copy, cut, paste components to the canvas. +::: + +## Component properties + +Each Component can be modified and styled from the Properties Panel such as the **data** field, a toggle for **disabling** the component, or stylings like a **background color**. Properties can be modified directly or programmatically by using **[Bindings](#bindings)**, which enables you to write JavaScript code. + +
    + +Components: Overview + +
    + +## Component Event Handlers + +Event Handlers can be found in the Component's **Property Panel** or in the **Advanced** section of the Query. Event handlers can be used to trigger the queries, perform **[Component Specific Actions - CSA](/docs/actions/control-component)** or for setting a variable. + +:::info Actions +Check all the available Actions **[here](/docs/category/actions-reference)**. +::: + +
    + +Components: Overview + +
    + +## Bindings + +Bindings allow you to get dynamic data into the components. Anything inside of **`{{}}`** is evaluated as a JavaScript expression in ToolJet. + +Any arbitrary JavaScript code can be written inside **`{{}}`**: +```js +{{(function () { + + })() +}} +``` +or +```js +{{components.xyz.data.key === Sun ?? true : false}} +``` + +:::tip +Check out the How-to guides like **[changing color of text in table column](/docs/how-to/access-cellvalue-rowdata)**, **[Enable/Disable a component using JavaScript](/docs/how-to/access-currentuser)**, and **[more](/docs/category/how-to)**. +::: + diff --git a/docs/versioned_docs/version-2.4.0/widgets/package-lock.json b/docs/versioned_docs/version-2.4.0/widgets/package-lock.json new file mode 100644 index 0000000000..624508d7dc --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/package-lock.json @@ -0,0 +1,32216 @@ +{ + "name": "docs", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-google-gtag": "^2.0.0-alpha.73", + "@docusaurus/preset-classic": "2.0.0-alpha.73", + "@mdx-js/react": "^1.6.21", + "clsx": "^1.1.1", + "react": "^17.0.1", + "react-dom": "^17.0.1" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.2.2.tgz", + "integrity": "sha512-JOQaURze45qVa8OOFDh+ozj2a/ObSRsVyz6Zd0aiBeej+RSTqrr1hDVpGNbbXYLW26G5ujuc9QIdH+rBHn95nw==", + "dependencies": { + "@algolia/autocomplete-shared": "1.2.2" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.2.2.tgz", + "integrity": "sha512-AZkh+bAMaJDzMZTelFOXJTJqkp5VPGH8W3n0B+Ggce7DdozlMRsDLguKTCQAkZ0dJ1EbBPyFL5ztL/JImB137Q==", + "dependencies": { + "@algolia/autocomplete-shared": "1.2.2" + }, + "peerDependencies": { + "@algolia/client-search": "^4.9.1", + "algoliasearch": "^4.9.1" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.2.2.tgz", + "integrity": "sha512-mLTl7d2C1xVVazHt/bqh9EE/u2lbp5YOxLDdcjILXmUqOs5HH1D4SuySblXaQG1uf28FhTqMGp35qE5wJQnqAw==" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.5.tgz", + "integrity": "sha512-cfX2rEKOtuuljcGI5DMDHClwZHdDqd2nT2Ohsc8aHtBiz6bUxKVyIqxr2gaC6tU8AgPtrTVBzcxCA+UavXpKww==", + "dependencies": { + "@algolia/cache-common": "4.10.5" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.5.tgz", + "integrity": "sha512-1mClwdmTHll+OnHkG+yeRoFM17kSxDs4qXkjf6rNZhoZGXDvfYLy3YcZ1FX4Kyz0DJv8aroq5RYGBDsWkHj6Tw==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.10.5.tgz", + "integrity": "sha512-+ciQnfIGi5wjMk02XhEY8fmy2pzy+oY1nIIfu8LBOglaSipCRAtjk6WhHc7/KIbXPiYzIwuDbM2K1+YOwSGjwA==", + "dependencies": { + "@algolia/cache-common": "4.10.5" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.10.5.tgz", + "integrity": "sha512-I9UkSS2glXm7RBZYZIALjBMmXSQbw/fI/djPcBHxiwXIheNIlqIFl2SNPkvihpPF979BSkzjqdJNRPhE1vku3Q==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.10.5.tgz", + "integrity": "sha512-h2owwJSkovPxzc+xIsjY1pMl0gj+jdVwP9rcnGjlaTY2fqHbSLrR9yvGyyr6305LvTppxsQnfAbRdE/5Z3eFxw==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.5.tgz", + "integrity": "sha512-21FAvIai5qm8DVmZHm2Gp4LssQ/a0nWwMchAx+1hIRj1TX7OcdW6oZDPyZ8asQdvTtK7rStQrRnD8a95SCUnzA==", + "dependencies": { + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.10.5.tgz", + "integrity": "sha512-nH+IyFKBi8tCyzGOanJTbXC5t4dspSovX3+ABfmwKWUYllYzmiQNFUadpb3qo+MLA3jFx5IwBesjneN6dD5o3w==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.10.5.tgz", + "integrity": "sha512-1eQFMz9uodrc5OM+9HeT+hHcfR1E1AsgFWXwyJ9Q3xejA2c1c4eObGgOgC9ZoshuHHdptaTN1m3rexqAxXRDBg==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.5.tgz", + "integrity": "sha512-gRJo9zt1UYP4k3woEmZm4iuEBIQd/FrArIsjzsL/b+ihNoOqIxZKTSuGFU4UUZOEhvmxDReiA4gzvQXG+TMTmA==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.10.5.tgz", + "integrity": "sha512-4WfIbn4253EDU12u9UiYvz+QTvAXDv39mKNg9xSoMCjKE5szcQxfcSczw2byc6pYhahOJ9PmxPBfs1doqsdTKQ==", + "dependencies": { + "@algolia/logger-common": "4.10.5" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.5.tgz", + "integrity": "sha512-53/MURQEqtK+bGdfq4ITSPwTh5hnADU99qzvpAINGQveUFNSFGERipJxHjTJjIrjFz3vxj5kKwjtxDnU6ygO9g==", + "dependencies": { + "@algolia/requester-common": "4.10.5" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.5.tgz", + "integrity": "sha512-UkVa1Oyuj6NPiAEt5ZvrbVopEv1m/mKqjs40KLB+dvfZnNcj+9Fry4Oxnt15HMy/HLORXsx4UwcthAvBuOXE9Q==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.10.5.tgz", + "integrity": "sha512-aNEKVKXL4fiiC+bS7yJwAHdxln81ieBwY3tsMCtM4zF9f5KwCzY2OtN4WKEZa5AAADVcghSAUdyjs4AcGUlO5w==", + "dependencies": { + "@algolia/requester-common": "4.10.5" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.5.tgz", + "integrity": "sha512-F8DLkmIlvCoMwSCZA3FKHtmdjH3o5clbt0pi2ktFStVNpC6ZDmY307HcK619bKP5xW6h8sVJhcvrLB775D2cyA==", + "dependencies": { + "@algolia/cache-common": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/requester-common": "4.10.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "dependencies": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "dependencies": { + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "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-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dependencies": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "dependencies": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dependencies": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz", + "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "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-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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "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-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "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-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "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-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "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.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "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-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "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-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "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-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "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-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "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-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "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-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "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-amd/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==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "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/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==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "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/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==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "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-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "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-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "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-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "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-react-display-name": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", + "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-react-jsx": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "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-runtime": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.8.tgz", + "integrity": "sha512-+6zsde91jMzzvkzuEA3k63zCw+tm/GvuuabkpisgbDMTPQsIMHllE3XczJFFtEHLjjhKQFZmGQVRdELetlWpVw==", + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "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-spread": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz", + "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "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-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "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-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "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-typescript": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.8.tgz", + "integrity": "sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "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-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", + "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@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-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.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.15.8", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "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.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", + "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "dependencies": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "dependencies": { + "commander": "^2.15.1" + }, + "bin": { + "findup": "bin/findup.js" + } + }, + "node_modules/@choojs/findup/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/@docsearch/css": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0-alpha.40.tgz", + "integrity": "sha512-PrOTPgJMl+Iji1zOH0+J0PEDMriJ1teGxbgll7o4h8JrvJW6sJGqQw7/bLW7enWiFaxbJMK76w1yyPNLFHV7Qg==" + }, + "node_modules/@docsearch/react": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0-alpha.40.tgz", + "integrity": "sha512-aKxnu7sgpP1R7jtgOV/pZdJEHXx6Ts+jnS9U/ejSUS2BMUpwQI5SA3oLs1BA5TA9kIViJ5E+rrjh0VsbcsJ6sQ==", + "dependencies": { + "@algolia/autocomplete-core": "1.2.2", + "@algolia/autocomplete-preset-algolia": "1.2.2", + "@docsearch/css": "3.0.0-alpha.40", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 18.0.0", + "react": ">= 16.8.0 < 18.0.0", + "react-dom": ">= 16.8.0 < 18.0.0" + } + }, + "node_modules/@docusaurus/core": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-alpha.73.tgz", + "integrity": "sha512-gUF5UOcy/5XmPWFOpLdiilI+7FEEYtvunB62xnvwEp/SNRvoL9PAs9dI2mFaDkme1RmUtPMXKzPZxwlntFnA9A==", + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/generator": "^7.12.15", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.16", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/preset-react": "^7.12.13", + "@babel/preset-typescript": "^7.12.16", + "@babel/runtime": "^7.12.5", + "@babel/runtime-corejs3": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@docusaurus/cssnano-preset": "2.0.0-alpha.73", + "@docusaurus/react-loadable": "5.5.0", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@endiliey/static-site-generator-webpack-plugin": "^4.0.0", + "@svgr/webpack": "^5.5.0", + "autoprefixer": "^10.2.5", + "babel-loader": "^8.2.2", + "babel-plugin-dynamic-import-node": "2.3.0", + "boxen": "^5.0.0", + "cache-loader": "^4.1.0", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "clean-css": "^5.1.1", + "commander": "^5.1.0", + "copy-webpack-plugin": "^6.4.1", + "core-js": "^3.9.1", + "css-loader": "^5.1.1", + "del": "^6.0.0", + "detect-port": "^1.3.0", + "eta": "^1.12.1", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "globby": "^11.0.2", + "html-minifier-terser": "^5.1.1", + "html-tags": "^3.1.0", + "html-webpack-plugin": "^4.5.0", + "import-fresh": "^3.3.0", + "is-root": "^2.1.0", + "leven": "^3.1.0", + "lodash": "^4.17.20", + "mini-css-extract-plugin": "^0.8.0", + "module-alias": "^2.2.2", + "nprogress": "^0.2.0", + "null-loader": "^4.0.0", + "optimize-css-assets-webpack-plugin": "^5.0.4", + "pnp-webpack-plugin": "^1.6.4", + "postcss": "^8.2.7", + "postcss-loader": "^4.1.0", + "prompts": "^2.4.0", + "react-dev-utils": "^11.0.1", + "react-helmet": "^6.1.0", + "react-loadable": "^5.5.0", + "react-loadable-ssr-addon": "^0.3.0", + "react-router": "^5.2.0", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.2.0", + "resolve-pathname": "^3.0.0", + "rtl-detect": "^1.0.2", + "semver": "^7.3.4", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.4", + "std-env": "^2.2.1", + "terser-webpack-plugin": "^4.1.0", + "tslib": "^2.1.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^5.2.1", + "webpack": "^4.44.1", + "webpack-bundle-analyzer": "^4.4.0", + "webpack-dev-server": "^3.11.2", + "webpack-merge": "^4.2.2", + "webpackbar": "^5.0.0-3" + }, + "bin": { + "docusaurus": "bin/docusaurus.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.73.tgz", + "integrity": "sha512-8DregwCCcKl5h3WAwK/NuTQ8BpXiKUnF8owVE4XAS7OnHXSobKfxz0wpF2Jzi0G8TdVfnZzPrXelnWWDL1mc3g==", + "dependencies": { + "cssnano-preset-advanced": "^4.0.7", + "postcss": "^7.0.2", + "postcss-sort-media-queries": "^1.7.26" + } + }, + "node_modules/@docusaurus/cssnano-preset/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/@docusaurus/cssnano-preset/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@docusaurus/cssnano-preset/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/@docusaurus/mdx-loader": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.73.tgz", + "integrity": "sha512-cteoaLe8rFLULAjRy8iOyKwo9LBupu6VPEvQbjhrM23EWap15LD5b66MmfRsCS8ubTdB1i5uYTVhwg1j41Fxjw==", + "dependencies": { + "@babel/parser": "^7.12.16", + "@babel/traverse": "^7.12.13", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "loader-utils": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.1.0", + "stringify-object": "^3.3.0", + "unist-util-visit": "^2.0.2", + "url-loader": "^4.1.1", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.73.tgz", + "integrity": "sha512-1G5lV+hIhZJPS+Z1/QWEVBB26MtTpgA3V9nMXrivet88LBi97X/O4auat4gzCd1ZAAAIssBqvjJZux3iYYuTZg==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "feed": "^4.2.2", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "reading-time": "^1.3.0", + "remark-admonitions": "^1.2.1", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.73.tgz", + "integrity": "sha512-exMBKvTgJ//AazsXNYx/rSlIOt/8nMebOYNd0YMOrY1HNH3SFiTMln2nf6DhZlqDnC+e3DHxBV1mJJnZCef8xQ==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "combine-promises": "^1.1.0", + "execa": "^5.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "import-fresh": "^3.2.2", + "js-yaml": "^4.0.0", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "remark-admonitions": "^1.2.1", + "shelljs": "^0.8.4", + "tslib": "^2.1.0", + "utility-types": "^3.10.0", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs/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==" + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@docusaurus/plugin-content-docs/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/@docusaurus/plugin-content-docs/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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs/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/@docusaurus/plugin-content-pages": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.73.tgz", + "integrity": "sha512-/q9B+N3ICWlnI5mm58lMXhzWit7IP3ntY1snfy8qD98wEfWKLZwefdxnB1HI+qJXBQq5uQTWIe9lULaN/gbDzw==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "remark-admonitions": "^1.2.1", + "slash": "^3.0.0", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.73.tgz", + "integrity": "sha512-EdovLNi8oxLFZDi/7lfLwfmgbaWFR/wOZqOYuyrHJto/TlqCCIOziX4dHYqUPHItbnwV1PGGR49DUrqyNYuLBQ==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "react-json-view": "^1.21.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.73.tgz", + "integrity": "sha512-t3Noo80wT412IMI4vnapWVpfm5PBhYPQpXQxVIZap61K2CT1lAkelyi43vREWt80HwCjXh5HvoR2TxCdGwi6nA==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.73.tgz", + "integrity": "sha512-DqrmV4eW81DzlAJrqMiki+m4tTUlpPkUL7sNemVjzqVl4616tng7wa93FcNw3sZbVm1Kp69Hep3uN2OgRmEqRQ==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.73.tgz", + "integrity": "sha512-APBI/l8T5lsfEYvRZ0ipzZlUlKX/4x47w3WfIvlqS78vk7WHAXa0tEp3S8FK36TqeTjmdmCP0F4DJCY7UJZCSw==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "fs-extra": "^9.1.0", + "sitemap": "^6.3.6", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-eXgwPVMXA9K9FmGrXwOeec9Uqr0KXMdHvx3C5Ocm4E7b/mylMGwykOgR9iaSLYdVY12EKrO7T9Lm3Z37Gll7Zw==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/plugin-debug": "2.0.0-alpha.73", + "@docusaurus/plugin-google-analytics": "2.0.0-alpha.73", + "@docusaurus/plugin-google-gtag": "2.0.0-alpha.73", + "@docusaurus/plugin-sitemap": "2.0.0-alpha.73", + "@docusaurus/theme-classic": "2.0.0-alpha.73", + "@docusaurus/theme-search-algolia": "2.0.0-alpha.73" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==", + "dependencies": { + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-SVjq3xPIFQ/Uzs6WJn+8Gm1b47jLV7YBbcUXpIGd3NBKj16yZml9t7YNpos6Vt7Y5mCVhIP4IqWYJshArw6Aog==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "chalk": "^4.1.0", + "clsx": "^1.1.1", + "copy-text-to-clipboard": "^3.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "infima": "0.2.0-alpha.22", + "lodash": "^4.17.20", + "parse-numeric-range": "^1.2.0", + "postcss": "^7.0.2", + "prism-react-renderer": "^1.1.1", + "prismjs": "^1.23.0", + "prop-types": "^15.7.2", + "react-router-dom": "^5.2.0", + "rtlcss": "^2.6.2" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-classic/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/@docusaurus/theme-classic/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@docusaurus/theme-classic/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/@docusaurus/theme-common": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.73.tgz", + "integrity": "sha512-ePteJFQkQRkK+J1FKDhmczq+yiEmORTW9YJgYceQVq+9L6unr0XxeOBBNC27BxSabUI+A9YXjQbtdmOHFM8LKA==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "prism-react-renderer": "^1.1.1", + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.73.tgz", + "integrity": "sha512-SMfeGYZb85GIcuUjefMN+RunLDK+x6ETnlGuY9LU2S6bvoaZ4YTcqBPOt0iyZ1LH+XZmFuz78lFDW1gklaNmfg==", + "dependencies": { + "@docsearch/react": "^3.0.0-alpha.33", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "algoliasearch": "^4.8.4", + "algoliasearch-helper": "^3.3.4", + "clsx": "^1.1.1", + "eta": "^1.12.1", + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-alpha.73.tgz", + "integrity": "sha512-+q7q178LS2mMTGD/U5KgloLGKtG8yzpqj+NOp2QprjFVqTfkwTFcMhN33PTZTUcDunMDuUt+LOo9hi9Vz9+r5Q==", + "dependencies": { + "@types/webpack": "^4.41.0", + "commander": "^5.1.0", + "joi": "^17.4.0", + "querystring": "0.2.0", + "webpack-merge": "^4.2.2" + } + }, + "node_modules/@docusaurus/utils": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-alpha.73.tgz", + "integrity": "sha512-kUHnE1b/3yNWNAn0V8owLgCrxqyxfolkCbkPFfnRT+4m+agyn3riEcr+ZVObs7K9nxCla8oklX5RKSJGzyqWww==", + "dependencies": { + "@docusaurus/types": "2.0.0-alpha.73", + "@types/github-slugger": "^1.3.0", + "chalk": "^4.1.0", + "escape-string-regexp": "^4.0.0", + "fs-extra": "^9.1.0", + "gray-matter": "^4.0.2", + "lodash": "^4.17.20", + "resolve-pathname": "^3.0.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.73.tgz", + "integrity": "sha512-A36kKC+tCy/MGXdaK7emH2CHyHKru/+Td9zCm6fvNdNbu+dDNvEddTZ3ecjB0zNdDZM25Er4+KIo9GV3vnJ8Rg==", + "dependencies": { + "@docusaurus/utils": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "joi": "^17.4.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@docusaurus/utils/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@endiliey/static-site-generator-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng==", + "dependencies": { + "bluebird": "^3.7.1", + "cheerio": "^0.22.0", + "eval": "^0.1.4", + "url": "^0.11.0", + "webpack-sources": "^1.4.3" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + }, + "node_modules/@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/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/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "node_modules/@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/github-slugger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", + "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==" + }, + "node_modules/@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + }, + "node_modules/@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "node_modules/@types/node": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.0.tgz", + "integrity": "sha512-8MLkBIYQMuhRBQzGN9875bYsOhPnf/0rgXGo66S2FemHkhbn9qtsz9ywV1iCG+vbjigE4WUNVvw37Dx+L0qsPg==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "node_modules/@types/sax": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.3.tgz", + "integrity": "sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "node_modules/@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + }, + "node_modules/@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/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/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@types/webpack": { + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/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/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "engines": { + "node": ">= 0.12.0" + } + }, + "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/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.10.5.tgz", + "integrity": "sha512-KmH2XkiN+8FxhND4nWFbQDkIoU6g2OjfeU9kIv4Lb+EiOOs3Gpp7jvd+JnatsCisAZsnWQdjd7zVlW7I/85QvQ==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.10.5", + "@algolia/cache-common": "4.10.5", + "@algolia/cache-in-memory": "4.10.5", + "@algolia/client-account": "4.10.5", + "@algolia/client-analytics": "4.10.5", + "@algolia/client-common": "4.10.5", + "@algolia/client-personalization": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/logger-console": "4.10.5", + "@algolia/requester-browser-xhr": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/requester-node-http": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.6.0.tgz", + "integrity": "sha512-F4Smiq+Vyv/JJytuKNFuzXndPSb4pjtiHZSkEztQCcB+SORu71A8grgt2NSJhbB5VhqHW19QDtlPKbdYdcNrLg==", + "dependencies": { + "events": "^1.1.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 5" + } + }, + "node_modules/algoliasearch-helper/node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "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-escapes/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/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + }, + "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/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "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==", + "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==" + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "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/autoprefixer": { + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.7.tgz", + "integrity": "sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg==", + "dependencies": { + "browserslist": "^4.17.3", + "caniuse-lite": "^1.0.30001264", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "picocolors": "^0.2.1", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/autoprefixer/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + }, + "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/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "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/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/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==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", + "dependencies": { + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", + "escalade": "^3.1.1", + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "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-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==" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "node_modules/buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "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": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/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/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/cache-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/cache-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/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/cacheable-request/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/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "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/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001267", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz", + "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/chalk/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/chalk/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/chalk/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/chalk/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/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/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio/node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/cheerio/node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "engines": { + "node": "*" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "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/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "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==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.1.tgz", + "integrity": "sha512-ooQCa1/70oRfVdUUGjKpbHuxgMgm8BsDT5EBqBGvPxMoRoGXf4PNx5mMnkjzJ9Ptx4vvmDdha0QVh86QtYIk1g==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-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/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-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/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==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/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/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "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/concat-stream/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/concat-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/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "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==" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "dependencies": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/core-js": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.3.tgz", + "integrity": "sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz", + "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==", + "dependencies": { + "browserslist": "^4.17.3", + "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==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz", + "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-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/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "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==" + }, + "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==", + "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==", + "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-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "dependencies": { + "node-fetch": "2.6.1" + } + }, + "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/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==", + "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/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-declaration-sorter/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/css-declaration-sorter/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-declaration-sorter/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/css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.8.tgz", + "integrity": "sha512-DlZ5+XNKwB3ZnrtJ7jdj8WxT5Zgt1WIr4gdP9v1Sdn3SObqcLwbBobQaM7BqLIVHS74TE5iWn2TSYmOVSsmozQ==", + "dependencies": { + "autoprefixer": "^9.4.7", + "cssnano-preset-default": "^4.0.8", + "postcss-discard-unused": "^4.0.1", + "postcss-merge-idents": "^4.0.1", + "postcss-reduce-idents": "^4.0.2", + "postcss-zindex": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-advanced/node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/cssnano-preset-advanced/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano-preset-advanced/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-preset-advanced/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/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano-preset-default/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-preset-default/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/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano-util-raw-cache/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-raw-cache/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/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/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/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/csso/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/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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==", + "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==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "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==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "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/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/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/duplexify/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/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.870", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.870.tgz", + "integrity": "sha512-PiJMshfq6PL+i1V+nKLwhHbCKeD8eAz8rvO9Cwk/7cChOHJBtufmjajLyYLsSRHguRFiOCVx3XzJLeZsIAYfSA==" + }, + "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==", + "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==" + }, + "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/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "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/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enhanced-resolve/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/enhanced-resolve/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/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "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/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.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==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.6.tgz", + "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==", + "dependencies": { + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "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-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-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "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==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", + "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", + "dependencies": { + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "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-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", + "engines": { + "node": ">= 0.4.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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/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/flush-write-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/flux": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.2.tgz", + "integrity": "sha512-u/ucO5ezm3nBvdaSGkWpDlzCePoV+a9x3KHmy13TV/5MzOaCZDN8Mfd94jmf0nOi8ZZay+nOKbBUkOe2VNaupQ==", + "dependencies": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.0" + }, + "peerDependencies": { + "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "engines": { + "node": ">=6.11.5", + "yarn": ">=1.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/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/from2/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/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-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs-write-stream-atomic/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/fs-write-stream-atomic/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/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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/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==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/github-slugger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/global-dirs/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/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "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": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "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/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/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/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/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/hpack.js/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/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier-terser/node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-minifier-terser/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/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "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-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "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==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "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/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/infima": { + "version": "0.2.0-alpha.22", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.22.tgz", + "integrity": "sha512-wKOWp4C1lTFG/h54UWD3Uf6VEsj5qYehM3ZVio3GBzIQuY8B3cTiwG7ZRNoobg+LvdQA21p5BJTugpTLQJLIrA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-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==", + "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==" + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dependencies": { + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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/jest-worker/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/joi": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz", + "integrity": "sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.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==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "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/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dependencies": { + "minimist": "^1.2.5" + }, + "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/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dependencies": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "node_modules/lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + }, + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "node_modules/lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "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.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "node_modules/lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + }, + "node_modules/lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + }, + "node_modules/lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "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==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "dependencies": { + "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/memory-fs/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/memory-fs/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/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "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==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "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==", + "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==" + }, + "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.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "dependencies": { + "mime-db": "1.50.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", + "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==", + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "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==" + }, + "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": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/minipass": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/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/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "node_modules/nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/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/node-libs-browser/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/node-releases": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "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-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/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/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "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==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz", + "integrity": "sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==", + "dependencies": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-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-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parallel-transform/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/parallel-transform/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/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "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/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "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==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "node_modules/path-key": { + "version": "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==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "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/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/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/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", + "integrity": "sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==", + "dependencies": { + "nanoid": "^3.1.28", + "picocolors": "^0.2.1", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-calc/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-calc/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc/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/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-colormin/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-colormin/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/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-convert-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-convert-values/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/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-comments/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/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-duplicates/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-duplicates/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/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-empty/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-empty/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/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-overridden/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/postcss-discard-unused": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz", + "integrity": "sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-unused/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-unused/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-discard-unused/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/postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/postcss-merge-idents": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz", + "integrity": "sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==", + "dependencies": { + "cssnano-util-same-parent": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-merge-idents/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-idents/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-merge-idents/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/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-merge-longhand/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/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-merge-rules/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-merge-rules/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/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-font-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-font-values/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/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-gradients/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/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-params/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/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-selectors/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/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-charset/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-charset/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/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-display-values/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/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-positions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-positions/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/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-repeat-style/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/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-string/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-string/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/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-timing-functions/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/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-unicode/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/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-url/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-url/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/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-whitespace/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/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-ordered-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-ordered-values/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/postcss-reduce-idents": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz", + "integrity": "sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-reduce-idents/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-idents/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-reduce-idents/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/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-reduce-initial/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-initial/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/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-reduce-transforms/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/postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "1.31.21", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz", + "integrity": "sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg==", + "dependencies": { + "postcss": "^7.0.27", + "sort-css-media-queries": "1.5.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-sort-media-queries/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-sort-media-queries/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-sort-media-queries/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/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-svgo/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-svgo/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/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-unique-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-unique-selectors/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/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "node_modules/postcss-zindex": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-4.0.1.tgz", + "integrity": "sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-zindex/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-zindex/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-zindex/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/postcss/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz", + "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==", + "peerDependencies": { + "react": ">=0.14.9" + } + }, + "node_modules/prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "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/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "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==" + }, + "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/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "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": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "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==", + "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/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "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==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "dependencies": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "node_modules/react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "dependencies": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-dev-utils/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/react-dev-utils/node_modules/browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "dependencies": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + }, + "node_modules/react-dev-utils/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/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/react-dev-utils/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/react-dev-utils/node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/react-dev-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/react-dev-utils/node_modules/node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==" + }, + "node_modules/react-dev-utils/node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-dev-utils/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "node_modules/react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.3.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==" + }, + "node_modules/react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "dependencies": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + }, + "peerDependencies": { + "react": "^17.0.0 || ^16.3.0 || ^15.5.4", + "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", + "dependencies": { + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.3.0.tgz", + "integrity": "sha512-E+lnmDakV0k6ut6R2J77vurwCOwTKEwKlHs9S62G8ez+ujecLPcqjt3YAU8M58kIGjp2QjFlZ7F9QWkq/mr6Iw==", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=4.2.4" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1" + } + }, + "node_modules/react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/react-router/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/react-side-effect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", + "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0" + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", + "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.0.0", + "use-latest": "^1.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.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==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "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==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "node_modules/regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "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": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "dependencies": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "dependencies": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "dependencies": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-admonitions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", + "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", + "dependencies": { + "rehype-parse": "^6.0.2", + "unified": "^8.4.2", + "unist-util-visit": "^2.0.1" + } + }, + "node_modules/remark-admonitions/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/remark-admonitions/node_modules/unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "dependencies": { + "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/renderkid/node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=", + "engines": { + "node": "*" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "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==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "node_modules/rtlcss": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.6.2.tgz", + "integrity": "sha512-06LFAr+GAPo+BvaynsXRfoYTJvSaWRyOhURCQ7aeI1MKph9meM222F+Zkt3bDamyHHJuGi3VPtiRkpyswmQbGA==", + "dependencies": { + "@choojs/findup": "^0.2.1", + "chalk": "^2.4.2", + "mkdirp": "^0.5.1", + "postcss": "^6.0.23", + "strip-json-comments": "^2.0.0" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + } + }, + "node_modules/rtlcss/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/rtlcss/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/rtlcss/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/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==", + "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/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "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/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", + "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.0.4", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-handler/node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/serve-handler/node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "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==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "node_modules/shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/sitemap": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-6.4.0.tgz", + "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==", + "dependencies": { + "@types/node": "^14.14.28", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=10.3.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "14.17.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.27.tgz", + "integrity": "sha512-94+Ahf9IcaDuJTle/2b+wzvjmutxXAEXU6O81JHblYXUg2BDG+dnBy7VxIPHKAyEEDHzCMQydTJuWvrE+Aanzw==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + } + }, + "node_modules/sockjs-client/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/sort-css-media-queries": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz", + "integrity": "sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw==", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "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==", + "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-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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/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==" + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/std-env": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.1.tgz", + "integrity": "sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g==", + "dependencies": { + "ci-info": "^3.1.1" + } + }, + "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==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-browserify/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/stream-browserify/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/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-http/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/stream-http/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/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "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_decoder/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/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.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "engines": { + "node": ">=0.10.0" + } + }, + "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-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/stylehacks/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylehacks/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/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/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/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/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar/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/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dependencies": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser/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/terser/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/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/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/through2/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/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "node_modules/tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "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": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-essentials": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", + "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "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==", + "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==", + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/unified/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/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": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-parse-lax/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-composed-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", + "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", + "dependencies": { + "ts-essentials": "^2.0.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", + "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", + "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "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/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/wait-on": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", + "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "dependencies": { + "axios": "^0.21.1", + "joi": "^17.3.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^6.6.3" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "optional": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "optional": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/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==", + "optional": true, + "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/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/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==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/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/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/webpack/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/webpack/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/webpack/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/webpack/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/webpack/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/webpackbar": { + "version": "5.0.0-3", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.0-3.tgz", + "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.1.0", + "consola": "^2.15.0", + "figures": "^3.2.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "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": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "dependencies": { + "microevent.ts": "~0.1.1" + } + }, + "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": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.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": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "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/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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==" + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/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==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.2.2.tgz", + "integrity": "sha512-JOQaURze45qVa8OOFDh+ozj2a/ObSRsVyz6Zd0aiBeej+RSTqrr1hDVpGNbbXYLW26G5ujuc9QIdH+rBHn95nw==", + "requires": { + "@algolia/autocomplete-shared": "1.2.2" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.2.2.tgz", + "integrity": "sha512-AZkh+bAMaJDzMZTelFOXJTJqkp5VPGH8W3n0B+Ggce7DdozlMRsDLguKTCQAkZ0dJ1EbBPyFL5ztL/JImB137Q==", + "requires": { + "@algolia/autocomplete-shared": "1.2.2" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.2.2.tgz", + "integrity": "sha512-mLTl7d2C1xVVazHt/bqh9EE/u2lbp5YOxLDdcjILXmUqOs5HH1D4SuySblXaQG1uf28FhTqMGp35qE5wJQnqAw==" + }, + "@algolia/cache-browser-local-storage": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.5.tgz", + "integrity": "sha512-cfX2rEKOtuuljcGI5DMDHClwZHdDqd2nT2Ohsc8aHtBiz6bUxKVyIqxr2gaC6tU8AgPtrTVBzcxCA+UavXpKww==", + "requires": { + "@algolia/cache-common": "4.10.5" + } + }, + "@algolia/cache-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.5.tgz", + "integrity": "sha512-1mClwdmTHll+OnHkG+yeRoFM17kSxDs4qXkjf6rNZhoZGXDvfYLy3YcZ1FX4Kyz0DJv8aroq5RYGBDsWkHj6Tw==" + }, + "@algolia/cache-in-memory": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.10.5.tgz", + "integrity": "sha512-+ciQnfIGi5wjMk02XhEY8fmy2pzy+oY1nIIfu8LBOglaSipCRAtjk6WhHc7/KIbXPiYzIwuDbM2K1+YOwSGjwA==", + "requires": { + "@algolia/cache-common": "4.10.5" + } + }, + "@algolia/client-account": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.10.5.tgz", + "integrity": "sha512-I9UkSS2glXm7RBZYZIALjBMmXSQbw/fI/djPcBHxiwXIheNIlqIFl2SNPkvihpPF979BSkzjqdJNRPhE1vku3Q==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-analytics": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.10.5.tgz", + "integrity": "sha512-h2owwJSkovPxzc+xIsjY1pMl0gj+jdVwP9rcnGjlaTY2fqHbSLrR9yvGyyr6305LvTppxsQnfAbRdE/5Z3eFxw==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.5.tgz", + "integrity": "sha512-21FAvIai5qm8DVmZHm2Gp4LssQ/a0nWwMchAx+1hIRj1TX7OcdW6oZDPyZ8asQdvTtK7rStQrRnD8a95SCUnzA==", + "requires": { + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-personalization": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.10.5.tgz", + "integrity": "sha512-nH+IyFKBi8tCyzGOanJTbXC5t4dspSovX3+ABfmwKWUYllYzmiQNFUadpb3qo+MLA3jFx5IwBesjneN6dD5o3w==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-search": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.10.5.tgz", + "integrity": "sha512-1eQFMz9uodrc5OM+9HeT+hHcfR1E1AsgFWXwyJ9Q3xejA2c1c4eObGgOgC9ZoshuHHdptaTN1m3rexqAxXRDBg==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/logger-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.5.tgz", + "integrity": "sha512-gRJo9zt1UYP4k3woEmZm4iuEBIQd/FrArIsjzsL/b+ihNoOqIxZKTSuGFU4UUZOEhvmxDReiA4gzvQXG+TMTmA==" + }, + "@algolia/logger-console": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.10.5.tgz", + "integrity": "sha512-4WfIbn4253EDU12u9UiYvz+QTvAXDv39mKNg9xSoMCjKE5szcQxfcSczw2byc6pYhahOJ9PmxPBfs1doqsdTKQ==", + "requires": { + "@algolia/logger-common": "4.10.5" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.5.tgz", + "integrity": "sha512-53/MURQEqtK+bGdfq4ITSPwTh5hnADU99qzvpAINGQveUFNSFGERipJxHjTJjIrjFz3vxj5kKwjtxDnU6ygO9g==", + "requires": { + "@algolia/requester-common": "4.10.5" + } + }, + "@algolia/requester-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.5.tgz", + "integrity": "sha512-UkVa1Oyuj6NPiAEt5ZvrbVopEv1m/mKqjs40KLB+dvfZnNcj+9Fry4Oxnt15HMy/HLORXsx4UwcthAvBuOXE9Q==" + }, + "@algolia/requester-node-http": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.10.5.tgz", + "integrity": "sha512-aNEKVKXL4fiiC+bS7yJwAHdxln81ieBwY3tsMCtM4zF9f5KwCzY2OtN4WKEZa5AAADVcghSAUdyjs4AcGUlO5w==", + "requires": { + "@algolia/requester-common": "4.10.5" + } + }, + "@algolia/transporter": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.5.tgz", + "integrity": "sha512-F8DLkmIlvCoMwSCZA3FKHtmdjH3o5clbt0pi2ktFStVNpC6ZDmY307HcK619bKP5xW6h8sVJhcvrLB775D2cyA==", + "requires": { + "@algolia/cache-common": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/requester-common": "4.10.5" + } + }, + "@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + }, + "@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "requires": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "requires": { + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + }, + "@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "requires": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "requires": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz", + "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@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==", + "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==", + "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==", + "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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "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==", + "requires": { + "object.assign": "^4.1.0" + } + } + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "requires": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "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==", + "requires": { + "object.assign": "^4.1.0" + } + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "requires": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "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==", + "requires": { + "object.assign": "^4.1.0" + } + } + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.8.tgz", + "integrity": "sha512-+6zsde91jMzzvkzuEA3k63zCw+tm/GvuuabkpisgbDMTPQsIMHllE3XczJFFtEHLjjhKQFZmGQVRdELetlWpVw==", + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz", + "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.8.tgz", + "integrity": "sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", + "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@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-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.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.15.8", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "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.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + } + }, + "@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + } + }, + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", + "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "requires": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "requires": { + "commander": "^2.15.1" + }, + "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==" + } + } + }, + "@docsearch/css": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0-alpha.40.tgz", + "integrity": "sha512-PrOTPgJMl+Iji1zOH0+J0PEDMriJ1teGxbgll7o4h8JrvJW6sJGqQw7/bLW7enWiFaxbJMK76w1yyPNLFHV7Qg==" + }, + "@docsearch/react": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0-alpha.40.tgz", + "integrity": "sha512-aKxnu7sgpP1R7jtgOV/pZdJEHXx6Ts+jnS9U/ejSUS2BMUpwQI5SA3oLs1BA5TA9kIViJ5E+rrjh0VsbcsJ6sQ==", + "requires": { + "@algolia/autocomplete-core": "1.2.2", + "@algolia/autocomplete-preset-algolia": "1.2.2", + "@docsearch/css": "3.0.0-alpha.40", + "algoliasearch": "^4.0.0" + } + }, + "@docusaurus/core": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-alpha.73.tgz", + "integrity": "sha512-gUF5UOcy/5XmPWFOpLdiilI+7FEEYtvunB62xnvwEp/SNRvoL9PAs9dI2mFaDkme1RmUtPMXKzPZxwlntFnA9A==", + "requires": { + "@babel/core": "^7.12.16", + "@babel/generator": "^7.12.15", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.16", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/preset-react": "^7.12.13", + "@babel/preset-typescript": "^7.12.16", + "@babel/runtime": "^7.12.5", + "@babel/runtime-corejs3": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@docusaurus/cssnano-preset": "2.0.0-alpha.73", + "@docusaurus/react-loadable": "5.5.0", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@endiliey/static-site-generator-webpack-plugin": "^4.0.0", + "@svgr/webpack": "^5.5.0", + "autoprefixer": "^10.2.5", + "babel-loader": "^8.2.2", + "babel-plugin-dynamic-import-node": "2.3.0", + "boxen": "^5.0.0", + "cache-loader": "^4.1.0", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "clean-css": "^5.1.1", + "commander": "^5.1.0", + "copy-webpack-plugin": "^6.4.1", + "core-js": "^3.9.1", + "css-loader": "^5.1.1", + "del": "^6.0.0", + "detect-port": "^1.3.0", + "eta": "^1.12.1", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "globby": "^11.0.2", + "html-minifier-terser": "^5.1.1", + "html-tags": "^3.1.0", + "html-webpack-plugin": "^4.5.0", + "import-fresh": "^3.3.0", + "is-root": "^2.1.0", + "leven": "^3.1.0", + "lodash": "^4.17.20", + "mini-css-extract-plugin": "^0.8.0", + "module-alias": "^2.2.2", + "nprogress": "^0.2.0", + "null-loader": "^4.0.0", + "optimize-css-assets-webpack-plugin": "^5.0.4", + "pnp-webpack-plugin": "^1.6.4", + "postcss": "^8.2.7", + "postcss-loader": "^4.1.0", + "prompts": "^2.4.0", + "react-dev-utils": "^11.0.1", + "react-helmet": "^6.1.0", + "react-loadable": "^5.5.0", + "react-loadable-ssr-addon": "^0.3.0", + "react-router": "^5.2.0", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.2.0", + "resolve-pathname": "^3.0.0", + "rtl-detect": "^1.0.2", + "semver": "^7.3.4", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.4", + "std-env": "^2.2.1", + "terser-webpack-plugin": "^4.1.0", + "tslib": "^2.1.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^5.2.1", + "webpack": "^4.44.1", + "webpack-bundle-analyzer": "^4.4.0", + "webpack-dev-server": "^3.11.2", + "webpack-merge": "^4.2.2", + "webpackbar": "^5.0.0-3" + } + }, + "@docusaurus/cssnano-preset": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.73.tgz", + "integrity": "sha512-8DregwCCcKl5h3WAwK/NuTQ8BpXiKUnF8owVE4XAS7OnHXSobKfxz0wpF2Jzi0G8TdVfnZzPrXelnWWDL1mc3g==", + "requires": { + "cssnano-preset-advanced": "^4.0.7", + "postcss": "^7.0.2", + "postcss-sort-media-queries": "^1.7.26" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@docusaurus/mdx-loader": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.73.tgz", + "integrity": "sha512-cteoaLe8rFLULAjRy8iOyKwo9LBupu6VPEvQbjhrM23EWap15LD5b66MmfRsCS8ubTdB1i5uYTVhwg1j41Fxjw==", + "requires": { + "@babel/parser": "^7.12.16", + "@babel/traverse": "^7.12.13", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "loader-utils": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.1.0", + "stringify-object": "^3.3.0", + "unist-util-visit": "^2.0.2", + "url-loader": "^4.1.1", + "webpack": "^4.44.1" + } + }, + "@docusaurus/plugin-content-blog": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.73.tgz", + "integrity": "sha512-1G5lV+hIhZJPS+Z1/QWEVBB26MtTpgA3V9nMXrivet88LBi97X/O4auat4gzCd1ZAAAIssBqvjJZux3iYYuTZg==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "feed": "^4.2.2", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "reading-time": "^1.3.0", + "remark-admonitions": "^1.2.1", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "@docusaurus/plugin-content-docs": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.73.tgz", + "integrity": "sha512-exMBKvTgJ//AazsXNYx/rSlIOt/8nMebOYNd0YMOrY1HNH3SFiTMln2nf6DhZlqDnC+e3DHxBV1mJJnZCef8xQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "combine-promises": "^1.1.0", + "execa": "^5.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "import-fresh": "^3.2.2", + "js-yaml": "^4.0.0", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "remark-admonitions": "^1.2.1", + "shelljs": "^0.8.4", + "tslib": "^2.1.0", + "utility-types": "^3.10.0", + "webpack": "^4.44.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "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" + } + } + } + }, + "@docusaurus/plugin-content-pages": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.73.tgz", + "integrity": "sha512-/q9B+N3ICWlnI5mm58lMXhzWit7IP3ntY1snfy8qD98wEfWKLZwefdxnB1HI+qJXBQq5uQTWIe9lULaN/gbDzw==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "remark-admonitions": "^1.2.1", + "slash": "^3.0.0", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "@docusaurus/plugin-debug": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.73.tgz", + "integrity": "sha512-EdovLNi8oxLFZDi/7lfLwfmgbaWFR/wOZqOYuyrHJto/TlqCCIOziX4dHYqUPHItbnwV1PGGR49DUrqyNYuLBQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "react-json-view": "^1.21.1", + "tslib": "^2.1.0" + } + }, + "@docusaurus/plugin-google-analytics": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.73.tgz", + "integrity": "sha512-t3Noo80wT412IMI4vnapWVpfm5PBhYPQpXQxVIZap61K2CT1lAkelyi43vREWt80HwCjXh5HvoR2TxCdGwi6nA==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73" + } + }, + "@docusaurus/plugin-google-gtag": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.73.tgz", + "integrity": "sha512-DqrmV4eW81DzlAJrqMiki+m4tTUlpPkUL7sNemVjzqVl4616tng7wa93FcNw3sZbVm1Kp69Hep3uN2OgRmEqRQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73" + } + }, + "@docusaurus/plugin-sitemap": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.73.tgz", + "integrity": "sha512-APBI/l8T5lsfEYvRZ0ipzZlUlKX/4x47w3WfIvlqS78vk7WHAXa0tEp3S8FK36TqeTjmdmCP0F4DJCY7UJZCSw==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "fs-extra": "^9.1.0", + "sitemap": "^6.3.6", + "tslib": "^2.1.0" + } + }, + "@docusaurus/preset-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-eXgwPVMXA9K9FmGrXwOeec9Uqr0KXMdHvx3C5Ocm4E7b/mylMGwykOgR9iaSLYdVY12EKrO7T9Lm3Z37Gll7Zw==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/plugin-debug": "2.0.0-alpha.73", + "@docusaurus/plugin-google-analytics": "2.0.0-alpha.73", + "@docusaurus/plugin-google-gtag": "2.0.0-alpha.73", + "@docusaurus/plugin-sitemap": "2.0.0-alpha.73", + "@docusaurus/theme-classic": "2.0.0-alpha.73", + "@docusaurus/theme-search-algolia": "2.0.0-alpha.73" + } + }, + "@docusaurus/react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==", + "requires": { + "prop-types": "^15.6.2" + } + }, + "@docusaurus/theme-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-SVjq3xPIFQ/Uzs6WJn+8Gm1b47jLV7YBbcUXpIGd3NBKj16yZml9t7YNpos6Vt7Y5mCVhIP4IqWYJshArw6Aog==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "chalk": "^4.1.0", + "clsx": "^1.1.1", + "copy-text-to-clipboard": "^3.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "infima": "0.2.0-alpha.22", + "lodash": "^4.17.20", + "parse-numeric-range": "^1.2.0", + "postcss": "^7.0.2", + "prism-react-renderer": "^1.1.1", + "prismjs": "^1.23.0", + "prop-types": "^15.7.2", + "react-router-dom": "^5.2.0", + "rtlcss": "^2.6.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@docusaurus/theme-common": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.73.tgz", + "integrity": "sha512-ePteJFQkQRkK+J1FKDhmczq+yiEmORTW9YJgYceQVq+9L6unr0XxeOBBNC27BxSabUI+A9YXjQbtdmOHFM8LKA==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "tslib": "^2.1.0" + } + }, + "@docusaurus/theme-search-algolia": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.73.tgz", + "integrity": "sha512-SMfeGYZb85GIcuUjefMN+RunLDK+x6ETnlGuY9LU2S6bvoaZ4YTcqBPOt0iyZ1LH+XZmFuz78lFDW1gklaNmfg==", + "requires": { + "@docsearch/react": "^3.0.0-alpha.33", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "algoliasearch": "^4.8.4", + "algoliasearch-helper": "^3.3.4", + "clsx": "^1.1.1", + "eta": "^1.12.1", + "lodash": "^4.17.20" + } + }, + "@docusaurus/types": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-alpha.73.tgz", + "integrity": "sha512-+q7q178LS2mMTGD/U5KgloLGKtG8yzpqj+NOp2QprjFVqTfkwTFcMhN33PTZTUcDunMDuUt+LOo9hi9Vz9+r5Q==", + "requires": { + "@types/webpack": "^4.41.0", + "commander": "^5.1.0", + "joi": "^17.4.0", + "querystring": "0.2.0", + "webpack-merge": "^4.2.2" + } + }, + "@docusaurus/utils": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-alpha.73.tgz", + "integrity": "sha512-kUHnE1b/3yNWNAn0V8owLgCrxqyxfolkCbkPFfnRT+4m+agyn3riEcr+ZVObs7K9nxCla8oklX5RKSJGzyqWww==", + "requires": { + "@docusaurus/types": "2.0.0-alpha.73", + "@types/github-slugger": "^1.3.0", + "chalk": "^4.1.0", + "escape-string-regexp": "^4.0.0", + "fs-extra": "^9.1.0", + "gray-matter": "^4.0.2", + "lodash": "^4.17.20", + "resolve-pathname": "^3.0.0", + "tslib": "^2.1.0" + }, + "dependencies": { + "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==" + } + } + }, + "@docusaurus/utils-validation": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.73.tgz", + "integrity": "sha512-A36kKC+tCy/MGXdaK7emH2CHyHKru/+Td9zCm6fvNdNbu+dDNvEddTZ3ecjB0zNdDZM25Er4+KIo9GV3vnJ8Rg==", + "requires": { + "@docusaurus/utils": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "joi": "^17.4.0", + "tslib": "^2.1.0" + } + }, + "@endiliey/static-site-generator-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng==", + "requires": { + "bluebird": "^3.7.1", + "cheerio": "^0.22.0", + "eval": "^0.1.4", + "url": "^0.11.0", + "webpack-sources": "^1.4.3" + } + }, + "@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + }, + "@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "requires": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "requires": {} + }, + "@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" + }, + "@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==", + "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==" + }, + "@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==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/github-slugger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", + "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==" + }, + "@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "requires": { + "@types/unist": "*" + } + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "@types/node": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.0.tgz", + "integrity": "sha512-8MLkBIYQMuhRBQzGN9875bYsOhPnf/0rgXGo66S2FemHkhbn9qtsz9ywV1iCG+vbjigE4WUNVvw37Dx+L0qsPg==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/sax": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.3.tgz", + "integrity": "sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==", + "requires": { + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + }, + "@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "@types/webpack": { + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "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" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "requires": {} + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "algoliasearch": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.10.5.tgz", + "integrity": "sha512-KmH2XkiN+8FxhND4nWFbQDkIoU6g2OjfeU9kIv4Lb+EiOOs3Gpp7jvd+JnatsCisAZsnWQdjd7zVlW7I/85QvQ==", + "requires": { + "@algolia/cache-browser-local-storage": "4.10.5", + "@algolia/cache-common": "4.10.5", + "@algolia/cache-in-memory": "4.10.5", + "@algolia/client-account": "4.10.5", + "@algolia/client-analytics": "4.10.5", + "@algolia/client-common": "4.10.5", + "@algolia/client-personalization": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/logger-console": "4.10.5", + "@algolia/requester-browser-xhr": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/requester-node-http": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "algoliasearch-helper": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.6.0.tgz", + "integrity": "sha512-F4Smiq+Vyv/JJytuKNFuzXndPSb4pjtiHZSkEztQCcB+SORu71A8grgt2NSJhbB5VhqHW19QDtlPKbdYdcNrLg==", + "requires": { + "events": "^1.1.1" + }, + "dependencies": { + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + } + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "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" + }, + "dependencies": { + "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==" + } + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "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==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + }, + "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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "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==" + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "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": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "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==" + }, + "autoprefixer": { + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.7.tgz", + "integrity": "sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg==", + "requires": { + "browserslist": "^4.17.3", + "caniuse-lite": "^1.0.30001264", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "picocolors": "^0.2.1", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + } + } + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "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.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "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==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "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==", + "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==", + "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==", + "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==", + "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": { + "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==" + } + } + }, + "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==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", + "requires": { + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", + "escalade": "^3.1.1", + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" + } + }, + "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-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==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "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" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + } + } + }, + "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" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001267", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz", + "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==" + }, + "ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + }, + "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": { + "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==" + }, + "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" + } + } + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "dependencies": { + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "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" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "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==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.1.tgz", + "integrity": "sha512-ooQCa1/70oRfVdUUGjKpbHuxgMgm8BsDT5EBqBGvPxMoRoGXf4PNx5mMnkjzJ9Ptx4vvmDdha0QVh86QtYIk1g==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "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==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "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" + } + } + } + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==" + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" + }, + "copy-webpack-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "requires": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "core-js": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.3.tgz", + "integrity": "sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==" + }, + "core-js-compat": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz", + "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==", + "requires": { + "browserslist": "^4.17.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-js-pure": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz", + "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==" + }, + "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==" + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.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==", + "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==" + } + } + }, + "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==", + "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==", + "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-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "requires": { + "node-fetch": "2.6.1" + } + }, + "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" + } + }, + "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==", + "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" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "requires": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-preset-advanced": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.8.tgz", + "integrity": "sha512-DlZ5+XNKwB3ZnrtJ7jdj8WxT5Zgt1WIr4gdP9v1Sdn3SObqcLwbBobQaM7BqLIVHS74TE5iWn2TSYmOVSsmozQ==", + "requires": { + "autoprefixer": "^9.4.7", + "cssnano-preset-default": "^4.0.8", + "postcss-discard-unused": "^4.0.1", + "postcss-merge-idents": "^4.0.1", + "postcss-reduce-idents": "^4.0.2", + "postcss-zindex": "^4.0.1" + }, + "dependencies": { + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "requires": { + "repeat-string": "^1.5.4" + } + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "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==" + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.870", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.870.tgz", + "integrity": "sha512-PiJMshfq6PL+i1V+nKLwhHbCKeD8eAz8rvO9Cwk/7cChOHJBtufmjajLyYLsSRHguRFiOCVx3XzJLeZsIAYfSA==" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "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==" + } + } + }, + "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==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "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" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + } + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "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" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "eta": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eval": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.6.tgz", + "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==", + "requires": { + "require-like": ">= 0.1.1" + } + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "requires": { + "original": "^1.0.0" + } + }, + "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==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "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" + } + }, + "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-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "requires": { + "punycode": "^1.3.2" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "requires": { + "fbjs": "^3.0.0" + } + }, + "fbjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", + "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", + "requires": { + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "requires": { + "xml-js": "^1.6.11" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "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-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" + }, + "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==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "flux": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.2.tgz", + "integrity": "sha512-u/ucO5ezm3nBvdaSGkWpDlzCePoV+a9x3KHmy13TV/5MzOaCZDN8Mfd94jmf0nOi8ZZay+nOKbBUkOe2VNaupQ==", + "requires": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.0" + } + }, + "follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "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-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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==" + }, + "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==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "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" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "github-slugger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "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" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "requires": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "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" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "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==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "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==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "requires": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "requires": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "requires": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "requires": { + "source-map": "~0.6.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==" + }, + "html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + }, + "html-webpack-plugin": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "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-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "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" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + }, + "immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "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==" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "infima": { + "version": "0.2.0-alpha.22", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.22.tgz", + "integrity": "sha512-wKOWp4C1lTFG/h54UWD3Uf6VEsj5qYehM3ZVio3GBzIQuY8B3cTiwG7ZRNoobg+LvdQA21p5BJTugpTLQJLIrA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.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" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "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-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-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==", + "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==" + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + } + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "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-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } + } + } + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "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-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "joi": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz", + "integrity": "sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "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==" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "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" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + }, + "lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "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" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + }, + "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==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "requires": { + "unist-util-remove": "^2.0.0" + } + }, + "mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "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==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "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==" + } + } + }, + "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.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" + }, + "mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "requires": { + "mime-db": "1.50.0" + } + }, + "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==" + }, + "mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + } + }, + "mini-css-extract-plugin": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", + "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "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==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "requires": { + "lodash": "^4.17.21" + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + } + } + }, + "node-releases": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + } + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "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-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "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" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "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" + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz", + "integrity": "sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==", + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "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-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "requires": { + "retry": "^0.12.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==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "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" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "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==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "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==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "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==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "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" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.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==", + "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==", + "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==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "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" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", + "integrity": "sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==", + "requires": { + "nanoid": "^3.1.28", + "picocolors": "^0.2.1", + "source-map-js": "^0.6.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + } + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-unused": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz", + "integrity": "sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==", + "requires": { + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "postcss-merge-idents": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz", + "integrity": "sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==", + "requires": { + "cssnano-util-same-parent": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-reduce-idents": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz", + "integrity": "sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-sort-media-queries": { + "version": "1.31.21", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz", + "integrity": "sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg==", + "requires": { + "postcss": "^7.0.27", + "sort-css-media-queries": "1.5.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "postcss-zindex": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-4.0.1.tgz", + "integrity": "sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" + }, + "prism-react-renderer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz", + "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==", + "requires": {} + }, + "prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "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==" + } + } + }, + "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" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "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==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "requires": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "requires": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + } + }, + "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" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==" + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.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==" + }, + "react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "requires": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", + "requires": { + "prop-types": "^15.5.0" + } + }, + "react-loadable-ssr-addon": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.3.0.tgz", + "integrity": "sha512-E+lnmDakV0k6ut6R2J77vurwCOwTKEwKlHs9S62G8ez+ujecLPcqjt3YAU8M58kIGjp2QjFlZ7F9QWkq/mr6Iw==", + "requires": { + "@babel/runtime": "^7.10.3" + } + }, + "react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "react-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-side-effect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", + "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", + "requires": {} + }, + "react-textarea-autosize": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", + "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "requires": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.0.0", + "use-latest": "^1.0.0" + } + }, + "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" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "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==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "requires": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "requires": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + } + }, + "hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "requires": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remark-admonitions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", + "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", + "requires": { + "rehype-parse": "^6.0.2", + "unified": "^8.4.2", + "unist-util-visit": "^2.0.1" + }, + "dependencies": { + "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==" + }, + "unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + } + } + }, + "remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "requires": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + }, + "remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "requires": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "requires": { + "mdast-squeeze-paragraphs": "^4.0.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=" + }, + "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==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "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==" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "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==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "rtlcss": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.6.2.tgz", + "integrity": "sha512-06LFAr+GAPo+BvaynsXRfoYTJvSaWRyOhURCQ7aeI1MKph9meM222F+Zkt3bDamyHHJuGi3VPtiRkpyswmQbGA==", + "requires": { + "@choojs/findup": "^0.2.1", + "chalk": "^2.4.2", + "mkdirp": "^0.5.1", + "postcss": "^6.0.23", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "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==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "requires": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-handler": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", + "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "requires": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.0.4", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "requires": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "sitemap": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-6.4.0.tgz", + "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==", + "requires": { + "@types/node": "^14.14.28", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "dependencies": { + "@types/node": { + "version": "14.17.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.27.tgz", + "integrity": "sha512-94+Ahf9IcaDuJTle/2b+wzvjmutxXAEXU6O81JHblYXUg2BDG+dnBy7VxIPHKAyEEDHzCMQydTJuWvrE+Aanzw==" + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + }, + "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" + } + } + } + }, + "sort-css-media-queries": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz", + "integrity": "sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw==" + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + }, + "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-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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==" + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "std-env": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.1.tgz", + "integrity": "sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g==", + "requires": { + "ci-info": "^3.1.1" + } + }, + "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==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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" + } + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string_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" + }, + "dependencies": { + "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==" + } + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + } + } + }, + "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-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "supports-color": { + "version": "5.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" + } + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "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==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "requires": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "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==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "ts-essentials": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", + "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "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==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "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==" + }, + "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==", + "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==" + }, + "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==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "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==" + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + }, + "unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + }, + "unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + }, + "unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.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": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "use-composed-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", + "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", + "requires": { + "ts-essentials": "^2.0.3" + } + }, + "use-isomorphic-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", + "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", + "requires": {} + }, + "use-latest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", + "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "requires": { + "use-isomorphic-layout-effect": "^1.0.0" + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + } + } + }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "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==" + }, + "wait-on": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", + "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "requires": { + "axios": "^0.21.1", + "joi": "^17.3.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^6.6.3" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "optional": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "optional": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "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==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "requires": { + "duplexer": "^0.1.2" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + } + } + }, + "webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "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" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "webpackbar": { + "version": "5.0.0-3", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.0-3.tgz", + "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==", + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.1.0", + "consola": "^2.15.0", + "figures": "^3.2.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^7.0.0" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "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": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "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": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "requires": {} + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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==", + "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==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "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==" + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } + } +} diff --git a/docs/versioned_docs/version-2.4.0/widgets/pagination.md b/docs/versioned_docs/version-2.4.0/widgets/pagination.md new file mode 100644 index 0000000000..2ee0003cc5 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/pagination.md @@ -0,0 +1,69 @@ +--- +id: pagination +title: Pagination +--- +# Pagination + +Pagination enables the user to select a specific page from a range of pages. It is used to separate the content into discrete pages. + +:::tip +You can club pagination widget with the List View widget. +::: + +
    + +ToolJet - Widget Reference - Pagination + +
    + +## Properties + +### Number of pages + +You can use this to predefined the total number of pages. It is calculated by dividing the length of the data array that will be passed, by the data limit which is the number of posts we will show on each page. + +### Default page index +It is used to set and display the default page index when the app initially loads. You can also put a conditional logic to set its value as per your use case. + +## Event + +### On Page Change + +This event is triggered whenever the user switches to another page index. You can explore various actions associated with this event as per app logic. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Pagination + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + diff --git a/docs/versioned_docs/version-2.4.0/widgets/password-input.md b/docs/versioned_docs/version-2.4.0/widgets/password-input.md new file mode 100644 index 0000000000..019ec8fae3 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/password-input.md @@ -0,0 +1,82 @@ +--- +id: password-input +title: Password Input +--- +# Password Input + +A Password Input widget provides a way for the users to securely enter a password. The Password Input is a one-line plain text editor in which the text is obscured so that it cannot be read, by replacing each character with an asterisk ("*") symbol. + +## How To Use Password Input Widget + + + +## Properties + +### Placeholder + +It specifies a hint that describes the expected value. + +## Validation + +### Regex + +Use this field to enter a Regular Expression that will validate the password constraints. +### Min length + +Enter the number for a minimum length of password allowed. + +### Max length + +Enter the number for the maximum length of password allowed. + +### Custom validation + +If the condition is true, the validation passes, otherwise return a string that should be displayed as the error message. For example: `{{components.passwordInput1.value === 'something' ? true: 'value should be something'}}` + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Password input + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Border radius + +Add a border radius to the number input widget using this property. It accepts any numerical value from `0` to `100`. + +### Border color + +Add color to the border of the number input component using this property. Enter the hex color code or choose a color from the color picker. + +### Background color + +You can change the background color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/pdf.md b/docs/versioned_docs/version-2.4.0/widgets/pdf.md new file mode 100644 index 0000000000..bc665697fe --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/pdf.md @@ -0,0 +1,56 @@ +--- +id: pdf +title: PDF +--- + +# PDF + +PDF widget can be used to embed the PDF file either by URL or as a Base64 encoded. + +## Properties + +### File URL + +The URL of the PDF file on the web. `data:application/pdf;base64,` format is supported and the input needs to be prefixed with `data:application/pdf;base64,` + +### Scale page to width + +It can be toggled to adjust the PDF content to fit the width or height of the component + +### Show page controls + +By default, page number, previous & next button is displayed while hovering the PDF file. It can be toggled on or off. + +### Show the download + +The `Download` button on the PDF component allows you to download the pdf file. By default, Show the download button is enabled. Toggle it off to remove the `Download` button from PDF component, you can also click on the `Fx` button to set the values `{{true}}` or `{{false}}` dynamically. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - PDF + +
    + +## Layout + +| Layout | description | Expected value | +| --------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | +| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/qr-scanner.md b/docs/versioned_docs/version-2.4.0/widgets/qr-scanner.md new file mode 100644 index 0000000000..edab5ade23 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/qr-scanner.md @@ -0,0 +1,71 @@ +--- +id: qr-scanner +title: QR Scanner +--- +# QR Scanner +Scan QR codes using device camera and hold the data they carry. + +
    + +ToolJet - Widget Reference - QR Scanner + +
    + +:::note Known Issue +You might have to stick to the Safari browser in IOS as camera access is restricted for third-party browsers. +::: + +## Exposed variables +### lastDetectedValue + +This variable holds the data contained in the last QR code scanned by the widget. To fetch the data use `{{components.qrscanner1.lastDetectedValue}}`. + +## Events +### onDetect + +This event is fired whenever the widget successfully scans a QR code. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +:::caution Debugging tip + +Browser camera APIs restrict this widget to only work in either `localhost` or `https`. + +So if you're testing it out, be sure to either use `localhost` or `https`. +::: + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the +mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. +Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - QR Scanner + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. diff --git a/docs/versioned_docs/version-2.4.0/widgets/radio-button.md b/docs/versioned_docs/version-2.4.0/widgets/radio-button.md new file mode 100644 index 0000000000..9de2d08c16 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/radio-button.md @@ -0,0 +1,101 @@ +--- +id: radio-button +title: Radio Button +--- +# Radio Button + +Radio button widget can be used to select one option from a group of options. + +## How To Use Radio button Widget + + + +:::tip +Radio buttons are preferred when the list of options is less than six, and all the options can be displayed at once. +::: + +:::info +For more than six options, consider using **[Dropdown](/docs/widgets/dropdown)** widget. +::: + +## Event + +### On select + +This event is triggered when an option is clicked. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +### Label + +The text is to be used as the label for the radio button. This field expects a `String` value. + +### Default value + +The value of the default option. + +### Option values + +List of values for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.value)}}` or populate it with sample values `{{[true, false]}}` + +### Option labels + +List of labels for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.label)}}` or populate it with sample values `{{["yes", "no"]}}` + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Radio button + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Text color + +Change the color of the text in the widget by providing the `Hex color code` or by choosing the color of your choice from the color picker. + +### Active color + +Change the color of active radio button by providing the `Hex color code` or by choosing the color of your choice from the color picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +## Example + +
    + +ToolJet - Widget Reference - Radio button + +
    + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| selectOption | Select an option from the radio buttons. | `option` eg: `component.radiobutton1.selectOption('one')` | \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/range-slider.md b/docs/versioned_docs/version-2.4.0/widgets/range-slider.md new file mode 100644 index 0000000000..5c58220496 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/range-slider.md @@ -0,0 +1,76 @@ +--- +id: range-slider +title: Range Slider +--- +# Range Slider + +Range sliders are widely used across different UIs. One of the main purposes is to filter, explore all the related content and available in the control and settings options. + +:::tip +Range Sliders have "Two handles" option which allows user to select within a range. +::: + +
    + +ToolJet - Widget Reference - Range Slider + +
    + +## Properties + +### Minimum value + +Set the minimum value for the slider. This field accepts any numerical value. + +### Maximum value + +Set the maximum value for the slider. This field accepts any numerical value. + +### Value + +Set the default value when the widget loads. This can be used to pre-fill the value based on your data and requirements. + +### Two handles + +The slider will now have 2 dragging handles. It is used to define a range of values versus a single given value. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Range Slider + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Line color + +Enter the hexcode to set the default color for slider's track. +### Handle color + +Enter the hexcode to set the color for slider's handler. +### Track color + +Enter the hexcode to set the color for slider's active portion on the track. +### Visibility + +Set the visivlity of the slider programmatically. The default value is `{{true}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/rich-text-editor.md b/docs/versioned_docs/version-2.4.0/widgets/rich-text-editor.md new file mode 100644 index 0000000000..2267259807 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/rich-text-editor.md @@ -0,0 +1,56 @@ +--- +id: rich-text-editor +title: Rich Text Editor +--- +# Rich Text Editor + +Rich Text Editor can be used to enter and edit the text in HTML format. +It should be preferred for blog posts, forum posts or notes sections. The text is to be used as the label for the radio button. + +
    + +ToolJet - Widget Reference - Rich Text Editor + +
    + +## Properties + +### Placeholder + +It specifies a hint that describes the expected value. + +### Default Value + +The default value that the widget will hold when the app is loaded. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference -Rich Text Editor + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. diff --git a/docs/versioned_docs/version-2.4.0/widgets/spinner.md b/docs/versioned_docs/version-2.4.0/widgets/spinner.md new file mode 100644 index 0000000000..8557673342 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/spinner.md @@ -0,0 +1,49 @@ +--- +id: spinner +title: Spinner +--- +# Spinner + +Spinner widget can be used to provide a visual indication that an action is in progress by awaiting a change. + +
    + +ToolJet - Widget Reference - Spinner + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Spinner + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Color + +Change the color of the Spinner by entering the `Hex color code` or choosing a color of your choice from the color-picker. + +### Size + +Change the size of the Spinner by selecting options from the dropdown. It has small and large sizes available. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/star-rating.md b/docs/versioned_docs/version-2.4.0/widgets/star-rating.md new file mode 100644 index 0000000000..d204438589 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/star-rating.md @@ -0,0 +1,85 @@ +--- +id: star-rating +title: Star rating +--- +# Star rating + +Star rating widget can be used to display as well as input ratings. The widget supports half stars, and the number of stars can be set too. + +
    + +ToolJet - Widget Reference - Star rating + +
    + +## Events + +### On Change + +This event is triggered when a star is clicked. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Properties + +### Label + +The text to be used as the label for the star rating. This field expects a `String` value. + +### Number of stars + +Initial number of stars in the list on initial load. `default: 5`. This field expects an integer value. + +### Default no of selected stars + +This property specifies the default count of stars that are selected on the initial load. `default: 5` (integer). This field expects an integer value. + +### Enable half star + +Toggle `on` to allow selection of half stars. `default: false` (bool). Click on `Fx` to programmatically define the value `{{true}}` or `{{false}}`. + +### Tooltips + +This is used for displaying informative tooltips on each star, and it is mapped to the index of the star. `default: []` (array of strings ). Ex: `{{["bad", "okay", "good", "best"]}}` + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Star rating + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Star Color + +Display color of the star. `default: #ffb400` (color hex). Change color by providing `Hex color code` or choosing one from the picker. + +### Label color + +Change the color of label in widget by providing `Hex color code` or choosing one from the picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. diff --git a/docs/versioned_docs/version-2.4.0/widgets/statistics.md b/docs/versioned_docs/version-2.4.0/widgets/statistics.md new file mode 100644 index 0000000000..b2fa668f13 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/statistics.md @@ -0,0 +1,93 @@ +--- +id: statistics +title: Statistics +--- + +# Statistics + +Statistics can be used to display different statistical information. + +
    + +ToolJet - Widget Reference - Statistics + +
    + +## Properties + +### Primary value label + +This property lets you add and remove primary value label. + +### Primary value + +This property lets you add and remove primary value,the actual amount can be represented here. + +### Hide secondary value + +This property lets you show/hide the secondary value from the statistics component. By default, this property is disabled. Toggle it on to hide the secondary value, you can also click on the `Fx` button next to it to dynamically set the value to `{{true}}` or `{{false}}`. + +### Secondary value label + +This property lets you add and remove secondary value label. + +### Secondary value + +This property lets you add and remove secondary value,the change in value can be represented here. + +### Secondary sign display + +This property lets you add and secondary sign either positive or negative,can be used to represent positive(increase) or negative(decrease) movement.Default value is positive. + +### Loading state + +Loading state can be used to show a spinner on the statistics. Loading state is commonly used with `isLoading` property of the queries to show a loading status while a query is being run. Switch the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}`. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Statistics + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Primary Label Colour + +You can change the primary label color by entering the Hex color code or choosing a color of your choice from the color picker. + +### Primary Text Colour + +You can change the primary text color of the primary label by entering the Hex color code or choosing a color of your choice from the color picker. + +### Secondary Label Colour + +You can change the secondary label color of the primary label by entering the Hex color code or choosing a color of your choice from the color picker. + +### Secondary Text Colour + +You can change the secondary text color of the primary label by entering the Hex color code or choosing a color of your choice from the color picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/steps.md b/docs/versioned_docs/version-2.4.0/widgets/steps.md new file mode 100644 index 0000000000..5c486e0ecb --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/steps.md @@ -0,0 +1,92 @@ +--- +id: steps +title: Steps +--- +# Steps + +Steps are used to guide users through complex processes, making them easier and more intuitive. + +
    + +ToolJet - Widget Reference - Steps + +
    + +## Properties + +
    + +ToolJet - Widget Reference - Steps + +
    + +### Steps + +This property lets you add and the steps. Every object represents a step. + +```json +{{ + [ + { name: 'step 1', tooltip: 'some tooltip', id: 1}, + { name: 'step 2', tooltip: 'some tooltip', id: 2}, + { name: 'step 3', tooltip: 'some tooltip', id: 3}, + { name: 'step 4', tooltip: 'some tooltip', id: 4}, + { name: 'step 5', tooltip: 'some tooltip', id: 5} + ] +}} +``` + +### Current step + +This property lets you select the current step you want to be highlighted. + +### Steps selectable + +This property when disabled will disable selection of steps. + +## Events +### On select +This event is fired whenever the user selects any step. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Steps + +
    + +## Layout +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Theme + +You can change the theme of widget by selecting available themes from dropdown. + +### Colour + +You can change the color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. + +### Text Colour + +You can change the text color of the widget by entering the Hex color code or choosing a color of your choice from the color picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/svg-image.md b/docs/versioned_docs/version-2.4.0/widgets/svg-image.md new file mode 100644 index 0000000000..76500c1eb8 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/svg-image.md @@ -0,0 +1,59 @@ +--- +id: svg-image +title: Svg Image +--- +# SVG Image + +It is used to render vector images. We can display images, icons, texts using this widget. SVGs are vector images and therefore are usually much smaller in file-size than bitmap-based images. + +Developers prefer having SVG **(Scalable Vector Graphics)** files as they are scalable and will render pixel-perfect at any resolution whereas JPEGs, PNGs and GIFs will not. + +
    + +ToolJet - Widget Reference - SVG + +
    + +## Properties + +### SVG Data + +Enter the SVG data of the image to display it on the widget. + +:::tip +Refer to the resources where SVG files are downloaded for free. You copy-paste the below data in this field to see a new icon being rendered. +::: + +``` + +``` + + +## General + +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - SVG + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/table.md b/docs/versioned_docs/version-2.4.0/widgets/table.md new file mode 100644 index 0000000000..15b05f6fbd --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/table.md @@ -0,0 +1,329 @@ +--- +id: table +title: Table +--- +# Table + +Tables can be used for both displaying and editing data. + + + +## Table data + +
    + +ToolJet - Widget Reference - Table + +
    + +Array of objects to be displayed on the table. It is commonly used to display data from query (`{{queries.restapi1.data}}`). Table data expects an array of objects, example: + +``` +{{[{ id: 1, name: 'Sarah', email: 'sarah@example.com'}]}} +``` + +The table component will **auto-generate all the columns** as soon as the expected table data(array of objects) is provided. + +## Columns + +
    + +ToolJet - Widget Reference - Table + +
    + +### Cell data types + +You can define the cell types as per your table's data source using the following: + +- String | Default: It is used to render the data for cell types: text or textarea, +- Number: This cell type will only expect the numerical values and can be sorted in ascending or descending order +- Badge: It is a labeling component used to display data with badges for e.g status of a shipment +- Multiple badges: Similar to badge, used to display multiple data badges in the form of array of objects, +- Tags: Used to display an array of objects in the form of tags, e.g status, levels, steps +- Dropdown: When data is in the form of an array of options to be selected, e.g select priority +- Radio: Used to make a selection from a group of options, e.g select your salary-range +- Multiselect: Similar to dropdown but to collect multiple user inputs from a list of options, +- Toggle switch: Allows a user to change a setting between two states, e.g select between Yes/No, +- Date picker: Allowing users to display and select dates, e.g delivery date +- Image: This cell type expects the URL of image and will display the image in the cell. It also has the option to style the image. + +:::info +Check this **[how-to guide](/docs/how-to/access-cellvalue-rowdata)** on dynamically change the color of text in a row and column in the table. +::: + +### Displaying Data + +The data object should be an array of objects. Table columns can be added, removed, rearranged from the inspector. `key` property is the accessor key used to get data from a single element of a table data object. For example: + +If the table data is: + +```js +[ + { + "review": { + "title": "An app review" + }, + "user": { + "name": "sam", + "email": "sam@example.com" + }, + } +] +``` + +To display email column, the key for the column should be `user.email`. + + +### Saving data +Enable `editable` property of a column to make the cells editable. If a data type is not selected, `string` is selected as the data type. + +:::tip +You can programatically **enable**/**disable** the make **editable** field in the columns property by clicking on the **Fx** button. +::: + +If the data in a cell is changed, `changeSet` property of the table object will have the index of the row and the field that changed. +For example, if the name field of second row of example in the 'Displaying Data' section is changed, `changeSet` will look like this: + +```js +{ + 2: { + "name": "new name" + } +} +``` + +Along with `changeSet`, `dataUpdates` property will also be changed when the value of a cell changes. `dataUpdates` will have the whole data of the changed index from the table data. `dataUpdates` will look like this for our example: + +```js +[{ + "review": { + "title": "An app review" + }, + "user": { + "name": "new name", + "email": "sam@example.com" + }, +}] +``` + +If the data of a cell is changed, "save changes" button will be shown at the bottom of the table. This button when clicked will trigger the `Bulk update query` event. This event can be used to run a query to update the data on your data source. + +### Use dynamic column + +Enabling the **Use dynamic column** toggle will allow users to set the **Column data** where users can link the column data dynamically from a query. + +The **column data** field expects a JSON value: +```json +{ + "name":"Name", + "columnType":"string", + "key":"first_name", + "cellBackgroundColor":"#000", + "textColor":"#fff", + "isEditable":true, + "regex":"", + "maxLength":10, + "minLength":5, + "customRule":"" +} +``` + +
    + +ToolJet - Widget Reference - Table + +
    + +## Validation + +Under column properties, expand the detailed view of a column type to access a toggle button called `make editable`. You can toggle it `ON` to apply the validations for each column respectively using the following. + +### Regex + +Use this field to enter a Regular Expression that will validate the password constraints. +### Min length + +Enter the number for a minimum length of password allowed. + +### Max length + +Enter the number for the maximum length of password allowed. + +### Custom validation + +If the condition is true, the validation passes, otherwise return a string that should be displayed as the error message. For example: `{{components.passwordInput1.value === 'something' ? true: 'value should be something'}}` + +## Action buttons + +
    + +ToolJet - Widget Reference - Table + +
    + +Action buttons will be displayed as the last column of the table. The styles of these buttons can be customised and `on click` actions can be configured. when clicked, `selectedRow` property of the table will have the table data of the row. + +| Property | Description | +| -------- | ------------ | +| Button text | Set the text that you want to be displayed on the action button. | +| Button position | Set the button position to the left or right | +| Background color (Action Button) | Background color of the action button. | +| Text color (Action Button) | Color of button-text of the action button. | +| Disable Action Button | Toggle on to disable the action button. You can programmatically set its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the action button will be disabled and becomes non-functional. By default, its value is set to `{{false}}`. | + +## Options + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +### Server-side pagination + +Server-side pagination can be used to run a query whenever the page is changed. Go to events section of the inspector and change the action for `on page changed` event. Number of records per page needs to be handled in your query. If server-side pagination is enabled, `pageIndex` property will be exposed on the table object, this property will have the current page index. `pageIndex` can be used to query the next set of results when page is changed. + +When Server-side pagination is enabled, you'll be able to set three other table properties: +- **Enable previous page button**: When server-side pagination is enabled, this button is enabled by default. Toggle this off to disable the previous page button from the table. +- **Enable next page button**: When server-side pagination is enabled, this button is enabled by default. Toggle this off to disable the next page button from the table. +- **Total records server side**: Set a numerical value to display particular number of records. + +### Client-side pagination + +Client-side pagination is enabled by default. When the client-side pagination is enabled(`{{true}}`), another property **Number of rows per page** will be shown that can be used to set the number of records per page. By default, the value is set to 10 and if it is disabled(`{{false}}`) then it will show all the records in the single page. + +### Server-side search + +If server-side search is enabled, `on search` event is fired after the content of `searchText` property is changed. `searchText` can be used to run a specific query to search for the records in your data source. + +### Show download button + +Show or hide download button at the Table footer. + +### Hide/Show columns + +Table header has an option(Eye icon) to show/hide one or many columns on the table. + +### Show filter button + +Show or hide filter button at the Table header. The following filters are available: +- **contains** +- **does not contain** +- **matches** +- **does not match** +- **equals** +- **does not equal to** +- **is empty** +- **is not empty** +- **greater than** +- **greater than or equal to** +- **less than** +- **less than or equal to** + + +### Show update buttons + +It's enabled by default. Table footer will show two update buttons **Save changes** & **Discard changes** whenever a cell is edited. Toggle `off` to hide update buttons. + +### Bulk selection + +To let the user select one or more rows from the current page of a table, enable 'Bulk selection' from the inspector. The values of selected rows will be exposed as `selectedRows`. + +### Highlight selected row + +Enable this option to have the last selected(clicked on) row to be highlighted. + +### Disable sorting + +Enable this option to lock the sorting of columns when clicked on column name. + +### Server-side sort +When Server-side sort is enabled, clicking on the column headers will not automatically sort the table, instead, the `Sort applied` event will be fired and the applied sorting will be exposed as `sortApplied`. You can use this data to run any query that feeds data to the table in a manner that reflects the sorting applied. + +### Server-side filter +When Server-side filter is enabled, applying filters will not automatically filter the table, instead, the `Filter changed` event will be fired and the applied filters will be exposed as `filters`. You can use this data to run any query that feeds data to the table in a manner that reflects the filters applied. + +### Show search box + +It can be used to show or hide Table Search box. Client-side search is enabled by default and server-side search can be enabled from the events section of the inspector. Whenever the search text is changed, the `searchText` property of the table component is updated. If server-side search is enabled, `on search` event is fired after the content of `searchText` property is changed. `searchText` can be used to run a specific query to search for the records in your data source. + +If you don't wish to use the search feature altogether, you can disable it from the inspector. + +### Loading state (Boolean) + +Loading state shows a loading skeleton for the table. This property can be used to show a loading status on the table while data is being loaded. `isLoading` property of a query can be used to get the status of a query. + +## Events + +- **[Row hovered](#row-hovered)** +- **[Row clicked](#row-clicked)** +- **[Save changes](#save-changes)** +- **[Cancel changes](#cancel-changes)** +- **[Page changed](#page-changed)** +- **[Search](#search)** +- **[Sort applied](#sort-applied)** +- **[Cell value changed](#cell-value-changed)** +- **[Filter changed](#filter-changed)** + +### Row hovered + +This event is triggered when the mouse pointer is moved over a row in the table. The `hoveredRowId` exposed variable of the table will include the id of the latest hovered row and `hoveredRow` property of the table will have the data of the hovered row in the object format. + +### Row clicked + +This event is triggered when a table row is clicked. The `selectedRowId` exposed variable of the table will include the id of the selected row and the `selectedRow` property of the table object will have the table data of the selected row. + +### Save changes + +If any cell of the table is edited, the `save changes` button appears at the footer of the table. Save changes event is triggered when this button is clicked. + +### Cancel changes + +If any cell of the table is edited, the `Discard changes` button appears at the footer of the table. Cancel changes event is triggered when this button is clicked. + +### Page changed + +If server-side pagination is enabled, this event is fired when the current page is changed. This event is triggered after updating the `pageIndex` variable. + +### Search + +This event is triggered when a text is entered to the search input box of the table. `searchText` variable is updated before triggering this event. + +### Sort applied + +This event is triggered when the column name header is clicked to apply sorting in `asc` or `desc`. The `sortApplied` variable is updated with an object having `column` and `direction` values. + +### Cell value changed + +If any cell of the table is edited, the `cell value changed` event is triggered. + +### Filter changed + +This event is triggered when filter is added, removed, or updated from the filter section of the table. `filters` property of the table is updated to reflect the status of filters applied. The objects will have properties: `condition`, `value`, and `column`. + +## Exposed variables + +| variable | description | +| ----------- | ----------- | +| currentData | Data that is currently being displayed by the table ( including edits if any ) | +| currentPageData | Data that is displayed on the current page if pagination is enabled ( including edits if any ) | +| pageIndex | Index of the current page, starting from 1 +| changeSet | Object with row number as the key and object of edited fields and their values as the value | +| dataUpdates | Just like changeSet but includes the data of the entire row | +| selectedRow | The data of the row that was last clicked. `selectedRow` also changes when an action button is clicked | +| searchText | The value of the search field if server-side pagination is enabled | + +## Styles + +| Style | Description | +| ----------- | ----------- | +| Text color | Change the color of the text in table by providing `hex color code` or choosing one from the picker | +| Action button radius | This field can be used to give a radius to all action buttons. The default value is `0` | +| Table type | Select a type of table from the dropdown. | +| Cell size | This decides the size of table cells. You can choose between a `Compact` size for table cells or a `Spacious` size | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | Toggle on to lock the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the button. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/tabs.md b/docs/versioned_docs/version-2.4.0/widgets/tabs.md new file mode 100644 index 0000000000..0bfa2a8a2a --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/tabs.md @@ -0,0 +1,116 @@ +--- +id: tabs +title: Tabs +--- + +# Tabs + +A Tabs widget contains a number of defined containers that can be navigated through the tabs. Each tab acts as a [container](/docs/widgets/container/) that can have different widgets placed inside it. + +
    + +ToolJet - Widget Reference - Tabs + +
    + +## How To Use Tabs Widget + + + +## Properties + +### Tabs + +This property lets you add and remove containers from the tabs widget. Each container in the tab has its unique `id` , `title` and `disabled` for disabling individual tabs . This field expects an array of objects. + +```js +{{[ + { title: 'Home', id: '0' }, + { title: 'Profile', id: '1',disabled:'true' }, + { title: 'Settings', id: '2' } +]}} +``` + +#### Adding background color to Tabs + +You can specify the different color for each tab using the `backgroundColor` property and use hex color code or color name as the value. + +```js +{{[ + { title: 'Home', id: '0', backgroundColor: '#81D4FA' }, + { title: 'Profile', id: '1', backgroundColor: 'blue' }, + { title: 'Settings', id: '2', backgroundColor: '#ecf0f1'} + ]}} +``` + +
    + +Tabs properties + +
    + +### Default tab + +This property selects the container in the tab which matches the corresponding `id`. By default, the value is set to `0`. + +### Hide tab + +It allows you to hide all the tab titles defined in the Tabs property above. It accepts boolean values which can also be set using the toggle option or programmatically by clicking on the FX button. + +### Render only active tab + +This property is enabled by default. When enabled, only the active tab will be rendered and when disabled, all the tabs in the component will be rendered. + +## Events + +
    + +irtable record + +
    + +### On tab switch + +This event is triggered when the tab is switched. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| setTab | Set current tab. | `id` | + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Highlight Color + +You can change the highlight color of the selected tab by entering the Hex color code or choosing a color of your choice from the color picker. + +### Tab width + +Tab width can be set as **auto** or **equally split**. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/tags.md b/docs/versioned_docs/version-2.4.0/widgets/tags.md new file mode 100644 index 0000000000..ea01906c69 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/tags.md @@ -0,0 +1,60 @@ +--- +id: tags +title: Tags +--- +# Tags + +Tags widget can be used to show array of data as tags. + +
    + +ToolJet - Widget Reference - Tags + +
    + +## Properties + +### Tags + +It can be used to set array of tags. It must be an array of objects like this: + +```js +{{ + [ + { title: 'success', color: '#2fb344', textColor: '#fff' }, + { title: 'info', color: '#206bc4', textColor: '#fff' }, + { title: 'warning', color: '#f59f00', textColor: '#fff' }, + { title: 'danger', color: '#d63939', textColor: '#fff' } + ] +}} +``` + +Each object should contain a title, color code of a particular tag, and also a text color. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Tags + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/text-input.md b/docs/versioned_docs/version-2.4.0/widgets/text-input.md new file mode 100644 index 0000000000..17bf8d9003 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/text-input.md @@ -0,0 +1,111 @@ +--- +id: text-input +title: Text Input +--- +# Text Input + +Text Input widget lets users enter and edit text. + +:::tip +The Text Input should be preferred when user input is a single line of text. +::: + +## How To Use Text Input Widget + + + +## Properties + +### Default value + +The default value that the widget will hold when the app is loaded. + +### Placeholder + +It specifies a hint that describes the expected value. + +## Events + +
    + +ToolJet - Widget Reference - Text input + +
    + +### On change +This event fires whenever the user types something on the text input. + +### On Enter Pressed +This event fires whenever the user presses the enter button on keyboard after entering some text on text input component. + +### On focus +This event fires whenever the user clicks inside the text input component. + +### On blur +This event fires whenever the user clicks outside the text input component. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get detailed information about all the **Actions**. +::: + +## Validation + +### Regex + +Use this field to enter a Regular Expression that will validate the password constraints. + +### Min length + +Enter the number for a minimum length of password allowed. + +### Max length + +Enter the number for the maximum length of password allowed. + +### Custom validation + +If the condition is true, the validation passes, otherwise returns a string that should be displayed as the error message. For example: `{{components.passwordInput1.value === 'something' ? true: 'value should be something'}}`. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Text input + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Text Color +Use this property to set the color of the text inside the text input component. You can select the color from the color picker or set the value using Hex color code. + +### Border color + +Add a color to the border of the text-input component using this property. You can select the color from the color picker or set the value using Hex color code. + +### Border Radius +Use this property to modify the border radius of the widget. The field expects only numerical values from `1` to `100`, and default is `0`. + +### Visibility +It is to control the visibility of the widget. If `{{false}}` the widget will not be visible after the app gets deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Disable +This property only accepts boolean values. If set to `{{true}}`, the widget will lock and become non-functional. By default, its value is set to `{{false}}`. + +:::info +Check the **component specific actions** available for this component **[here](/docs/actions/control-component)**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/text.md b/docs/versioned_docs/version-2.4.0/widgets/text.md new file mode 100644 index 0000000000..8b526f6269 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/text.md @@ -0,0 +1,77 @@ +--- +id: text +title: Text +--- +# Text + +Text widget can be used to display text. + +:::info +Users cannot enter and edit text. +::: + +## How To Use Text Widget + + + +## Properties + +### Text + +This property sets the content/text inside the Text widget. Refer your query data with dynamic variables `{{queries.datasource.data.text}}` or populate it with sample values `Text goes here !`. + +### Show loading state + +Toggle `on` or `off` to show or hide the loading state. You can also click on the `Fx` next to it to set the value `{{true}}` and `{{false}}` dynamically. Shows a loading status if the value is `true`. This property is often used with the `isLoading` property of queries so that the table shows a spinner while the query is being run. Default value is `false`. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Text + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +| Style | Description | +| ----------- | ----------- | +| Font Weight | You can change the font weight of the text in following ways: **normal (default), bold, lighter, bolder** | +| Text Decoration | You can change the text decoration in following ways : **none(default), overline, line-through, underline, overline underline** | +| Text Transformation | You can transform the text in following ways: **none (default), uppercase, lowercase, capitalize** | +| Font Style | You can change the font style in following ways: **normal(default), italic, oblique** | +| Line Height | You can change the line height by providing number as input (example - 1.5) | +| Text Indent | You can change the text indent by providing the number as input (example - 10) | +| Letter Spacing | You can change the letter spacing by providing the number as input (example - 2) | +| Word Spacing | You can change the letter spacing by providing the number as input (example - 2) | +| Font Variant | You can change the font variant of the text in the following ways: **normal (default), small-caps, initial, inherit** | +| Text Size | By default, the text size is set to 14. You can enter any value from 1-100 to set custom text size. | +| Background Color | You can change the background color of the text component by entering the Hex color code or choosing a color of your choice from the color picker. | +| Text Color | You can change the color of the text by entering the Hex color code or choosing a color of your choice from the color picker. | +| Align Text | You can align the text inside the widget in following ways: left, right, center, justified | + + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/textarea.md b/docs/versioned_docs/version-2.4.0/widgets/textarea.md new file mode 100644 index 0000000000..8ff2513929 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/textarea.md @@ -0,0 +1,70 @@ +--- +id: textarea +title: Textarea +--- +# Textarea + +Textarea widgets let users enter and edit just text like [Text Input](/docs/widgets/text-input) widget. + +:::tip +Textarea should be preferred over [Text Input](/docs/widgets/text-input) when user input is more than one sentence. +::: + +## How To Use Textarea Widget + + + +## Properties + +### Default value + +This property is used for setting the initial value in the textarea on the initial load. This field expects a `String` value. + +### Placeholder + +It specifies a hint that describes the expected value. This field expects a `String` value. + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Text area + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Border Radius + +Use this property to modify the border radius of the text area widget. The field expects only numerical value from `1` to `100`, default is `0`. +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +## Actions + +| Action | Description | Properties | +| ----------- | ----------- | ------------------ | +| setText | Set the text. | `text` | +| clear | Clear the text. | | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/timeline.md b/docs/versioned_docs/version-2.4.0/widgets/timeline.md new file mode 100644 index 0000000000..f2d2bdd7e2 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/timeline.md @@ -0,0 +1,63 @@ +--- +id: timeline +title: Timeline +--- +# Timeline + +Timeline widget can be used to do a visual representation of a sequence of events + +
    + +ToolJet - Widget Reference - Timeline + +
    + +## Properties + +### Timeline data + +**Data requirements:** The data needs to be an array of objects and each object should have `title`, `subTitle`, `iconBackgroundColor` and `date` keys. + +**Example:** +```json +[ + { "title": "Product Launched", "subTitle": "First version of our product released to public", "date": "20/10/2021", "iconBackgroundColor": "#4d72fa"}, + { "title": "First Signup", "subTitle": "Congratulations! We got our first signup", "date": "22/10/2021", "iconBackgroundColor": "#4d72fa"}, + { "title": "First Payment", "subTitle": "Hurray! We got our first payment", "date": "01/11/2021", "iconBackgroundColor": "#4d72fa"} +] +``` + + +### Hide date + +Hide date can be used to hide the date time or Left Hand Side of the timeline widget + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Timeline + +
    + +## Layout + +| Layout| description| Expected value| +| ----- | --------- | ------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +## Styles + +| Style | Description | +| ----------- | ----------- | +| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/timer.md b/docs/versioned_docs/version-2.4.0/widgets/timer.md new file mode 100644 index 0000000000..18ba85b865 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/timer.md @@ -0,0 +1,80 @@ +--- +id: timer +title: Timer +--- +# Timer + +Timer widget lets users to count timer both upward and downward + +
    + +ToolJet - Widget Reference - Timer + +
    + +## Properties + +### Default value + +It specifies the initial value of timer. Format is: `HH.mm.ss.SS`. + +### Timer type + +It specifies If its a upward or downward counter. Select `Count Up` or `Count Down` from the dropdown or you can click on `Fx` to programmatically define the values `countUp` or `countDown`. + +## Events + +### On start +This event is fired when user clicks on start button. + +### On resume +This event is fired when user clicks on resume button. + +### On pause +This event is fired when user clicks on pause button. + +### On count down finish +This event is fired when the count down timer reaches zero. + +### On reset +This event is fired when user clicks on reset button. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Timer + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/toggle-switch.md b/docs/versioned_docs/version-2.4.0/widgets/toggle-switch.md new file mode 100644 index 0000000000..56e2ed715d --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/toggle-switch.md @@ -0,0 +1,76 @@ +--- +id: toggle-switch +title: Toggle Switch +--- +# Toggle Switch + +The toggle switch widget allows the user to change a setting between two states. + +The Toggle switch widget should be used if we want to make a binary choice, such as turning something **on or off** or **enable or disable**. + +## How To Use Toggle Switch Widget + + + +## Properties + +### Label + +This property can be used to set a label for the switch. Default Label: **Toggle label** + +### Default status + +The property is used to set the default status (enabled or disabled) of the toggle switch component when the app is loaded. By default, the checkbox component is set to `{{false}}`/disabled. + +## Event + +### On change +This event is triggered whenever the toggle switch is clicked. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Toggle switch + +
    + +## Layout + +### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. +### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +### Text color + +Change the color of the text in the widget by providig the `Hex color code` or choosing a color from the picker. + +### Toggle switch color + +Change the color of the toggle switch in the widget by providig the `Hex color code` or choosing a color from the picker. + +### Visibility + +This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. + +### Disable + +This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-2.4.0/widgets/tree-select.md b/docs/versioned_docs/version-2.4.0/widgets/tree-select.md new file mode 100644 index 0000000000..64b72798a1 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/tree-select.md @@ -0,0 +1,157 @@ +--- +id: tree-select +title: Tree Select +--- + +# Tree Select + +Tree Select widget is a group checkboxes in a TreeView which can be expanded or collapsed. + +
    + +ToolJet - Widget Reference - Tree Select + +
    + +## Properties + +### Title + +The text is to be used as the title for the tree select. This field expects a `String` input. + +### Structure + +**Data requirements:** The structure needs to be an array of objects and each object should have `label` and `value` keys. If you wish to have `children` under any of the checkbox, then `children` array needs to be passed with `label` and `value` keys. + +**Example:** + +```json +[ + { + "label": "Asia", + "value": "asia", + "children": [ + { + "label": "China", + "value": "china", + "children": [ + { "label": "Beijing", "value": "beijing" }, + { "label": "Shanghai", "value": "shanghai" } + ] + }, + { "label": "Japan", "value": "japan" }, + { + "label": "India", + "value": "india", + "children": [ + { "label": "Delhi", "value": "delhi" }, + { "label": "Mumbai", "value": "mumbai" }, + { "label": "Bengaluru", "value": "bengaluru" } + ] + } + ] + }, + { + "label": "Europe", + "value": "europe", + "children": [ + { "label": "France", "value": "france" }, + { "label": "Spain", "value": "spain" }, + { "label": "England", "value": "england" } + ] + }, + { "label": "Africa", "value": "africa" } +] +``` + +:::info +Note: The `value` should be unique throughout the structure array. +::: + +### Checked Values + +Checked values is an array of values passed to select the checkboxes by default. + +**Example:** + +```json +["asia", "spain"] +``` + +### Expanded Values + +Similar to checked values, expanded values is an array of values passed to expand the node by default. + +**Example:** + +```json +["asia"] +``` + +### Events + +
    + +ToolJet - Widget Reference - Tree Select + +
    + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +#### On change + +On check event is triggered whenever the checkbox value is changed (checked or unchecked). + +#### On check + +On check event is triggered whenever the checkbox value is checked. + +#### On uncheck + +On uncheck event is triggered whenever the checkbox value is unchecked. + +### Layout + +
    + +ToolJet - Widget Reference - Tree Select + +
    + +#### Show on desktop + +Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +#### Show on mobile + +Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. + +## Styles + +
    + +ToolJet - Widget Reference - Tree Select + +
    + +### Text color + +Change the color of the Label by entering the `Hex color code` or choosing a color of your choice from the color-picker. + +### Checkbox color + +You can change the color of the checkbox by entering the `Hex color code` or choosing a color of your choice from the color-picker. + +### Visibility + +Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. + +### Disable + +This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: diff --git a/docs/versioned_docs/version-2.4.0/widgets/vertical-divider.md b/docs/versioned_docs/version-2.4.0/widgets/vertical-divider.md new file mode 100644 index 0000000000..8cf2894a1c --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/widgets/vertical-divider.md @@ -0,0 +1,57 @@ +--- +id: vertical-divider +title: Vertical Divider +--- +# Vertical Divider + +Vertical Divider widget is used to add vertical separator between components. + +
    + +ToolJet - Widget Reference - Vertical divider + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. + +Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +ToolJet - Widget Reference - Vertical divider + +
    + +## Layout + +
    + +ToolJet - Widget Reference - Vertical divider + +
    + +| properties | description | +| ----------- | ----------- | +| Show on Desktop | This property have toggle switch. If enabled, the divider will display in the desktop view else it will not appear. | +| Show on Mobile | This property have toggle switch. If enabled, the divider will display in the mobile view else it will not appear. | + +## Styles + +
    + +ToolJet - Widget Reference - Vertical divider + +
    + +| properties | description | +| ----------- | ----------- | +| Divider Color | It is used to set the color of the divider. Use hex code to set the background color. | +| Visibility | This property is used to set the visibility of the divider. The property accepts Boolean value. | + + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: \ No newline at end of file diff --git a/docs/versioned_sidebars/version-2.4.0-sidebars.json b/docs/versioned_sidebars/version-2.4.0-sidebars.json new file mode 100644 index 0000000000..96bdc2e3c6 --- /dev/null +++ b/docs/versioned_sidebars/version-2.4.0-sidebars.json @@ -0,0 +1,370 @@ +{ + "docs": [ + "getting-started", + { + "type": "category", + "label": "Setup", + "link": { + "type": "doc", + "id": "setup/index" + }, + "items": [ + "setup/try-tooljet", + "setup/digitalocean", + "setup/docker", + "setup/heroku", + "setup/ec2", + "setup/ecs", + "setup/openshift", + "setup/kubernetes", + "setup/kubernetes-gke", + "setup/kubernetes-aks", + "setup/google-cloud-run", + "setup/client", + "setup/env-vars", + "setup/http-proxy", + "setup/tooljet-subpath", + "setup/v2-migration-guide" + ] + }, + "tooljet-database", + { + "type": "category", + "label": "Datasource Catalog", + "items": [ + "data-sources/overview", + { + "type": "category", + "label": "Datasources library", + "items": [ + "data-sources/airtable", + "data-sources/s3", + "data-sources/amazonses", + "data-sources/appwrite", + "data-sources/athena", + "data-sources/baserow", + "data-sources/bigquery", + "data-sources/firestore", + "data-sources/clickhouse", + "data-sources/cosmosdb", + "data-sources/couchdb", + "data-sources/dynamodb", + "data-sources/elasticsearch", + "data-sources/gcs", + "data-sources/google.sheets", + "data-sources/graphql", + "data-sources/influxdb", + "data-sources/mailgun", + "data-sources/mariadb", + "data-sources/minio", + "data-sources/mongodb", + "data-sources/mssql", + "data-sources/mysql", + "data-sources/n8n", + "data-sources/notion", + "data-sources/openapi", + "data-sources/oracledb", + "data-sources/postgresql", + "data-sources/redis", + "data-sources/restapi", + "data-sources/rethinkdb", + "data-sources/run-js", + "data-sources/run-py", + "data-sources/saphana", + "data-sources/sendgrid", + "data-sources/slack", + "data-sources/smtp", + "data-sources/snowflake", + "data-sources/stripe", + "data-sources/twilio", + "data-sources/typesense", + "data-sources/woocommerce", + "data-sources/zendesk" + ] + }, + "tutorial/transformations" + ] + }, + { + "type": "category", + "label": "Components Catalog", + "items": [ + "widgets/overview", + { + "type": "category", + "label": "Components library", + "items": [ + "widgets/bounded-box", + "widgets/button", + "widgets/button-group", + "widgets/calendar", + "widgets/chart", + "widgets/checkbox", + "widgets/circular-progress-bar", + "widgets/code-editor", + "widgets/color-picker", + "widgets/container", + "widgets/custom-component", + "widgets/date-range-picker", + "widgets/datepicker", + "widgets/divider", + "widgets/dropdown", + "widgets/file-picker", + "widgets/form", + "widgets/html", + "widgets/icon", + "widgets/iframe", + "widgets/image", + "widgets/kanban", + "widgets/link", + "widgets/listview", + "widgets/map", + "widgets/modal", + "widgets/multiselect", + "widgets/number-input", + "widgets/password-input", + "widgets/pdf", + "widgets/pagination", + "widgets/qr-scanner", + "widgets/radio-button", + "widgets/range-slider", + "widgets/rich-text-editor", + "widgets/spinner", + "widgets/star-rating", + "widgets/statistics", + "widgets/steps", + "widgets/svg-image", + "widgets/table", + "widgets/tabs", + "widgets/tags", + "widgets/text-input", + "widgets/text", + "widgets/textarea", + "widgets/timeline", + "widgets/timer", + "widgets/toggle-switch", + "widgets/tree-select", + "widgets/vertical-divider" + ] + }, + { + "type": "category", + "label": "Actions Reference", + "link": { + "type": "generated-index", + "title": "Actions Reference", + "description": "All the actions that can be performed through event handlers", + "keywords": [ + "actions", + "events" + ] + }, + "items": [ + "actions/show-alert", + "actions/logout", + "actions/run-query", + "actions/open-webpage", + "actions/go-to-app", + "actions/show-modal", + "actions/close-modal", + "actions/copy-to-clipboard", + "actions/set-localstorage", + "actions/generate-file", + "actions/set-table-page", + "actions/set-variable", + "actions/unset-variable", + "actions/switch-page", + "actions/set-page-variable", + "actions/unset-page-variable", + "actions/control-component" + ] + } + ] + }, + { + "type": "category", + "label": "App Builder", + "items": [ + "app-builder/overview", + "app-builder/toolbar", + "app-builder/canvas", + "app-builder/left-sidebar", + "app-builder/components-library", + "app-builder/query-panel", + "tutorial/pages", + "tutorial/keyboard-shortcuts" + ] + }, + { + "type": "category", + "label": "Org Management", + "items": [ + { + "type": "category", + "label": "User Authentication", + "link": { + "type": "generated-index", + "title": "User Authentication", + "description": "Guides for setting up User Authentication and managing Single Sign-On", + "keywords": [ + "SSO", + "authentication" + ] + }, + "collapsed": true, + "items": [ + "user-authentication/user-lifecycle", + "user-authentication/general-settings", + "user-authentication/password-login", + { + "type": "category", + "label": "SSO", + "items": [ + "user-authentication/sso/github", + "user-authentication/sso/google", + { + "type": "category", + "label": "OpenId Connect", + "link": { + "type": "generated-index", + "title": "OpenId Connect", + "description": " ", + "keywords": [ + "okta", + "openid", + "azureAD" + ] + }, + "collapsed": false, + "items": [ + "user-authentication/sso/openid/setup", + "user-authentication/sso/openid/azuread", + "user-authentication/sso/openid/okta", + "user-authentication/sso/openid/google-openid" + ] + } + ] + } + ] + }, + { + "type": "category", + "label": "Workspaces", + "items": [ + "tutorial/workspace_overview", + "tutorial/workspace-variables" + ] + }, + "org-management/permissions", + "tutorial/manage-users-groups", + "Enterprise/audit_logs", + "Enterprise/white-label", + "Enterprise/superadmin" + ] + }, + { + "type": "category", + "label": "Release Management", + "items": [ + "release-management/multi-environment", + "tutorial/versioning-and-release" + ] + }, + "marketplace", + { + "type": "category", + "label": "How To", + "link": { + "type": "generated-index", + "title": "How To Guides", + "description": "How To Guides for all the things ToolJet", + "keywords": [ + "how to" + ] + }, + "items": [ + "how-to/build-plugin-for-marketplace", + "how-to/use-inspector", + "how-to/use-form-component", + "how-to/access-cellvalue-rowdata", + "how-to/bulk-update-multiple-rows", + "how-to/access-currentuser", + "how-to/use-axios-in-runjs", + "how-to/import-external-libraries-using-runpy", + "how-to/import-external-libraries-using-runjs", + "how-to/run-actions-from-runjs", + "how-to/run-query-at-specified-intervals", + "how-to/access-users-location", + "how-to/s3-custom-endpoints", + "how-to/oauth2-authorization", + "how-to/upload-files-aws", + "how-to/upload-files-gcs", + "how-to/loading-image-pdf-from-db" + ] + }, + { + "type": "category", + "label": "Contributing Guide", + "link": { + "type": "generated-index", + "title": "Contributing Guide", + "description": "Guides for contributing to ToolJet", + "keywords": [ + "contribute", + "contributing" + ] + }, + "collapsed": false, + "items": [ + "contributing-guide/setup/architecture", + { + "type": "category", + "label": "Setup", + "items": [ + "contributing-guide/setup/macos", + "contributing-guide/setup/docker", + "contributing-guide/setup/ubuntu" + ] + }, + { + "type": "category", + "label": "Tutorials", + "items": [ + "contributing-guide/tutorials/creating-widget", + "contributing-guide/tutorials/creating-a-plugin" + ] + }, + "contributing-guide/testing", + "contributing-guide/l10n", + { + "type": "category", + "label": "Troubleshooting", + "items": [ + "contributing-guide/troubleshooting/eslint" + ] + }, + "contributing-guide/code-of-conduct", + "contributing-guide/slackcoc" + ] + }, + "security", + "tracking", + { + "type": "category", + "label": "Project Overview", + "collapsed": false, + "items": [ + { + "type": "link", + "label": "Releases", + "href": "https://github.com/ToolJet/ToolJet/releases" + }, + { + "type": "link", + "label": "Roadmap", + "href": "https://github.com/ToolJet/ToolJet/projects/2?query=is%3Aopen+sort%3Aupdated-desc" + } + ] + } + ] +} diff --git a/docs/versions.json b/docs/versions.json index 8d51b523ee..af912d7008 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1,4 +1,5 @@ [ + "2.4.0", "2.3.0", "2.2.0", "2.1.0", From 6bbec4f081591462c070d5262220e0da3b9ba587 Mon Sep 17 00:00:00 2001 From: Midhun G S Date: Thu, 6 Apr 2023 21:10:14 +0530 Subject: [PATCH 15/23] global data source improvement (#5958) --- .../DataSourceManager/DataSourceManager.jsx | 20 ++++++++++++++++--- frontend/src/_services/datasource.service.js | 4 ++-- .../src/_services/globalDatasource.service.js | 4 ++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/frontend/src/Editor/DataSourceManager/DataSourceManager.jsx b/frontend/src/Editor/DataSourceManager/DataSourceManager.jsx index a65240f1ce..1fbfa1d61b 100644 --- a/frontend/src/Editor/DataSourceManager/DataSourceManager.jsx +++ b/frontend/src/Editor/DataSourceManager/DataSourceManager.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import { datasourceService, authenticationService, pluginsService, globalDatasourceService } from '@/_services'; +import { datasourceService, pluginsService, globalDatasourceService } from '@/_services'; import cx from 'classnames'; import { Modal, Button, Tab, Row, Col, ListGroup } from 'react-bootstrap'; import { toast } from 'react-hot-toast'; @@ -175,7 +175,13 @@ class DataSourceManagerComponent extends React.Component { if (selectedDataSource.id) { this.setState({ isSaving: true }); service - .save(selectedDataSource.id, name, parsedOptions, appId, currentEnvironment) + .save({ + id: selectedDataSource.id, + name, + options: parsedOptions, + app_id: appId, + environment_id: currentEnvironment, + }) .then(() => { this.setState({ isSaving: false }); this.hideModal(); @@ -194,7 +200,15 @@ class DataSourceManagerComponent extends React.Component { } else { this.setState({ isSaving: true }); service - .create(pluginId, name, kind, parsedOptions, appId, appVersionId, scope) + .create({ + plugin_id: pluginId, + name, + kind, + options: parsedOptions, + app_id: appId, + app_version_id: appVersionId, + scope, + }) .then((data) => { this.setState({ isSaving: false }); this.hideModal(); diff --git a/frontend/src/_services/datasource.service.js b/frontend/src/_services/datasource.service.js index 3d1a9af07a..b6c6743d1d 100644 --- a/frontend/src/_services/datasource.service.js +++ b/frontend/src/_services/datasource.service.js @@ -17,7 +17,7 @@ function getAll(appVersionId) { return fetch(`${config.apiUrl}/data_sources?` + searchParams, requestOptions).then(handleResponse); } -function create(plugin_id, name, kind, options, app_id, app_version_id) { +function create({ plugin_id, name, kind, options, app_id, app_version_id }) { const body = { plugin_id, name, @@ -31,7 +31,7 @@ function create(plugin_id, name, kind, options, app_id, app_version_id) { return fetch(`${config.apiUrl}/data_sources`, requestOptions).then(handleResponse); } -function save(id, name, options, app_id) { +function save({ id, name, options, app_id }) { const body = { name, options, diff --git a/frontend/src/_services/globalDatasource.service.js b/frontend/src/_services/globalDatasource.service.js index eb0f32bf02..9a4573bdd2 100644 --- a/frontend/src/_services/globalDatasource.service.js +++ b/frontend/src/_services/globalDatasource.service.js @@ -14,7 +14,7 @@ function getAll() { return fetch(`${config.apiUrl}/v2/data_sources`, requestOptions).then(handleResponse); } -function create(plugin_id, name, kind, options, app_id, app_version_id, scope) { +function create({ plugin_id, name, kind, options, scope }) { const body = { plugin_id, name, @@ -27,7 +27,7 @@ function create(plugin_id, name, kind, options, app_id, app_version_id, scope) { return fetch(`${config.apiUrl}/v2/data_sources`, requestOptions).then(handleResponse); } -function save(id, name, options, appId, environment_id) { +function save({ id, name, options, environment_id }) { const body = { name, options, From 891bed545514f1dd357bc0321c84daf5483328f1 Mon Sep 17 00:00:00 2001 From: vjaris42 Date: Fri, 7 Apr 2023 11:48:20 +0530 Subject: [PATCH 16/23] Fixes app import on different workspace (#5957) * fix: app import on different workspace * added schema details * changeQueryDataSource fix --------- Co-authored-by: gsmithun4 --- frontend/src/_services/dataquery.service.js | 2 +- .../src/services/app_import_export.service.ts | 64 +++++++++++++------ 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/frontend/src/_services/dataquery.service.js b/frontend/src/_services/dataquery.service.js index ee03fb9d66..d2aff0f87c 100644 --- a/frontend/src/_services/dataquery.service.js +++ b/frontend/src/_services/dataquery.service.js @@ -71,6 +71,6 @@ function changeQueryDataSource(id, dataSourceId) { const body = { data_source_id: dataSourceId, }; - const requestOptions = { method: 'PUT', headers: authHeader(), body: JSON.stringify(body) }; + const requestOptions = { method: 'PUT', headers: authHeader(), body: JSON.stringify(body), credentials: 'include' }; return fetch(`${config.apiUrl}/data_queries/${id}/data_source`, requestOptions).then(handleResponse); } diff --git a/server/src/services/app_import_export.service.ts b/server/src/services/app_import_export.service.ts index 57d2d62ff8..fc9f0ee328 100644 --- a/server/src/services/app_import_export.service.ts +++ b/server/src/services/app_import_export.service.ts @@ -50,7 +50,7 @@ export class AppImportExportService { } const appVersions = await queryAppVersions.orderBy('app_versions.created_at', 'ASC').getMany(); - const dataSources = + let dataSources = appVersions?.length && (await manager .createQueryBuilder(DataSource, 'data_sources') @@ -73,13 +73,17 @@ export class AppImportExportService { const globalQueries: DataQuery[] = await manager .createQueryBuilder(DataQuery, 'data_query') - .leftJoinAndSelect('data_query.dataSource', 'dataSource') + .innerJoinAndSelect('data_query.dataSource', 'dataSource') .where('data_query.appVersionId IN(:...versionId)', { versionId: appVersions.map((v) => v.id), }) .andWhere('dataSource.scope = :scope', { scope: DataSourceScopes.GLOBAL }) .getMany(); + const globalDataSources = globalQueries.map((gq) => gq.dataSource); + + dataSources = [...dataSources, ...globalDataSources]; + if (dataSources?.length) { dataQueries = await manager .createQueryBuilder(DataQuery, 'data_queries') @@ -98,10 +102,6 @@ export class AppImportExportService { .getMany(); } - if (globalQueries?.length) { - dataQueries = [...dataQueries, ...globalQueries]; - } - appToExport['dataQueries'] = dataQueries; appToExport['dataSources'] = dataSources; appToExport['appVersions'] = appVersions; @@ -110,6 +110,7 @@ export class AppImportExportService { appToExport['schemaDetails'] = { multiPages: true, multiEnv: true, + globalDataSources: true, }; return { appV2: appToExport }; @@ -366,11 +367,8 @@ export class AppImportExportService { ); } - let dataSourcesToIterate = dataSources; // 0.9.0 -> add all data sources & queries to all versions + let dataSourcesToIterate = dataSources.map((ds) => ds.appVersionId); // 0.9.0 -> add all data sources & queries to all versions let dataQueriesToIterate = dataQueries; - const globalQueriesToIterate = dataQueries?.filter( - (dq) => dq.dataSource?.scope === DataSourceScopes.GLOBAL && dq.appVersionId === appVersion.id - ); if (dataSources[0]?.appVersionId || dataQueries[0]?.appVersionId) { // v1 - Data queries without dataSourceId present @@ -447,17 +445,47 @@ export class AppImportExportService { dataQueryMapping[query.id] = newQuery.id; newDataQueries.push(newQuery); } + } - for (const query of globalQueriesToIterate) { - const newQuery = manager.create(DataQuery, { - name: query.name, - options: query.options, - dataSourceId: query.dataSourceId, + //Convert Global DataSources to Local + const globalDataSourcesToIterate = dataSources?.filter((ds) => ds.scope === DataSourceScopes.GLOBAL); + + for (const appVersion of appVersions) { + for (const source of globalDataSourcesToIterate) { + const newSource = manager.create(DataSource, { + name: source.name, + kind: source.kind, + type: source.type || DataSourceTypes.DEFAULT, appVersionId: appVersionMapping[appVersion.id], }); - await manager.save(newQuery); - dataQueryMapping[query.id] = newQuery.id; - newDataQueries.push(newQuery); + await manager.save(newSource); + + for (const dataSourceOption of dataSourceOptions.filter((dso) => dso.dataSourceId === source.id)) { + if (dataSourceOption?.environmentId in appEnvironmentMapping) { + const convertedOptions = this.convertToArrayOfKeyValuePairs(dataSourceOption.options); + const newOptions = await this.dataSourcesService.parseOptionsForCreate(convertedOptions, true, manager); + const dsOption = manager.create(DataSourceOptions, { + options: newOptions, + environmentId: appEnvironmentMapping[dataSourceOption.environmentId], + dataSourceId: newSource.id, + createdAt: new Date(), + updatedAt: new Date(), + }); + await manager.save(dsOption); + } + } + + for (const query of dataQueries.filter((dq) => dq.dataSourceId === source.id)) { + const newQuery = manager.create(DataQuery, { + name: query.name, + options: query.options, + dataSourceId: newSource.id, + appVersionId: appVersionMapping[appVersion.id], + }); + await manager.save(newQuery); + dataQueryMapping[query.id] = newQuery.id; + newDataQueries.push(newQuery); + } } } From a5fb6551337f0b5daf2dfaded935f5b9dffd3462 Mon Sep 17 00:00:00 2001 From: Muhsin Shah Date: Fri, 7 Apr 2023 12:40:42 +0530 Subject: [PATCH 17/23] GD editor link issue --- frontend/src/Editor/LeftSidebar/SidebarDatasources.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/Editor/LeftSidebar/SidebarDatasources.jsx b/frontend/src/Editor/LeftSidebar/SidebarDatasources.jsx index b8b154646c..120e217ac5 100644 --- a/frontend/src/Editor/LeftSidebar/SidebarDatasources.jsx +++ b/frontend/src/Editor/LeftSidebar/SidebarDatasources.jsx @@ -15,6 +15,7 @@ import { Popover as PopoverBS, OverlayTrigger } from 'react-bootstrap'; // eslint-disable-next-line import/no-unresolved import TrashIcon from '@assets/images/icons/query-trash-icon.svg'; import VerticalIcon from '@assets/images/icons/vertical-menu.svg'; +import { getPrivateRoute } from '@/_helpers/routes'; export const LeftSidebarDataSources = ({ appId, @@ -260,7 +261,7 @@ const LeftSidebarDataSourcesContainer = ({ darkMode, RenderDataSource, dataSourc
    - +
    {t(`leftSidebar.Sources.addDataSource`, '+ add data source')}
    From 6c1c692b12df1deae9428e5874c4705e1c69c7f7 Mon Sep 17 00:00:00 2001 From: Muhsin Shah C P Date: Fri, 7 Apr 2023 13:10:43 +0530 Subject: [PATCH 18/23] fix: conflict b/w yjs auth_token and session token (#5962) --- server/src/modules/auth/authorize-workspace-guard.ts | 2 +- server/src/modules/auth/jwt.strategy.ts | 2 +- server/src/modules/auth/organization-auth.guard.ts | 2 +- server/src/modules/auth/session-auth-guard.ts | 2 +- server/src/services/auth.service.ts | 2 +- server/src/services/session.service.ts | 2 +- server/test/controllers/app.e2e-spec.ts | 4 ++-- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/src/modules/auth/authorize-workspace-guard.ts b/server/src/modules/auth/authorize-workspace-guard.ts index c5b535c341..5f145d3215 100644 --- a/server/src/modules/auth/authorize-workspace-guard.ts +++ b/server/src/modules/auth/authorize-workspace-guard.ts @@ -7,7 +7,7 @@ import { getManager } from 'typeorm'; export class AuthorizeWorkspaceGuard extends AuthGuard('jwt') { async canActivate(context: ExecutionContext): Promise { const request = context.switchToHttp().getRequest(); - if (request?.cookies['auth_token']) { + if (request?.cookies['tj_auth_token']) { let user: any; const organizationId = typeof request.headers['tj-workspace-id'] === 'object' diff --git a/server/src/modules/auth/jwt.strategy.ts b/server/src/modules/auth/jwt.strategy.ts index 306ee7672c..1f49eae56f 100644 --- a/server/src/modules/auth/jwt.strategy.ts +++ b/server/src/modules/auth/jwt.strategy.ts @@ -17,7 +17,7 @@ export class JwtStrategy extends PassportStrategy(Strategy) { ) { super({ jwtFromRequest: (request) => { - return request?.cookies['auth_token']; + return request?.cookies['tj_auth_token']; }, ignoreExpiration: true, secretOrKey: configService.get('SECRET_KEY_BASE'), diff --git a/server/src/modules/auth/organization-auth.guard.ts b/server/src/modules/auth/organization-auth.guard.ts index 91ca351817..cb9f44f0f5 100644 --- a/server/src/modules/auth/organization-auth.guard.ts +++ b/server/src/modules/auth/organization-auth.guard.ts @@ -7,7 +7,7 @@ export class OrganizationAuthGuard extends AuthGuard('jwt') { let user; const request = context.switchToHttp().getRequest(); request.isUserNotMandatory = true; - if (request?.cookies['auth_token']) { + if (request?.cookies['tj_auth_token']) { try { user = await super.canActivate(context); } catch (err) { diff --git a/server/src/modules/auth/session-auth-guard.ts b/server/src/modules/auth/session-auth-guard.ts index b0370139a1..a003668dc7 100644 --- a/server/src/modules/auth/session-auth-guard.ts +++ b/server/src/modules/auth/session-auth-guard.ts @@ -7,7 +7,7 @@ export class SessionAuthGuard extends AuthGuard('jwt') { let user; const request = context.switchToHttp().getRequest(); request.isGetUserSession = true; - if (request?.cookies['auth_token']) { + if (request?.cookies['tj_auth_token']) { try { user = await super.canActivate(context); } catch (err) { diff --git a/server/src/services/auth.service.ts b/server/src/services/auth.service.ts index ee0130a174..82075297f5 100644 --- a/server/src/services/auth.service.ts +++ b/server/src/services/auth.service.ts @@ -596,7 +596,7 @@ export class AuthService { }; user.organizationId = organization.id; - response.cookie('auth_token', this.jwtService.sign(JWTPayload), { + response.cookie('tj_auth_token', this.jwtService.sign(JWTPayload), { httpOnly: true, sameSite: 'strict', maxAge: 2 * 365 * 24 * 60 * 60 * 1000, // maximum expiry 2 years diff --git a/server/src/services/session.service.ts b/server/src/services/session.service.ts index 9bda277381..8e68595279 100644 --- a/server/src/services/session.service.ts +++ b/server/src/services/session.service.ts @@ -52,7 +52,7 @@ export class SessionService { } async terminateSession(userId: string, sessionId: string, response: Response): Promise { - response.clearCookie('auth_token'); + response.clearCookie('tj_auth_token'); await dbTransactionWrap(async (manager: EntityManager) => { await manager.delete(UserSessions, { id: sessionId, userId }); }); diff --git a/server/test/controllers/app.e2e-spec.ts b/server/test/controllers/app.e2e-spec.ts index 477686d95c..9afb7c69a6 100644 --- a/server/test/controllers/app.e2e-spec.ts +++ b/server/test/controllers/app.e2e-spec.ts @@ -122,7 +122,7 @@ describe('Authentication', () => { .send({ email: 'admin@tooljet.io', password: 'password' }); expect(response.statusCode).toBe(201); - expect(response.headers['set-cookie'][0]).toMatch(/^auth_token=/); + expect(response.headers['set-cookie'][0]).toMatch(/^tj_auth_token=/); }); it('authenticate to organization if valid credentials', async () => { const response = await request(app.getHttpServer()) @@ -130,7 +130,7 @@ describe('Authentication', () => { .send({ email: 'admin@tooljet.io', password: 'password' }); expect(response.statusCode).toBe(201); - expect(response.headers['set-cookie'][0]).toMatch(/^auth_token=/); + expect(response.headers['set-cookie'][0]).toMatch(/^tj_auth_token=/); }); it('throw unauthorized error if user does not exist in given organization if valid credentials', async () => { await request(app.getHttpServer()) From 3d57e64d2c60719775afbea83fb7a0b4b93b0733 Mon Sep 17 00:00:00 2001 From: Muhsin Shah Date: Fri, 7 Apr 2023 13:25:02 +0530 Subject: [PATCH 19/23] fix: yjs token --- server/src/events/yjs.gateway.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/events/yjs.gateway.ts b/server/src/events/yjs.gateway.ts index 2ac29da887..95425699c4 100644 --- a/server/src/events/yjs.gateway.ts +++ b/server/src/events/yjs.gateway.ts @@ -21,7 +21,7 @@ export class YjsGateway implements OnGatewayConnection, OnGatewayDisconnect { // error code 4000 to communicate to client // that it should not reconnect if auth failed const ERROR_CODE_WEBSOCKET_AUTH_FAILED = 4000; - const token = this.getCookie(request?.headers?.cookie, 'auth_token'); + const token = this.getCookie(request?.headers?.cookie, 'tj_auth_token'); if (isEmpty(token)) { connection.close(ERROR_CODE_WEBSOCKET_AUTH_FAILED); } else { From a76e4189d30da50f6198f427ed51d338d15419ec Mon Sep 17 00:00:00 2001 From: Muhsin Shah Date: Fri, 7 Apr 2023 14:58:47 +0530 Subject: [PATCH 20/23] fix: editor switch workspace issue --- frontend/src/AppLoader/AppLoader.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/AppLoader/AppLoader.jsx b/frontend/src/AppLoader/AppLoader.jsx index e1a534ddbc..016df6920a 100644 --- a/frontend/src/AppLoader/AppLoader.jsx +++ b/frontend/src/AppLoader/AppLoader.jsx @@ -28,7 +28,7 @@ const AppLoaderComponent = (props) => { const sub_path = window?.public_config?.SUB_PATH ? stripTrailingSlash(window?.public_config?.SUB_PATH) : ''; organizationService.switchOrganization(orgId).then( () => { - window.location.href = `${sub_path}${path}`; + window.location.href = `${sub_path}/${orgId}${path}`; }, () => { return (window.location.href = `${sub_path}/login/${orgId}?redirectTo=${path}`); From 2dc6ae8e4b5c19f4c090e86c103a42238800c4c9 Mon Sep 17 00:00:00 2001 From: Muhsin Shah Date: Fri, 7 Apr 2023 18:57:04 +0530 Subject: [PATCH 21/23] fix: subpath table column drag svg image issue --- frontend/src/Editor/Inspector/Components/Table/Table.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/Editor/Inspector/Components/Table/Table.jsx b/frontend/src/Editor/Inspector/Components/Table/Table.jsx index e645667afa..25f784eea4 100644 --- a/frontend/src/Editor/Inspector/Components/Table/Table.jsx +++ b/frontend/src/Editor/Inspector/Components/Table/Table.jsx @@ -992,7 +992,7 @@ class TableComponent extends React.Component {
    From 869c1daa5c99a1897215cdae503e55b0489032e5 Mon Sep 17 00:00:00 2001 From: vjaris42 Date: Mon, 10 Apr 2023 14:03:30 +0530 Subject: [PATCH 22/23] Fixes query duplication on import on apps having multiple versions (#5971) * fix: app import with multiple versions * clenaup --- server/src/services/app_import_export.service.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/server/src/services/app_import_export.service.ts b/server/src/services/app_import_export.service.ts index fc9f0ee328..b8e0582203 100644 --- a/server/src/services/app_import_export.service.ts +++ b/server/src/services/app_import_export.service.ts @@ -80,7 +80,7 @@ export class AppImportExportService { .andWhere('dataSource.scope = :scope', { scope: DataSourceScopes.GLOBAL }) .getMany(); - const globalDataSources = globalQueries.map((gq) => gq.dataSource); + const globalDataSources = [...new Map(globalQueries.map((gq) => [gq.dataSource.id, gq.dataSource])).values()]; dataSources = [...dataSources, ...globalDataSources]; @@ -474,8 +474,9 @@ export class AppImportExportService { await manager.save(dsOption); } } - - for (const query of dataQueries.filter((dq) => dq.dataSourceId === source.id)) { + for (const query of dataQueries.filter( + (dq) => dq.dataSourceId === source.id && dq.appVersionId === appVersion.id + )) { const newQuery = manager.create(DataQuery, { name: query.name, options: query.options, From 4836874d68b50586f1cde865cb6807e99fda360f Mon Sep 17 00:00:00 2001 From: Muhsin Shah Date: Mon, 10 Apr 2023 16:11:40 +0530 Subject: [PATCH 23/23] fix: query handler issue - query success message is also showing with error toast --- frontend/src/_helpers/appUtils.js | 160 +++++++++++++++--------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/frontend/src/_helpers/appUtils.js b/frontend/src/_helpers/appUtils.js index f660f9a375..c32ba99588 100644 --- a/frontend/src/_helpers/appUtils.js +++ b/frontend/src/_helpers/appUtils.js @@ -1011,97 +1011,97 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode = } ); }); - } + } else { + let rawData = data.data; + let finalData = data.data; - let rawData = data.data; - let finalData = data.data; - - if (dataQuery.options.enableTransformation) { - finalData = await runTransformation( - _ref, - finalData, - query.options.transformation, - query.options.transformationLanguage, - query, - 'edit' - ); - if (finalData.status === 'failed') { - flushSync(() => { - return _self.setState( - { - currentState: { - ..._self.state.currentState, - queries: { - ..._self.state.currentState.queries, - [queryName]: { - ..._self.state.currentState.queries[queryName], - isLoading: false, + if (dataQuery.options.enableTransformation) { + finalData = await runTransformation( + _ref, + finalData, + query.options.transformation, + query.options.transformationLanguage, + query, + 'edit' + ); + if (finalData.status === 'failed') { + flushSync(() => { + return _self.setState( + { + currentState: { + ..._self.state.currentState, + queries: { + ..._self.state.currentState.queries, + [queryName]: { + ..._self.state.currentState.queries[queryName], + isLoading: false, + }, }, - }, - errors: { - ..._self.state.currentState.errors, - [queryName]: { - type: 'transformations', - data: finalData, - options: options, + errors: { + ..._self.state.currentState.errors, + [queryName]: { + type: 'transformations', + data: finalData, + options: options, + }, }, }, }, - }, - () => { - resolve(finalData); - onEvent(_self, 'onDataQueryFailure', { - definition: { events: dataQuery.options.events }, - }); - } - ); + () => { + resolve(finalData); + onEvent(_self, 'onDataQueryFailure', { + definition: { events: dataQuery.options.events }, + }); + } + ); + }); + } + } + + if (dataQuery.options.showSuccessNotification) { + const notificationDuration = dataQuery.options.notificationDuration * 1000 || 5000; + toast.success(dataQuery.options.successMessage, { + duration: notificationDuration, }); } - } - - if (dataQuery.options.showSuccessNotification) { - const notificationDuration = dataQuery.options.notificationDuration * 1000 || 5000; - toast.success(dataQuery.options.successMessage, { - duration: notificationDuration, - }); - } - flushSync(() => { - _self.setState( - { - currentState: { - ..._self.state.currentState, - queries: { - ..._self.state.currentState.queries, - [queryName]: _.assign( - { - ..._self.state.currentState.queries[queryName], - isLoading: false, - data: finalData, - rawData, - }, - query.kind === 'restapi' - ? { - request: data.request, - response: data.response, - responseHeaders: data.responseHeaders, - } - : {} - ), + flushSync(() => { + _self.setState( + { + currentState: { + ..._self.state.currentState, + queries: { + ..._self.state.currentState.queries, + [queryName]: _.assign( + { + ..._self.state.currentState.queries[queryName], + isLoading: false, + data: finalData, + rawData, + }, + query.kind === 'restapi' + ? { + request: data.request, + response: data.response, + responseHeaders: data.responseHeaders, + } + : {} + ), + }, }, }, - }, - () => { - resolve({ status: 'ok', data: finalData }); - onEvent(_self, 'onDataQuerySuccess', { definition: { events: dataQuery.options.events } }, mode); + () => { + resolve({ status: 'ok', data: finalData }); + onEvent(_self, 'onDataQuerySuccess', { definition: { events: dataQuery.options.events } }, mode); - if (mode !== 'view') { - toast(`Query (${queryName}) completed.`, { - icon: '🚀', - }); + if (mode !== 'view') { + toast(`Query (${queryName}) completed.`, { + icon: '🚀', + }); + } } - } - ); - }); + ); + }); + } }) .catch(({ error }) => { if (mode !== 'view') toast.error(error ?? 'Unknown error');