From 525a0d2ac55006f106eb4b6e21441b627f167c27 Mon Sep 17 00:00:00 2001 From: amitjoshi438 <54068463+amitjoshi438@users.noreply.github.com> Date: Tue, 17 Oct 2023 22:20:28 +0530 Subject: [PATCH 1/2] Users/amitjoshi/gpt tokenizer integration (#734) * getting info about selected code * showing label for selected lines of code * add flag to disable feature * updated responsiveness * code formatting fix * removed log statement * handles empty selections * passing and showing user selected code to copilot * setting fixed vertical height for user code * removed redundant code * added comment * added const for explainCode msg * sending localized string to copilot webview * gpt-tokenizer integration * user prompt with selected code and 'explain' check * showing context cmd only when copilot registered * update handling of empty snippet * updated when clause * moved code to skip in a const * Added telemetry * updated strings * user initial fix --------- Co-authored-by: amitjoshi Co-authored-by: tyaginidhi --- package-lock.json | 18 +++++++++++-- package.json | 3 ++- src/common/copilot/IntelligenceApiService.ts | 8 +++--- src/common/copilot/PowerPagesCopilot.ts | 27 ++++++++++++++----- src/common/copilot/assets/copilotStrings.ts | 3 ++- src/common/copilot/assets/scripts/copilot.js | 19 ++++++++----- src/common/copilot/constants.ts | 6 +++++ src/common/copilot/telemetry/ITelemetry.ts | 1 + .../copilot/telemetry/copilotTelemetry.ts | 3 ++- .../copilot/telemetry/telemetryConstants.ts | 2 ++ 10 files changed, 68 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index b815d770..7f0e437e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "powerplatform-vscode", - "version": "1.0.1-dev", + "version": "22.2.22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "powerplatform-vscode", - "version": "1.0.1-dev", + "version": "22.2.22", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@microsoft/generator-powerpages": "1.21.19", @@ -17,6 +17,7 @@ "command-exists": "^1.2.9", "find-process": "^1.4.7", "glob": "^7.1.7", + "gpt-tokenizer": "^2.1.1", "liquidjs": "^10.2.0", "n-readlines": "^1.0.1", "puppeteer-core": "^14.4.1", @@ -6545,6 +6546,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gpt-tokenizer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gpt-tokenizer/-/gpt-tokenizer-2.1.1.tgz", + "integrity": "sha512-WlX+vj6aPaZ71U6Bf18fem+5k58zlgh2a4nbc7KHy6aGVIyq3nCh709b/8momu34sV/5t/SpzWi8LayWD9uyDw==", + "dependencies": { + "rfc4648": "^1.5.2" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -13219,6 +13228,11 @@ "node": ">=0.10.0" } }, + "node_modules/rfc4648": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.2.tgz", + "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", diff --git a/package.json b/package.json index d7004a17..6bc8a996 100644 --- a/package.json +++ b/package.json @@ -578,7 +578,7 @@ { "submenu": "microsoft-powerapps-portals.powerpages-copilot", "group": "0_powerpages-copilot", - "when": "never" + "when": "(powerpages.copilot.isVisible) && ((!virtualWorkspace && powerpages.websiteYmlExists && config.powerPlatform.experimental.copilotEnabled) || (isWeb && config.powerPlatform.experimental.enableWebCopilot))" } ], "microsoft-powerapps-portals.powerpages-copilot": [ @@ -1033,6 +1033,7 @@ "command-exists": "^1.2.9", "find-process": "^1.4.7", "glob": "^7.1.7", + "gpt-tokenizer": "^2.1.1", "liquidjs": "^10.2.0", "n-readlines": "^1.0.1", "puppeteer-core": "^14.4.1", diff --git a/src/common/copilot/IntelligenceApiService.ts b/src/common/copilot/IntelligenceApiService.ts index 22e69145..e7451470 100644 --- a/src/common/copilot/IntelligenceApiService.ts +++ b/src/common/copilot/IntelligenceApiService.ts @@ -4,7 +4,7 @@ */ import fetch, { RequestInit } from "node-fetch"; -import { INAPPROPRIATE_CONTENT, INPUT_CONTENT_FILTERED, INVALID_INFERENCE_INPUT, InvalidResponse, MalaciousScenerioResponse, NetworkError, PROMPT_LIMIT_EXCEEDED, PromptLimitExceededResponse, RELEVANCY_CHECK_FAILED, RateLimitingResponse, UnauthorizedResponse } from "./constants"; +import { INAPPROPRIATE_CONTENT, INPUT_CONTENT_FILTERED, INVALID_INFERENCE_INPUT, InvalidResponse, MalaciousScenerioResponse, NetworkError, PROMPT_LIMIT_EXCEEDED, PromptLimitExceededResponse, RELEVANCY_CHECK_FAILED, RateLimitingResponse, UnauthorizedResponse, UserPrompt } from "./constants"; import { IActiveFileParams } from "./model"; import { sendTelemetryEvent } from "./telemetry/copilotTelemetry"; import { ITelemetry } from "../../client/telemetry/ITelemetry"; @@ -15,14 +15,14 @@ import { EXTENSION_NAME } from "../../client/constants"; const clientType = EXTENSION_NAME + '-' + getExtensionType(); const clientVersion = getExtensionVersion(); -export async function sendApiRequest(userPrompt: string, activeFileParams: IActiveFileParams, orgID: string, apiToken: string, sessionID: string, entityName: string, entityColumns: string[], telemetry: ITelemetry, aibEndpoint: string | null) { +export async function sendApiRequest(userPrompt: UserPrompt[], activeFileParams: IActiveFileParams, orgID: string, apiToken: string, sessionID: string, entityName: string, entityColumns: string[], telemetry: ITelemetry, aibEndpoint: string | null) { if (!aibEndpoint) { return NetworkError; } const requestBody = { - "question": userPrompt, + "question": userPrompt[0].displayText, "top": 1, "context": { "sessionId": sessionID, @@ -33,7 +33,7 @@ export async function sendApiRequest(userPrompt: string, activeFileParams: IActi "dataverseEntity": activeFileParams.dataverseEntity, "entityField": activeFileParams.entityField, "fieldType": activeFileParams.fieldType, - "activeFileContent": '', //TODO: Add active file content (selected code) + "activeFileContent": userPrompt[0].code, //Active file content (selected code) "targetEntity": entityName, "targetColumns": entityColumns, "clientType": clientType, diff --git a/src/common/copilot/PowerPagesCopilot.ts b/src/common/copilot/PowerPagesCopilot.ts index 05c3c569..3f8a76c9 100644 --- a/src/common/copilot/PowerPagesCopilot.ts +++ b/src/common/copilot/PowerPagesCopilot.ts @@ -10,19 +10,20 @@ import { dataverseAuthentication, intelligenceAPIAuthentication } from "../../we import { v4 as uuidv4 } from 'uuid' import { PacWrapper } from "../../client/pac/PacWrapper"; import { ITelemetry } from "../../client/telemetry/ITelemetry"; -import { AUTH_CREATE_FAILED, AUTH_CREATE_MESSAGE, AuthProfileNotFound, COPILOT_UNAVAILABLE, CopilotDisclaimer, CopilotStylePathSegments, DataverseEntityNameMap, EXPLAIN_CODE, EntityFieldMap, FieldTypeMap, PAC_SUCCESS, SELECTED_CODE_INFO_ENABLED, WebViewMessage, sendIconSvg } from "./constants"; +import { AUTH_CREATE_FAILED, AUTH_CREATE_MESSAGE, AuthProfileNotFound, COPILOT_UNAVAILABLE, CopilotDisclaimer, CopilotStylePathSegments, DataverseEntityNameMap, EXPLAIN_CODE, EntityFieldMap, FieldTypeMap, PAC_SUCCESS, SELECTED_CODE_INFO, SELECTED_CODE_INFO_ENABLED, UserPrompt, WebViewMessage, sendIconSvg } from "./constants"; import { IActiveFileParams, IActiveFileData, IOrgInfo } from './model'; import { escapeDollarSign, getLastThreePartsOfFileName, getNonce, getSelectedCode, getSelectedCodeLineRange, getUserName, openWalkthrough, showConnectedOrgMessage, showInputBoxAndGetOrgUrl, showProgressWithNotification } from "../Utils"; import { CESUserFeedback } from "./user-feedback/CESSurvey"; import { GetAuthProfileWatchPattern } from "../../client/lib/AuthPanelView"; import { ActiveOrgOutput } from "../../client/pac/PacTypes"; -import { CopilotWalkthroughEvent, CopilotCopyCodeToClipboardEvent, CopilotInsertCodeToEditorEvent, CopilotLoadedEvent, CopilotOrgChangedEvent, CopilotUserFeedbackThumbsDownEvent, CopilotUserFeedbackThumbsUpEvent, CopilotUserPromptedEvent, CopilotCodeLineCountEvent, CopilotClearChatEvent, CopilotNotAvailable } from "./telemetry/telemetryConstants"; +import { CopilotWalkthroughEvent, CopilotCopyCodeToClipboardEvent, CopilotInsertCodeToEditorEvent, CopilotLoadedEvent, CopilotOrgChangedEvent, CopilotUserFeedbackThumbsDownEvent, CopilotUserFeedbackThumbsUpEvent, CopilotUserPromptedEvent, CopilotCodeLineCountEvent, CopilotClearChatEvent, CopilotNotAvailable, CopilotExplainCode, CopilotExplainCodeSize } from "./telemetry/telemetryConstants"; import { sendTelemetryEvent } from "./telemetry/copilotTelemetry"; import { INTELLIGENCE_SCOPE_DEFAULT, PROVIDER_ID } from "../../web/client/common/constants"; import { getIntelligenceEndpoint } from "../ArtemisService"; import TelemetryReporter from "@vscode/extension-telemetry"; import { getEntityColumns, getEntityName } from "./dataverseMetadata"; import { COPILOT_STRINGS } from "./assets/copilotStrings"; +import { isWithinTokenLimit, encode } from "gpt-tokenizer"; let intelligenceApiToken: string; let userID: string; // Populated from PAC or intelligence API @@ -79,18 +80,26 @@ export class PowerPagesCopilot implements vscode.WebviewViewProvider { const selectedCodeLineRange = getSelectedCodeLineRange(editor); if(commandType === EXPLAIN_CODE && selectedCode.length === 0) { // Show a message if the selection is empty and don't send the message to webview - vscode.window.showInformationMessage(vscode.l10n.t('Selection is empty!')); + vscode.window.showInformationMessage(vscode.l10n.t('Selection is empty.')); return; } - this.sendMessageToWebview({ type: commandType, value: { start: selectedCodeLineRange.start, end: selectedCodeLineRange.end, selectedCode: selectedCode } }); + const withinTokenLimit = isWithinTokenLimit(selectedCode, 1000); + if(commandType === EXPLAIN_CODE) { + const tokenSize = encode(selectedCode).length; + sendTelemetryEvent(this.telemetry, { eventName: CopilotExplainCodeSize, copilotSessionId: sessionID, orgId: orgID, codeLineCount: String(selectedCodeLineRange.end - selectedCodeLineRange.start), tokenSize: String(tokenSize) }); + if(withinTokenLimit === false) { + return; + } + } + this.sendMessageToWebview({ type: commandType, value: { start: selectedCodeLineRange.start, end: selectedCodeLineRange.end, selectedCode: selectedCode, tokenSize: withinTokenLimit } }); }; this._disposables.push( - vscode.window.onDidChangeTextEditorSelection(() => handleSelectionChange("selectedCodeInfo")) + vscode.window.onDidChangeTextEditorSelection(() => handleSelectionChange(SELECTED_CODE_INFO)), vscode.window.onDidChangeActiveTextEditor(() => handleSelectionChange(SELECTED_CODE_INFO)) ); this._disposables.push( - vscode.commands.registerCommand("powerpages.copilot.explain", () => handleSelectionChange(EXPLAIN_CODE)) + vscode.commands.registerCommand("powerpages.copilot.explain", () => {sendTelemetryEvent(this.telemetry, { eventName: CopilotExplainCode, copilotSessionId: sessionID, orgId: orgID }); this.show(); handleSelectionChange(EXPLAIN_CODE)}) ); } @@ -167,6 +176,10 @@ export class PowerPagesCopilot implements vscode.WebviewViewProvider { const pacOutput = await this._pacWrapper?.activeOrg(); + if(SELECTED_CODE_INFO_ENABLED){ + vscode.commands.executeCommand('setContext', 'powerpages.copilot.isVisible', true); + } + if (pacOutput && pacOutput.Status === PAC_SUCCESS) { await this.handleOrgChangeSuccess(pacOutput.Results); } else if (!IS_DESKTOP && orgID && activeOrgUrl) { @@ -319,7 +332,7 @@ export class PowerPagesCopilot implements vscode.WebviewViewProvider { } } - private async authenticateAndSendAPIRequest(data: string, activeFileParams: IActiveFileParams, orgID: string, telemetry: ITelemetry) { + private async authenticateAndSendAPIRequest(data: UserPrompt[], activeFileParams: IActiveFileParams, orgID: string, telemetry: ITelemetry) { return intelligenceAPIAuthentication(telemetry, sessionID, orgID) .then(async ({ accessToken, user, userId }) => { intelligenceApiToken = accessToken; diff --git a/src/common/copilot/assets/copilotStrings.ts b/src/common/copilot/assets/copilotStrings.ts index 4a6e6037..c6562de5 100644 --- a/src/common/copilot/assets/copilotStrings.ts +++ b/src/common/copilot/assets/copilotStrings.ts @@ -7,5 +7,6 @@ import vscode from "vscode"; export const COPILOT_STRINGS = { - EXPLAIN_CODE_PROMPT: vscode.l10n.t('Explain the following code:'), + EXPLAIN_CODE_PROMPT: vscode.l10n.t('Explain the following code snippet:'), + LARGE_SELECTION: vscode.l10n.t('Selection is too large. Try making a shorter selection.'), } diff --git a/src/common/copilot/assets/scripts/copilot.js b/src/common/copilot/assets/scripts/copilot.js index c6d38907..c521548e 100644 --- a/src/common/copilot/assets/scripts/copilot.js +++ b/src/common/copilot/assets/scripts/copilot.js @@ -13,6 +13,7 @@ const chatMessages = document.getElementById("chat-messages"); const chatInput = document.getElementById("chat-input"); const chatInputComponent = document.getElementById("input-component"); + const skipCodes = ["", null, undefined, "violation", "unclear", "explain"]; let userName; let apiResponseHandler; @@ -24,6 +25,7 @@ let copilotStrings = {}; + const inputHistory = []; let currentIndex = -1; @@ -79,7 +81,7 @@ return resultDiv; } - if (responseText[i].code === "" || responseText[i].code === null || responseText[i].code === undefined || responseText[i].code === "violation" || responseText[i].code === "unclear") { + if (skipCodes.includes(responseText[i].code)) { continue; } @@ -147,7 +149,7 @@ const nameArray = name.split(" "); const initials = nameArray.map((word) => word.charAt(0)); const truncatedInitials = initials.slice(0, 2); - return truncatedInitials.join(""); + return truncatedInitials.join("").toUpperCase(); } @@ -455,7 +457,7 @@ break; } case "Available": { - if(isCopilotEnabled== false) { + if(isCopilotEnabled === false) { isCopilotEnabled = true; chatInputComponent.classList.remove("hide"); chatMessages.innerHTML = ""; @@ -467,12 +469,17 @@ case "selectedCodeInfo": { const chatInputLabel = document.getElementById("input-label-id"); selectedCode = message.value.selectedCode; - if (message.value.start == message.value.end && selectedCode.length == 0) { + if (selectedCode.length === 0) { chatInputLabel.classList.add("hide"); break; } chatInputLabel.classList.remove("hide"); - chatInputLabel.innerText = `Lines: ${message.value.start + 1} - ${message.value.end + 1} selected`; + if(message.value.tokenSize === false){ + chatInputLabel.innerText = copilotStrings.LARGE_SELECTION; + selectedCode = ""; + break; + } + chatInputLabel.innerText = `Lines ${message.value.start + 1} - ${message.value.end + 1} selected`; break; } case "explainCode": { @@ -520,7 +527,7 @@ chatInput.disabled = true; saveInputToHistory(input); apiResponseInProgress = true; - getApiResponse(input + ': ' + selectedCode); //TODO: userPrompt object should be passed + getApiResponse(userPrompt); //TODO: userPrompt object should be passed chatInput.value = ""; chatInput.focus(); } diff --git a/src/common/copilot/constants.ts b/src/common/copilot/constants.ts index c52224e7..34f0f4ba 100644 --- a/src/common/copilot/constants.ts +++ b/src/common/copilot/constants.ts @@ -27,6 +27,7 @@ export const PROMPT_LIMIT_EXCEEDED = 'PromptLimitExceeded'; export const INVALID_INFERENCE_INPUT = 'InvalidInferenceInput'; export const COPILOT_NOTIFICATION_DISABLED = 'isCopilotNotificationDisabled' export const EXPLAIN_CODE = 'explainCode'; +export const SELECTED_CODE_INFO = "selectedCodeInfo"; export const SELECTED_CODE_INFO_ENABLED = false; export type WebViewMessage = { @@ -35,6 +36,11 @@ export type WebViewMessage = { envName?: string; }; +export interface UserPrompt { + displayText: string; + code: string; +} + export const DataverseEntityNameMap = new Map([ ['webpage', 'adx_webpage'], ['list', 'adx_entitylist'], diff --git a/src/common/copilot/telemetry/ITelemetry.ts b/src/common/copilot/telemetry/ITelemetry.ts index b8cb287a..506c5913 100644 --- a/src/common/copilot/telemetry/ITelemetry.ts +++ b/src/common/copilot/telemetry/ITelemetry.ts @@ -18,4 +18,5 @@ export interface IProDevCopilotTelemetryData { geoName?: string, aibEndpoint?: string, orgUrl?: string, + tokenSize?: string } diff --git a/src/common/copilot/telemetry/copilotTelemetry.ts b/src/common/copilot/telemetry/copilotTelemetry.ts index 7fc729b0..af5e328e 100644 --- a/src/common/copilot/telemetry/copilotTelemetry.ts +++ b/src/common/copilot/telemetry/copilotTelemetry.ts @@ -25,7 +25,8 @@ export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IProDev telemetryDataProperties.FeedbackId = telemetryData.FeedbackId ? telemetryData.FeedbackId : ''; telemetryDataProperties.dataverseEntity = telemetryData.dataverseEntity ? telemetryData.dataverseEntity : ''; telemetryDataProperties.responseStatus = telemetryData.responseStatus ? telemetryData.responseStatus : ''; - + telemetryDataProperties.tokenSize = telemetryData.tokenSize ? telemetryData.tokenSize : ''; + if (telemetryData.error) { telemetryDataProperties.eventName = telemetryData.eventName; telemetry.sendTelemetryException(telemetryData.error, telemetryDataProperties, telemetryDataMeasurements); diff --git a/src/common/copilot/telemetry/telemetryConstants.ts b/src/common/copilot/telemetry/telemetryConstants.ts index 676646a0..7295dac8 100644 --- a/src/common/copilot/telemetry/telemetryConstants.ts +++ b/src/common/copilot/telemetry/telemetryConstants.ts @@ -33,3 +33,5 @@ export const CopilotNotificationShown = 'CopilotNotificationShown'; export const CopilotNotificationDoNotShowChecked = 'CopilotNotificationDoNotShowChecked'; export const CopilotNotificationDoNotShowUnchecked = 'CopilotNotificationDoNotShowUnchecked'; export const CopilotNotAvailable = 'CopilotNotAvailable'; +export const CopilotExplainCode = 'CopilotExplainCode'; +export const CopilotExplainCodeSize = 'CopilotExplainCodeSize'; From ebdf563ce9c1bf7d8f86462861e6936cb56dcf2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 16:55:53 +0000 Subject: [PATCH 2/2] Bump @babel/traverse from 7.20.13 to 7.23.2 (#743) --- package-lock.json | 204 +++++++++++++++++++++++++++++++--------------- 1 file changed, 140 insertions(+), 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7f0e437e..77840cfb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "powerplatform-vscode", - "version": "22.2.22", + "version": "1.0.1-dev", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "powerplatform-vscode", - "version": "22.2.22", + "version": "1.0.1-dev", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@microsoft/generator-powerpages": "1.21.19", @@ -124,16 +124,81 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/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/@babel/code-frame/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/code-frame/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/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/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/@babel/compat-data": { "version": "7.20.14", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", @@ -183,19 +248,30 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", @@ -240,34 +316,34 @@ "dev": true }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -317,30 +393,30 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } @@ -369,12 +445,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -446,9 +522,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", - "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -458,33 +534,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", - "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.13", - "@babel/types": "^7.20.7", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -502,13 +578,13 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": {