diff --git a/manifest.json b/manifest.json index bdfa7f7..93748cb 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-excalidraw-plugin", "name": "Excalidraw", - "version": "1.3.16", + "version": "1.3.17", "minAppVersion": "0.12.0", "description": "An Obsidian plugin to edit and view Excalidraw drawings", "author": "Zsolt Viczian", diff --git a/src/ExcalidrawView.ts b/src/ExcalidrawView.ts index 4f60223..9fa944d 100644 --- a/src/ExcalidrawView.ts +++ b/src/ExcalidrawView.ts @@ -1,1118 +1,1115 @@ -import { - TextFileView, - WorkspaceLeaf, - normalizePath, - TFile, - WorkspaceItem, - Notice, - Menu, -} from "obsidian"; -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import Excalidraw, {exportToSvg, getSceneVersion} from "@zsviczian/excalidraw"; -import { ExcalidrawElement,ExcalidrawTextElement } from "@zsviczian/excalidraw/types/element/types"; -import { - AppState, - LibraryItems -} from "@zsviczian/excalidraw/types/types"; -import { - VIEW_TYPE_EXCALIDRAW, - ICON_NAME, - EXCALIDRAW_LIB_HEADER, - VIRGIL_FONT, - CASCADIA_FONT, - DISK_ICON_NAME, - PNG_ICON_NAME, - SVG_ICON_NAME, - FRONTMATTER_KEY, - TEXT_DISPLAY_RAW_ICON_NAME, - TEXT_DISPLAY_PARSED_ICON_NAME, - FULLSCREEN_ICON_NAME, - JSON_parse, - IMAGE_TYPES -} from './constants'; -import ExcalidrawPlugin from './main'; -import {ExcalidrawAutomate, repositionElementsToCursor} from './ExcalidrawAutomate'; -import { t } from "./lang/helpers"; -import { ExcalidrawData, REG_LINKINDEX_HYPERLINK, REGEX_LINK } from "./ExcalidrawData"; -import { checkAndCreateFolder, download, getNewUniqueFilepath, splitFolderAndFilename, svgToBase64, viewportCoordsToSceneCoords } from "./Utils"; -import { Prompt } from "./Prompt"; -import { ClipboardData } from "@zsviczian/excalidraw/types/clipboard"; - -declare let window: ExcalidrawAutomate; - -export enum TextMode { - parsed, - raw -} - -interface WorkspaceItemExt extends WorkspaceItem { - containerEl: HTMLElement; -} - -export interface ExportSettings { - withBackground: boolean, - withTheme: boolean -} - -const REG_LINKINDEX_INVALIDCHARS = /[<>:"\\|?*]/g; - -export default class ExcalidrawView extends TextFileView { - private excalidrawData: ExcalidrawData; - private getScene: Function = null; - public addElements: Function = null; //add elements to the active Excalidraw drawing - private getSelectedTextElement: Function = null; - public addText:Function = null; - private refresh: Function = null; - public excalidrawRef: React.MutableRefObject = null; - private excalidrawWrapperRef: React.MutableRefObject = null; - private justLoaded: boolean = false; - private plugin: ExcalidrawPlugin; - private dirty: string = null; - public autosaveTimer: any = null; - public autosaving:boolean = false; - public textMode:TextMode = TextMode.raw; - private textIsParsed_Element:HTMLElement; - private textIsRaw_Element:HTMLElement; - private preventReload:boolean = true; - public compatibilityMode: boolean = false; - //store key state for view mode link resolution - private ctrlKeyDown = false; - private shiftKeyDown = false; - private altKeyDown = false; - private mouseEvent:any = null; - - id: string = (this.leaf as any).id; - - constructor(leaf: WorkspaceLeaf, plugin: ExcalidrawPlugin) { - super(leaf); - this.plugin = plugin; - this.excalidrawData = new ExcalidrawData(plugin); - } - - public saveExcalidraw(scene?: any){ - if(!scene) { - if (!this.getScene) return false; - scene = this.getScene(); - } - const filepath = this.file.path.substring(0,this.file.path.lastIndexOf('.md')) + '.excalidraw'; - const file = this.app.vault.getAbstractFileByPath(normalizePath(filepath)); - if(file && file instanceof TFile) this.app.vault.modify(file,JSON.stringify(scene)); - else this.app.vault.create(filepath,JSON.stringify(scene)); - } - - public saveSVG(scene?: any) { - if(!scene) { - if (!this.getScene) return false; - scene = this.getScene(); - } - const filepath = this.file.path.substring(0,this.file.path.lastIndexOf(this.compatibilityMode ? '.excalidraw':'.md')) + '.svg'; - const file = this.app.vault.getAbstractFileByPath(normalizePath(filepath)); - (async () => { - const exportSettings: ExportSettings = { - withBackground: this.plugin.settings.exportWithBackground, - withTheme: this.plugin.settings.exportWithTheme - } - const svg = await ExcalidrawView.getSVG(scene,exportSettings); - if(!svg) return; - let serializer =new XMLSerializer(); - const svgString = serializer.serializeToString(ExcalidrawView.embedFontsInSVG(svg)); - if(file && file instanceof TFile) await this.app.vault.modify(file,svgString); - else await this.app.vault.create(filepath,svgString); - })(); - } - - public static embedFontsInSVG(svg:SVGSVGElement):SVGSVGElement { - //replace font references with base64 fonts - const includesVirgil = svg.querySelector("text[font-family^='Virgil']") != null; - const includesCascadia = svg.querySelector("text[font-family^='Cascadia']") != null; - const defs = svg.querySelector("defs"); - if (defs && (includesCascadia || includesVirgil)) { - defs.innerHTML = ""; - } - return svg; - } - - public savePNG(scene?: any) { - if(!scene) { - if (!this.getScene) return false; - scene = this.getScene(); - } - - const filepath = this.file.path.substring(0,this.file.path.lastIndexOf(this.compatibilityMode ? '.excalidraw':'.md')) + '.png'; - const file = this.app.vault.getAbstractFileByPath(normalizePath(filepath)); - - (async () => { - const exportSettings: ExportSettings = { - withBackground: this.plugin.settings.exportWithBackground, - withTheme: this.plugin.settings.exportWithTheme - } - const png = await ExcalidrawView.getPNG(scene,exportSettings,this.plugin.settings.pngExportScale); - if(!png) return; - if(file && file instanceof TFile) await this.app.vault.modifyBinary(file,await png.arrayBuffer()); - else await this.app.vault.createBinary(filepath,await png.arrayBuffer()); - })(); - } - - async save(preventReload:boolean=true) { - if(!this.getScene) return; - this.preventReload = preventReload; - this.dirty = null; - - if(this.compatibilityMode) { - await this.excalidrawData.syncElements(this.getScene()); - } else { - if(await this.excalidrawData.syncElements(this.getScene()) && !this.autosaving) { - await this.loadDrawing(false); - } - } - await super.save(); - } - - // get the new file content - // if drawing is in Text Element Edit Lock, then everything should be parsed and in sync - // if drawing is in Text Element Edit Unlock, then everything is raw and parse and so an async function is not required here - getViewData () { - //console.log("ExcalidrawView.getViewData()"); - if(!this.getScene) return this.data; - if(!this.excalidrawData.loaded) return this.data; - if(!this.compatibilityMode) { - let trimLocation = this.data.search(/(^%%\n)?# Text Elements\n/m); - if(trimLocation == -1) trimLocation = this.data.search(/(%%\n)?# Drawing\n/); - if(trimLocation == -1) return this.data; - - const scene = this.excalidrawData.scene; - if(!this.autosaving) { - if(this.plugin.settings.autoexportSVG) this.saveSVG(scene); - if(this.plugin.settings.autoexportPNG) this.savePNG(scene); - if(this.plugin.settings.autoexportExcalidraw) this.saveExcalidraw(scene); - } - - const header = this.data.substring(0,trimLocation) - .replace(/excalidraw-plugin:\s.*\n/,FRONTMATTER_KEY+": " + ( (this.textMode == TextMode.raw) ? "raw\n" : "parsed\n")); - return header + this.excalidrawData.generateMD(); - } - if(this.compatibilityMode) { - const scene = this.excalidrawData.scene; - if(!this.autosaving) { - if(this.plugin.settings.autoexportSVG) this.saveSVG(scene); - if(this.plugin.settings.autoexportPNG) this.savePNG(scene); - } - return JSON.stringify(scene); - } - return this.data; - } - - async handleLinkClick(view: ExcalidrawView, ev:MouseEvent) { - let text:string = (this.textMode == TextMode.parsed) - ? this.excalidrawData.getRawText(this.getSelectedTextElement().id) - : this.getSelectedTextElement().text; - if(!text) { - new Notice(t("LINK_BUTTON_CLICK_NO_TEXT"),20000); - return; - } - if(text.match(REG_LINKINDEX_HYPERLINK)) { - window.open(text,"_blank"); - return; - } - - const parts = text.matchAll(REGEX_LINK.EXPR).next(); - if(!parts.value) { - const tags = text.matchAll(/#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/ug).next(); - if(!tags.value || tags.value.length<2) { - new Notice(t("TEXT_ELEMENT_EMPTY"),4000); - return; - } - const search=this.app.workspace.getLeavesOfType("search"); - if(search.length==0) return; - //@ts-ignore - search[0].view.setQuery("tag:"+tags.value[1]); - this.app.workspace.revealLeaf(search[0]); - //if(this.gotoFullscreen.style.display=="none") this.toggleFullscreen(); - if(document.fullscreenElement === this.contentEl) { - document.exitFullscreen(); - this.zoomToFit(); - } - return; - } - - text = REGEX_LINK.getLink(parts); //parts.value[2] ? parts.value[2]:parts.value[6]; - - if(text.match(REG_LINKINDEX_HYPERLINK)) { - window.open(text,"_blank"); - return; - } - - let lineNum = null; - if(text.search("#")>-1) { - let t; - [t,lineNum] = await this.excalidrawData.getTransclusion(text); - text = text.substring(0,text.search("#")); - } - if(text.match(REG_LINKINDEX_INVALIDCHARS)) { - new Notice(t("FILENAME_INVALID_CHARS"),4000); - return; - } - const file = view.app.metadataCache.getFirstLinkpathDest(text,view.file.path); - if (!ev.altKey && !file) { - new Notice(t("FILE_DOES_NOT_EXIST"), 4000); - return; - } - - try { - const f = view.file; - if(ev.shiftKey && document.fullscreenElement === this.contentEl) { - document.exitFullscreen(); - this.zoomToFit(); - } - if(lineNum) { - const leaf = ev.shiftKey ? view.app.workspace.createLeafBySplit(view.leaf) : view.leaf; - leaf.openFile(file,{eState: {line: lineNum-1}}); - return; - } - view.app.workspace.openLinkText(text,view.file.path,ev.shiftKey); - } catch (e) { - new Notice(e,4000); - } - } - - onResize() { - if(!this.plugin.settings.zoomToFitOnResize) return; - if(!this.excalidrawRef) return; - this.zoomToFit(false); - } - - onload() { - //console.log("ExcalidrawView.onload()"); - this.addAction(DISK_ICON_NAME,t("FORCE_SAVE"),async (ev)=> { - await this.save(false); - this.plugin.triggerEmbedUpdates(); - }); - - this.textIsRaw_Element = this.addAction(TEXT_DISPLAY_RAW_ICON_NAME,t("RAW"), (ev) => this.changeTextMode(TextMode.parsed)); - this.textIsParsed_Element = this.addAction(TEXT_DISPLAY_PARSED_ICON_NAME,t("PARSED"), (ev) => this.changeTextMode(TextMode.raw)); - - this.addAction("link",t("OPEN_LINK"), (ev)=>this.handleLinkClick(this,ev)); - - if(!this.app.isMobile) { - this.addAction(FULLSCREEN_ICON_NAME,"Press ESC to exit fullscreen mode",()=>{ - this.contentEl.requestFullscreen();//{navigationUI: "hide"}); - if(this.excalidrawWrapperRef) this.excalidrawWrapperRef.current.focus(); - }); - this.contentEl.onfullscreenchange = () => { - this.zoomToFit(); - } - } - - //this is to solve sliding panes bug - if (this.app.workspace.layoutReady) { - (this.app.workspace.rootSplit as WorkspaceItem as WorkspaceItemExt).containerEl.addEventListener('scroll',(e)=>{if(this.refresh) this.refresh();}); - } else { - this.app.workspace.onLayoutReady( - async () => (this.app.workspace.rootSplit as WorkspaceItem as WorkspaceItemExt).containerEl.addEventListener('scroll',(e)=>{if(this.refresh) this.refresh();}) - ); - } - this.setupAutosaveTimer(); - } - - public async changeTextMode(textMode:TextMode,reload:boolean=true) { - this.textMode = textMode; - if(textMode == TextMode.parsed) { - this.textIsRaw_Element.hide(); - this.textIsParsed_Element.show(); - } else { - this.textIsRaw_Element.show(); - this.textIsParsed_Element.hide(); - } - if(reload) { - await this.save(false); - this.excalidrawRef.current.history.clear(); //to avoid undo replacing links with parsed text - } - } - - public setupAutosaveTimer() { - const timer = async () => { - if(this.dirty && (this.dirty == this.file?.path)) { - this.dirty = null; - this.autosaving=true; - if(this.excalidrawRef) await this.save(); - this.autosaving=false; - } - } - if(this.autosaveTimer) clearInterval(this.autosaveTimer); // clear previous timer if one exists - this.autosaveTimer = setInterval(timer,20000); - } - - //save current drawing when user closes workspace leaf - async onunload() { - if(this.autosaveTimer) { - clearInterval(this.autosaveTimer); - this.autosaveTimer = null; - } - } - - public async reload(fullreload:boolean = false, file?:TFile){ - if(this.preventReload) { - this.preventReload = false; - return; - } - if(!this.excalidrawRef) return; - if(!this.file) return; - if(file) this.data = await this.app.vault.cachedRead(file); - if(fullreload) await this.excalidrawData.loadData(this.data, this.file,this.textMode); - else await this.excalidrawData.setTextMode(this.textMode); - await this.loadDrawing(false); - this.dirty = null; - } - - // clear the view content - clear() { - if(!this.excalidrawRef) return; - this.excalidrawRef.current.resetScene(); - this.excalidrawRef.current.history.clear(); - } - - async setViewData (data: string, clear: boolean = false) { - if(clear) this.clear(); - data = this.data = data.replaceAll("\r\n","\n").replaceAll("\r","\n"); - this.app.workspace.onLayoutReady(async ()=>{ - this.dirty = null; - this.compatibilityMode = this.file.extension == "excalidraw"; - await this.plugin.loadSettings(); - this.plugin.opencount++; - if(this.compatibilityMode) { - this.textIsRaw_Element.hide(); - this.textIsParsed_Element.hide(); - await this.excalidrawData.loadLegacyData(data,this.file); - if (!this.plugin.settings.compatibilityMode) { - new Notice(t("COMPATIBILITY_MODE"),4000); - } - } else { - const parsed = data.search("excalidraw-plugin: parsed\n")>-1 || data.search("excalidraw-plugin: locked\n")>-1; //locked for backward compatibility - this.changeTextMode(parsed ? TextMode.parsed : TextMode.raw,false); - try { - if(!(await this.excalidrawData.loadData(data, this.file,this.textMode))) return; - } catch(e) { - new Notice( "Error loading drawing:\n" - + e.message - + ((e.message === "Cannot read property 'index' of undefined") - ? "\n'# Drawing' section is likely missing" - : "") - + "\nTry manually fixing the file or restoring an earlier version from sync history" ,8000); - this.setMarkdownView(); - return; - } - } - await this.loadDrawing(true) - }); - } - - /** - * - * @param justloaded - a flag to trigger zoom to fit after the drawing has been loaded - */ - private async loadDrawing(justloaded:boolean) { - const excalidrawData = this.excalidrawData.scene; - this.justLoaded = justloaded; - if(this.excalidrawRef) { - const viewModeEnabled = this.excalidrawRef.current.getAppState().viewModeEnabled; - const zenModeEnabled = this.excalidrawRef.current.getAppState().zenModeEnabled; - this.excalidrawRef.current.updateScene({ - elements: excalidrawData.elements, - appState: { - zenModeEnabled: zenModeEnabled, - viewModeEnabled: viewModeEnabled, - ... excalidrawData.appState, - }, - commitToHistory: true, - }); - if((this.app.workspace.activeLeaf === this.leaf) && this.excalidrawWrapperRef) { - this.excalidrawWrapperRef.current.focus(); - } - } else { - this.instantiateExcalidraw({ - elements: excalidrawData.elements, - appState: excalidrawData.appState, - libraryItems: await this.getLibrary(), - }); - } - } - - //Compatibility mode with .excalidraw files - canAcceptExtension(extension: string) { - return extension == "excalidraw"; - } - - // gets the title of the document - getDisplayText() { - if(this.file) return this.file.basename; - else return t("NOFILE"); - } - - // the view type name - getViewType() { - return VIEW_TYPE_EXCALIDRAW; - } - - // icon for the view - getIcon() { - return ICON_NAME; - } - - setMarkdownView() { - if(this.excalidrawRef) { - const el = this.excalidrawRef.current.getSceneElements(); - if(el.filter((e:any)=>e.type==="image").length>0) { - new Notice(t("DRAWING_CONTAINS_IMAGE"),6000); - } - } - this.plugin.excalidrawFileModes[this.id || this.file.path] = "markdown"; - this.plugin.setMarkdownView(this.leaf); - } - - onMoreOptionsMenu(menu: Menu) { - // Add a menu item to force the board to markdown view - if(!this.compatibilityMode) { - menu - .addItem((item) => { - item - .setTitle(t("OPEN_AS_MD")) - .setIcon("document") - .onClick(async () => { - this.setMarkdownView(); - }); - }) - .addItem((item) => { - item - .setTitle(t("EXPORT_EXCALIDRAW")) - .setIcon(ICON_NAME) - .onClick( async (ev) => { - if(!this.getScene || !this.file) return; - //@ts-ignore - if(this.app.isMobile) { - const prompt = new Prompt(this.app, "Please provide filename",this.file.basename,'filename, leave blank to cancel action'); - prompt.openAndGetValue( async (filename:string)=> { - if(!filename) return; - filename = filename + ".excalidraw"; - const folderpath = splitFolderAndFilename(this.file.path).folderpath; - await checkAndCreateFolder(this.app.vault,folderpath); //create folder if it does not exist - const fname = getNewUniqueFilepath(this.app.vault,filename,folderpath); - this.app.vault.create(fname,JSON.stringify(this.getScene())); - new Notice("Exported to " + fname,6000); - }); - return; - } - download('data:text/plain;charset=utf-8',encodeURIComponent(JSON.stringify(this.getScene())), this.file.basename+'.excalidraw'); - }); - }); - } else { - menu - .addItem((item) => { - item - .setTitle(t("CONVERT_FILE")) - .onClick(async () => { - await this.save(); - this.plugin.openDrawing(await this.plugin.convertSingleExcalidrawToMD(this.file),false); - }); - }); - } - menu - .addItem((item) => { - item - .setTitle(t("SAVE_AS_PNG")) - .setIcon(PNG_ICON_NAME) - .onClick( async (ev)=> { - if(!this.getScene || !this.file) return; - if(ev.ctrlKey || ev.metaKey) { - const exportSettings: ExportSettings = { - withBackground: this.plugin.settings.exportWithBackground, - withTheme: this.plugin.settings.exportWithTheme - } - const png = await ExcalidrawView.getPNG(this.getScene(),exportSettings,this.plugin.settings.pngExportScale); - if(!png) return; - let reader = new FileReader(); - reader.readAsDataURL(png); - const self = this; - reader.onloadend = function() { - let base64data = reader.result; - download(null,base64data,self.file.basename+'.png'); - } - return; - } - this.savePNG(); - }); - }) - .addItem((item) => { - item - .setTitle(t("SAVE_AS_SVG")) - .setIcon(SVG_ICON_NAME) - .onClick(async (ev)=> { - if(!this.getScene || !this.file) return; - if(ev.ctrlKey || ev.metaKey) { - const exportSettings: ExportSettings = { - withBackground: this.plugin.settings.exportWithBackground, - withTheme: this.plugin.settings.exportWithTheme - } - let svg = await ExcalidrawView.getSVG(this.getScene(),exportSettings); - if(!svg) return null; - svg = ExcalidrawView.embedFontsInSVG(svg); - download(null,svgToBase64(svg.outerHTML),this.file.basename+'.svg'); - return; - } - this.saveSVG() - }); - }) - .addSeparator(); - super.onMoreOptionsMenu(menu); - } - - async getLibrary() { - const data = JSON_parse(this.plugin.getStencilLibrary()); - return data?.library ? data.library : []; - } - - - private instantiateExcalidraw(initdata: any) { - //console.log("ExcalidrawView.instantiateExcalidraw()"); - this.dirty = null; - const reactElement = React.createElement(() => { - let previousSceneVersion = 0; - let currentPosition = {x:0, y:0}; - const excalidrawRef = React.useRef(null); - const excalidrawWrapperRef = React.useRef(null); - const [dimensions, setDimensions] = React.useState({ - width: undefined, - height: undefined - }); - - this.excalidrawRef = excalidrawRef; - this.excalidrawWrapperRef = excalidrawWrapperRef; - - React.useEffect(() => { - setDimensions({ - width: this.contentEl.clientWidth, - height: this.contentEl.clientHeight, - }); - - const onResize = () => { - try { - setDimensions({ - width: this.contentEl.clientWidth, - height: this.contentEl.clientHeight, - }); - } catch(err) {console.log ("Excalidraw React-Wrapper, onResize ",err)} - }; - window.addEventListener("resize", onResize); - return () => window.removeEventListener("resize", onResize); - }, [excalidrawWrapperRef]); - - - this.getSelectedTextElement = ():{id: string, text:string} => { - if(!excalidrawRef?.current) return {id:null,text:null}; - if(this.excalidrawRef.current.getAppState().viewModeEnabled) { - if(selectedTextElement) { - const retval = selectedTextElement; - selectedTextElement == null; - return retval; - } - return {id:null,text:null}; - } - const selectedElement = excalidrawRef.current.getSceneElements().filter((el:any)=>el.id==Object.keys(excalidrawRef.current.getAppState().selectedElementIds)[0]); - if(selectedElement.length==0) return {id:null,text:null}; - if(selectedElement[0].type == "text") return {id:selectedElement[0].id, text:selectedElement[0].text}; //a text element was selected. Return text - if(selectedElement[0].groupIds.length == 0) return {id:null,text:null}; //is the selected element part of a group? - const group = selectedElement[0].groupIds[0]; //if yes, take the first group it is part of - const textElement = excalidrawRef - .current - .getSceneElements() - .filter((el:any)=>el.groupIds?.includes(group)) - .filter((el:any)=>el.type=="text"); //filter for text elements of the group - if(textElement.length==0) return {id:null,text:null}; //the group had no text element member - return {id:selectedElement[0].id, text:selectedElement[0].text}; //return text element text - }; - - this.addText = (text:string, fontFamily?:1|2|3) => { - if(!excalidrawRef?.current) { - return; - } - const el: ExcalidrawElement[] = excalidrawRef.current.getSceneElements(); - const st: AppState = excalidrawRef.current.getAppState(); - window.ExcalidrawAutomate.reset(); - window.ExcalidrawAutomate.style.strokeColor = st.currentItemStrokeColor; - window.ExcalidrawAutomate.style.opacity = st.currentItemOpacity; - window.ExcalidrawAutomate.style.fontFamily = fontFamily ? fontFamily: st.currentItemFontFamily; - window.ExcalidrawAutomate.style.fontSize = st.currentItemFontSize; - window.ExcalidrawAutomate.style.textAlign = st.currentItemTextAlign; - const id:string = window.ExcalidrawAutomate.addText(currentPosition.x, currentPosition.y, text); - this.addElements(window.ExcalidrawAutomate.getElements(),false,true); - } - - this.addElements = async (newElements:ExcalidrawElement[],repositionToCursor:boolean = false, save:boolean=false, images:any):Promise => { - if(!excalidrawRef?.current) return false; - - const textElements = newElements.filter((el)=>el.type=="text"); - for(let i=0;i{ - st.files[k]={ - type:images[k].type, - id: images[k].id, - dataURL: images[k].dataURL - } - }); - } - //merge appstate.files with files - if(repositionToCursor) newElements = repositionElementsToCursor(newElements,currentPosition,true); - this.excalidrawRef.current.updateScene({ - elements: el.concat(newElements), - appState: st, - commitToHistory: true, - }); - if(save) this.save(); else this.dirty = this.file?.path; - return true; - }; - - this.getScene = () => { - if(!excalidrawRef?.current) { - return null; - } - const el: ExcalidrawElement[] = excalidrawRef.current.getSceneElements(); - const st: AppState = excalidrawRef.current.getAppState(); - - if(st.files) { - const imgIds = el.filter((e)=>e.type=="image").map((e:any)=>e.imageId); - const toDelete = Object.keys(st.files).filter((k)=>!imgIds.contains(k)); - toDelete.forEach((k)=>delete st.files[k]); - } - - return { - type: "excalidraw", - version: 2, - source: "https://excalidraw.com", - elements: el, - appState: { - theme: st.theme, - viewBackgroundColor: st.viewBackgroundColor, - currentItemStrokeColor: st.currentItemStrokeColor, - currentItemBackgroundColor: st.currentItemBackgroundColor, - currentItemFillStyle: st.currentItemFillStyle, - currentItemStrokeWidth: st.currentItemStrokeWidth, - currentItemStrokeStyle: st.currentItemStrokeStyle, - currentItemRoughness: st.currentItemRoughness, - currentItemOpacity: st.currentItemOpacity, - currentItemFontFamily: st.currentItemFontFamily, - currentItemFontSize: st.currentItemFontSize, - currentItemTextAlign: st.currentItemTextAlign, - currentItemStrokeSharpness: st.currentItemStrokeSharpness, - currentItemStartArrowhead: st.currentItemStartArrowhead, - currentItemEndArrowhead: st.currentItemEndArrowhead, - currentItemLinearStrokeSharpness: st.currentItemLinearStrokeSharpness, - gridSize: st.gridSize, - files: st.files??{}, - } - }; - }; - - this.refresh = () => { - if(!excalidrawRef?.current) return; - excalidrawRef.current.refresh(); - }; - - //variables used to handle click events in view mode - let selectedTextElement:{id:string,text:string} = null; - let timestamp = 0; - let blockOnMouseButtonDown = false; - - const getTextElementAtPointer = (pointer:any) => { - const elements = this.excalidrawRef.current.getSceneElements() - .filter((e:ExcalidrawElement)=>{ - return e.type == "text" - && e.x<=pointer.x && (e.x+e.width)>=pointer.x - && e.y<=pointer.y && (e.y+e.height)>=pointer.y; - }); - if(elements.length==0) return null; - return {id:elements[0].id,text:elements[0].text}; - } - - let hoverPoint = {x:0,y:0}; - let hoverPreviewTarget:EventTarget = null; - const clearHoverPreview = () => { - if(hoverPreviewTarget) { - const event = new MouseEvent('click', { - 'view': window, - 'bubbles': true, - 'cancelable': true, - }); - hoverPreviewTarget.dispatchEvent(event); - hoverPreviewTarget = null; - } - } - - const dropAction = (transfer: DataTransfer) => { - // Return a 'copy' or 'link' action according to the content types, or undefined if no recognized type - - //if (transfer.types.includes('text/uri-list')) return 'link'; - let files = (this.app as any).dragManager.draggable?.files; - if(files) { - if(files[0] == this.file) { - files.shift(); - (this.app as any).dragManager.draggable.title = files.length + " files"; - } - } - if (['file', 'files'].includes((this.app as any).dragManager.draggable?.type)) return 'link'; - if (transfer.types?.includes('text/html') || transfer.types?.includes('text/plain')) return 'copy'; - } - - const excalidrawDiv = React.createElement( - "div", - { - className: "excalidraw-wrapper", - ref: excalidrawWrapperRef, - key: "abc", - tabIndex: 0, - onKeyDown: (e:any) => { - //@ts-ignore - if(e.target === excalidrawDiv.ref.current) return; //event should originate from the canvas - if(document.fullscreenEnabled && document.fullscreenElement == this.contentEl && e.keyCode==27) { - document.exitFullscreen(); - this.zoomToFit(); - } - - this.ctrlKeyDown = e.ctrlKey || e.metaKey; - this.shiftKeyDown = e.shiftKey; - this.altKeyDown = e.altKey; - - if(e.ctrlKey && !e.shiftKey && !e.altKey) { // && !e.metaKey) { - const selectedElement = getTextElementAtPointer(currentPosition); - if(!selectedElement) return; - - const text:string = (this.textMode == TextMode.parsed) - ? this.excalidrawData.getRawText(selectedElement.id) - : selectedElement.text; - - if(!text) return; - if(text.match(REG_LINKINDEX_HYPERLINK)) return; - - const parts = text.matchAll(REGEX_LINK.EXPR).next(); - if(!parts.value) return; - let linktext = REGEX_LINK.getLink(parts); //parts.value[2] ? parts.value[2]:parts.value[6]; - - if(linktext.match(REG_LINKINDEX_HYPERLINK)) return; - - this.plugin.hover.linkText = linktext; - this.plugin.hover.sourcePath = this.file.path; - hoverPreviewTarget = this.contentEl; //e.target; - this.app.workspace.trigger('hover-link', { - event: this.mouseEvent, - source: VIEW_TYPE_EXCALIDRAW, - hoverParent: hoverPreviewTarget, - targetEl: hoverPreviewTarget, - linktext: this.plugin.hover.linkText, - sourcePath: this.plugin.hover.sourcePath - }); - hoverPoint = currentPosition; - if(document.fullscreenElement === this.contentEl) { - const self = this; - setTimeout(()=>{ - const popover = document.body.querySelector("div.popover"); - if(popover) self.contentEl.append(popover); - },100) - } - } - }, - onKeyUp: (e:any) => { - this.ctrlKeyDown = e.ctrlKey || e.metaKey; - this.shiftKeyDown = e.shiftKey; - this.altKeyDown = e.altKey; - }, - onClick: (e:MouseEvent):any => { - //@ts-ignore - if(!(e.ctrlKey||e.metaKey)) return; - if(!(this.plugin.settings.allowCtrlClick)) return; - if(!this.getSelectedTextElement().id) return; - this.handleLinkClick(this,e); - }, - onMouseMove: (e:MouseEvent) => { - //@ts-ignore - this.mouseEvent = e.nativeEvent; - }, - onMouseOver: (e:MouseEvent) => { - clearHoverPreview(); - }, - onDragOver: (e:any) => { - const action = dropAction(e.dataTransfer); - if (action) { - e.dataTransfer.dropEffect = action; - e.preventDefault(); - return false; - } - }, - onDragLeave: () => { }, - }, - React.createElement(Excalidraw.default, { - ref: excalidrawRef, - width: dimensions.width, - height: dimensions.height, - UIOptions: { - canvasActions: { - loadScene: false, - saveScene: false, - saveAsScene: false, - export: { saveFileToDisk: false }, - saveAsImage: false, - saveToActiveFile: false, - }, - }, - initialData: initdata, - detectScroll: true, - onPointerUpdate: (p:any) => { - currentPosition = p.pointer; - if(hoverPreviewTarget && (Math.abs(hoverPoint.x-p.pointer.x)>50 || Math.abs(hoverPoint.y-p.pointer.y)>50)) clearHoverPreview(); - if(!this.excalidrawRef.current.getAppState().viewModeEnabled) return; - const handleLinkClick = () => { - selectedTextElement = getTextElementAtPointer(p.pointer); - if(selectedTextElement) { - const event = new MouseEvent("click", {ctrlKey: true, shiftKey: this.shiftKeyDown, altKey:this.altKeyDown}); - this.handleLinkClick(this,event); - selectedTextElement = null; - } - } - - const buttonDown = !blockOnMouseButtonDown && p.button=="down"; - if(buttonDown) { - blockOnMouseButtonDown = true; - - //ctrl click - if(this.ctrlKeyDown) { - handleLinkClick(); - return; - } - - //dobule click - const now = (new Date()).getTime(); - if(now-timestamp < 600) { - handleLinkClick(); - } - timestamp = now; - return; - } - if (p.button=="up") { - blockOnMouseButtonDown=false; - } - }, - onChange: (et:ExcalidrawElement[],st:AppState) => { - if(this.justLoaded) { - this.justLoaded = false; - this.zoomToFit(false); - previousSceneVersion = getSceneVersion(et); - return; - } - if (st.editingElement == null && st.resizingElement == null && - st.draggingElement == null && st.editingGroupId == null && - st.editingLinearElement == null ) { - const sceneVersion = getSceneVersion(et); - if(sceneVersion != previousSceneVersion) { - previousSceneVersion = sceneVersion; - this.dirty=this.file?.path; - } - } - }, - onLibraryChange: (items:LibraryItems) => { - (async () => { - this.plugin.setStencilLibrary(EXCALIDRAW_LIB_HEADER+JSON.stringify(items)+'}'); - await this.plugin.saveSettings(); - })(); - }, - onPaste: (data: ClipboardData, event: ClipboardEvent | null) => { - if(data.elements) { - const self = this; - setTimeout(()=>self.save(false),300); - } - return true; - }, - onDrop: (event: React.DragEvent):boolean => { - const st: AppState = excalidrawRef.current.getAppState(); - currentPosition = viewportCoordsToSceneCoords({ clientX: event.clientX, clientY: event.clientY },st); - - const draggable = (this.app as any).dragManager.draggable; - const onDropHook = (type:"file"|"text"|"unknown", files:TFile[], text:string):boolean => { - if (window.ExcalidrawAutomate.onDropHook) { - try { - return window.ExcalidrawAutomate.onDropHook({ - //@ts-ignore - ea: window.ExcalidrawAutomate, //the Excalidraw Automate object - event: event, //React.DragEvent - draggable: draggable, //Obsidian draggable object - type: type, //"file"|"text" - payload: { - files: files, //TFile[] array of dropped files - text: text, //string - }, - excalidrawFile: this.file, //the file receiving the drop event - view: this, //the excalidraw view receiving the drop - pointerPosition: currentPosition //the pointer position on canvas at the time of drop - }); - } catch (e) { - new Notice("on drop hook error. See console log for details"); - console.log(e); - return false; - } - } else { - return false; - } - - } - - switch(draggable?.type) { - case "file": - if (!onDropHook("file",[draggable.file],null)) { - if((event.ctrlKey || event.metaKey) - && (IMAGE_TYPES.contains(draggable.file.extension) - || this.plugin.isExcalidrawFile(draggable.file))) { - const f = draggable.file; - const topX = currentPosition.x; - const topY = currentPosition.y; - const ea = window.ExcalidrawAutomate; - ea.reset(); - ea.setView(this); - (async () => { - await ea.addImage(currentPosition.x,currentPosition.y,draggable.file); - ea.addElementsToView(false,false); - })(); - return false; - } - this.addText(`[[${this.app.metadataCache.fileToLinktext(draggable.file,this.file.path,true)}]]`); - } - return false; - case "files": - if (!onDropHook("file",draggable.files,null)) { - for(const f of draggable.files) { - this.addText(`[[${this.app.metadataCache.fileToLinktext(f,this.file.path,true)}]]`); - currentPosition.y+=st.currentItemFontSize*2; - } - } - return false; - } - if (event.dataTransfer.types.includes("text/plain")) { - const text:string = event.dataTransfer.getData("text"); - if(!text) return true; - if (!onDropHook("text",null,text)) { - this.addText(text.replace(/(!\[\[.*#[^\]]*\]\])/g,"$1{40}")); - } - return false; - } - if(onDropHook("unknown",null,null)) return false; - return true; - }, - onBeforeTextEdit: (textElement: ExcalidrawTextElement) => { - if(this.autosaveTimer) { //stopping autosave to avoid autosave overwriting text while the user edits it - clearInterval(this.autosaveTimer); - this.autosaveTimer = null; - } - //if(this.textMode==TextMode.parsed) { - const raw = this.excalidrawData.getRawText(textElement.id); - if(!raw) return textElement.rawText; - return raw; - /*} - return null;*/ - }, - onBeforeTextSubmit: (textElement: ExcalidrawTextElement, text:string, isDeleted:boolean) => { - if(isDeleted) { - this.excalidrawData.deleteTextElement(textElement.id); - this.dirty=this.file?.path; - this.setupAutosaveTimer(); - return; - } - //If the parsed text is different than the raw text, and if View is in TextMode.parsed - //Then I need to clear the undo history to avoid overwriting raw text with parsed text and losing links - if(text!=textElement.text || !this.excalidrawData.getRawText(textElement.id)) { //the user made changes to the text or the text is missing from Excalidraw Data (recently copy/pasted) - //setTextElement will attempt a quick parse (without processing transclusions) - const parseResult = this.excalidrawData.setTextElement(textElement.id, text,async ()=>{ - await this.save(false); - //this callback function will only be invoked if quick parse fails, i.e. there is a transclusion in the raw text - //thus I only check if TextMode.parsed, text is always != with parseResult - if(this.textMode == TextMode.parsed) this.excalidrawRef.current.history.clear(); - this.setupAutosaveTimer(); - }); - if(parseResult) { //there were no transclusions in the raw text, quick parse was successful - this.setupAutosaveTimer(); - if(this.textMode == TextMode.raw) return; //text is displayed in raw, no need to clear the history, undo will not create problems - if(text == parseResult) return; //There were no links to parse, raw text and parsed text are equivalent - this.excalidrawRef.current.history.clear(); - return parseResult; - } - return; - } - this.setupAutosaveTimer(); - if(this.textMode==TextMode.parsed) return this.excalidrawData.getParsedText(textElement.id); - } - }) - ); - - return React.createElement( - React.Fragment, - null, - excalidrawDiv - ); - - }); - ReactDOM.render(reactElement,this.contentEl,()=>this.excalidrawWrapperRef.current.focus()); - } - - public zoomToFit(delay:boolean = true) { - if(!this.excalidrawRef) return; - const current = this.excalidrawRef.current; - const fullscreen = (document.fullscreenElement==this.contentEl); - const elements = current.getSceneElements(); - if(delay) { //time for the DOM to render, I am sure there is a more elegant solution - setTimeout(() => current.zoomToFit(elements,2,fullscreen?0:0.05),100); - } else { - current.zoomToFit(elements,2,fullscreen?0:0.05); - } - } - - public static async getSVG(scene:any, exportSettings:ExportSettings):Promise { - try { - return exportToSvg({ - elements: scene.elements, - appState: { - exportBackground: exportSettings.withBackground, - exportWithDarkMode: exportSettings.withTheme ? (scene.appState?.theme=="light" ? false : true) : false, - ... scene.appState,}, - exportPadding:10, - }); - } catch (error) { - return null; - } - } - - public static async getPNG(scene:any, exportSettings:ExportSettings, scale:number = 1) { - try { - return await Excalidraw.exportToBlob({ - elements: scene.elements, - appState: { - exportBackground: exportSettings.withBackground, - exportWithDarkMode: exportSettings.withTheme ? (scene.appState?.theme=="light" ? false : true) : false, - ... scene.appState,}, - mimeType: "image/png", - exportWithDarkMode: "true", - metadata: "Generated by Excalidraw-Obsidian plugin", - getDimensions: (width:number, height:number) => ({ width:width*scale, height:height*scale, scale:scale }) - }); - } catch (error) { - return null; - } - } -} +import { + TextFileView, + WorkspaceLeaf, + normalizePath, + TFile, + WorkspaceItem, + Notice, + Menu, +} from "obsidian"; +import * as React from "react"; +import * as ReactDOM from "react-dom"; +import Excalidraw, {exportToSvg, getSceneVersion} from "@zsviczian/excalidraw"; +import { ExcalidrawElement,ExcalidrawTextElement } from "@zsviczian/excalidraw/types/element/types"; +import { + AppState, + LibraryItems +} from "@zsviczian/excalidraw/types/types"; +import { + VIEW_TYPE_EXCALIDRAW, + ICON_NAME, + EXCALIDRAW_LIB_HEADER, + VIRGIL_FONT, + CASCADIA_FONT, + DISK_ICON_NAME, + PNG_ICON_NAME, + SVG_ICON_NAME, + FRONTMATTER_KEY, + TEXT_DISPLAY_RAW_ICON_NAME, + TEXT_DISPLAY_PARSED_ICON_NAME, + FULLSCREEN_ICON_NAME, + JSON_parse, + IMAGE_TYPES +} from './constants'; +import ExcalidrawPlugin from './main'; +import {ExcalidrawAutomate, repositionElementsToCursor} from './ExcalidrawAutomate'; +import { t } from "./lang/helpers"; +import { ExcalidrawData, REG_LINKINDEX_HYPERLINK, REGEX_LINK } from "./ExcalidrawData"; +import { checkAndCreateFolder, download, getNewOrAdjacentLeaf, getNewUniqueFilepath, splitFolderAndFilename, svgToBase64, viewportCoordsToSceneCoords } from "./Utils"; +import { Prompt } from "./Prompt"; +import { ClipboardData } from "@zsviczian/excalidraw/types/clipboard"; + +declare let window: ExcalidrawAutomate; + +export enum TextMode { + parsed, + raw +} + +interface WorkspaceItemExt extends WorkspaceItem { + containerEl: HTMLElement; +} + +export interface ExportSettings { + withBackground: boolean, + withTheme: boolean +} + +const REG_LINKINDEX_INVALIDCHARS = /[<>:"\\|?*]/g; + +export default class ExcalidrawView extends TextFileView { + private excalidrawData: ExcalidrawData; + private getScene: Function = null; + public addElements: Function = null; //add elements to the active Excalidraw drawing + private getSelectedTextElement: Function = null; + public addText:Function = null; + private refresh: Function = null; + public excalidrawRef: React.MutableRefObject = null; + private excalidrawWrapperRef: React.MutableRefObject = null; + private justLoaded: boolean = false; + private plugin: ExcalidrawPlugin; + private dirty: string = null; + public autosaveTimer: any = null; + public autosaving:boolean = false; + public textMode:TextMode = TextMode.raw; + private textIsParsed_Element:HTMLElement; + private textIsRaw_Element:HTMLElement; + private preventReload:boolean = true; + public compatibilityMode: boolean = false; + //store key state for view mode link resolution + private ctrlKeyDown = false; + private shiftKeyDown = false; + private altKeyDown = false; + private mouseEvent:any = null; + + id: string = (this.leaf as any).id; + + constructor(leaf: WorkspaceLeaf, plugin: ExcalidrawPlugin) { + super(leaf); + this.plugin = plugin; + this.excalidrawData = new ExcalidrawData(plugin); + } + + public saveExcalidraw(scene?: any){ + if(!scene) { + if (!this.getScene) return false; + scene = this.getScene(); + } + const filepath = this.file.path.substring(0,this.file.path.lastIndexOf('.md')) + '.excalidraw'; + const file = this.app.vault.getAbstractFileByPath(normalizePath(filepath)); + if(file && file instanceof TFile) this.app.vault.modify(file,JSON.stringify(scene)); + else this.app.vault.create(filepath,JSON.stringify(scene)); + } + + public saveSVG(scene?: any) { + if(!scene) { + if (!this.getScene) return false; + scene = this.getScene(); + } + const filepath = this.file.path.substring(0,this.file.path.lastIndexOf(this.compatibilityMode ? '.excalidraw':'.md')) + '.svg'; + const file = this.app.vault.getAbstractFileByPath(normalizePath(filepath)); + (async () => { + const exportSettings: ExportSettings = { + withBackground: this.plugin.settings.exportWithBackground, + withTheme: this.plugin.settings.exportWithTheme + } + const svg = await ExcalidrawView.getSVG(scene,exportSettings); + if(!svg) return; + let serializer =new XMLSerializer(); + const svgString = serializer.serializeToString(ExcalidrawView.embedFontsInSVG(svg)); + if(file && file instanceof TFile) await this.app.vault.modify(file,svgString); + else await this.app.vault.create(filepath,svgString); + })(); + } + + public static embedFontsInSVG(svg:SVGSVGElement):SVGSVGElement { + //replace font references with base64 fonts + const includesVirgil = svg.querySelector("text[font-family^='Virgil']") != null; + const includesCascadia = svg.querySelector("text[font-family^='Cascadia']") != null; + const defs = svg.querySelector("defs"); + if (defs && (includesCascadia || includesVirgil)) { + defs.innerHTML = ""; + } + return svg; + } + + public savePNG(scene?: any) { + if(!scene) { + if (!this.getScene) return false; + scene = this.getScene(); + } + + const filepath = this.file.path.substring(0,this.file.path.lastIndexOf(this.compatibilityMode ? '.excalidraw':'.md')) + '.png'; + const file = this.app.vault.getAbstractFileByPath(normalizePath(filepath)); + + (async () => { + const exportSettings: ExportSettings = { + withBackground: this.plugin.settings.exportWithBackground, + withTheme: this.plugin.settings.exportWithTheme + } + const png = await ExcalidrawView.getPNG(scene,exportSettings,this.plugin.settings.pngExportScale); + if(!png) return; + if(file && file instanceof TFile) await this.app.vault.modifyBinary(file,await png.arrayBuffer()); + else await this.app.vault.createBinary(filepath,await png.arrayBuffer()); + })(); + } + + async save(preventReload:boolean=true) { + if(!this.getScene) return; + this.preventReload = preventReload; + this.dirty = null; + + if(this.compatibilityMode) { + await this.excalidrawData.syncElements(this.getScene()); + } else { + if(await this.excalidrawData.syncElements(this.getScene()) && !this.autosaving) { + await this.loadDrawing(false); + } + } + await super.save(); + } + + // get the new file content + // if drawing is in Text Element Edit Lock, then everything should be parsed and in sync + // if drawing is in Text Element Edit Unlock, then everything is raw and parse and so an async function is not required here + getViewData () { + //console.log("ExcalidrawView.getViewData()"); + if(!this.getScene) return this.data; + if(!this.excalidrawData.loaded) return this.data; + if(!this.compatibilityMode) { + let trimLocation = this.data.search(/(^%%\n)?# Text Elements\n/m); + if(trimLocation == -1) trimLocation = this.data.search(/(%%\n)?# Drawing\n/); + if(trimLocation == -1) return this.data; + + const scene = this.excalidrawData.scene; + if(!this.autosaving) { + if(this.plugin.settings.autoexportSVG) this.saveSVG(scene); + if(this.plugin.settings.autoexportPNG) this.savePNG(scene); + if(this.plugin.settings.autoexportExcalidraw) this.saveExcalidraw(scene); + } + + const header = this.data.substring(0,trimLocation) + .replace(/excalidraw-plugin:\s.*\n/,FRONTMATTER_KEY+": " + ( (this.textMode == TextMode.raw) ? "raw\n" : "parsed\n")); + return header + this.excalidrawData.generateMD(); + } + if(this.compatibilityMode) { + const scene = this.excalidrawData.scene; + if(!this.autosaving) { + if(this.plugin.settings.autoexportSVG) this.saveSVG(scene); + if(this.plugin.settings.autoexportPNG) this.savePNG(scene); + } + return JSON.stringify(scene); + } + return this.data; + } + + async handleLinkClick(view: ExcalidrawView, ev:MouseEvent) { + let text:string = (this.textMode == TextMode.parsed) + ? this.excalidrawData.getRawText(this.getSelectedTextElement().id) + : this.getSelectedTextElement().text; + if(!text) { + new Notice(t("LINK_BUTTON_CLICK_NO_TEXT"),20000); + return; + } + if(text.match(REG_LINKINDEX_HYPERLINK)) { + window.open(text,"_blank"); + return; + } + + const parts = text.matchAll(REGEX_LINK.EXPR).next(); + if(!parts.value) { + const tags = text.matchAll(/#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/ug).next(); + if(!tags.value || tags.value.length<2) { + new Notice(t("TEXT_ELEMENT_EMPTY"),4000); + return; + } + const search=this.app.workspace.getLeavesOfType("search"); + if(search.length==0) return; + //@ts-ignore + search[0].view.setQuery("tag:"+tags.value[1]); + this.app.workspace.revealLeaf(search[0]); + //if(this.gotoFullscreen.style.display=="none") this.toggleFullscreen(); + if(document.fullscreenElement === this.contentEl) { + document.exitFullscreen(); + this.zoomToFit(); + } + return; + } + + text = REGEX_LINK.getLink(parts); //parts.value[2] ? parts.value[2]:parts.value[6]; + + if(text.match(REG_LINKINDEX_HYPERLINK)) { + window.open(text,"_blank"); + return; + } + + let lineNum = null; + if(text.search("#")>-1) { + let t; + [t,lineNum] = await this.excalidrawData.getTransclusion(text); + text = text.substring(0,text.search("#")); + } + if(text.match(REG_LINKINDEX_INVALIDCHARS)) { + new Notice(t("FILENAME_INVALID_CHARS"),4000); + return; + } + const file = view.app.metadataCache.getFirstLinkpathDest(text,view.file.path); + if (!ev.altKey && !file) { + new Notice(t("FILE_DOES_NOT_EXIST"), 4000); + return; + } + + try { + const f = view.file; + if(ev.shiftKey && document.fullscreenElement === this.contentEl) { + document.exitFullscreen(); + this.zoomToFit(); + } + const leaf = ev.shiftKey ? getNewOrAdjacentLeaf(this.plugin,view.leaf) : view.leaf; + const eState = lineNum ? {eState: {line: lineNum-1}} : {}; + leaf.openFile(file,eState); + } catch (e) { + new Notice(e,4000); + } + } + + onResize() { + if(!this.plugin.settings.zoomToFitOnResize) return; + if(!this.excalidrawRef) return; + this.zoomToFit(false); + } + + onload() { + //console.log("ExcalidrawView.onload()"); + this.addAction(DISK_ICON_NAME,t("FORCE_SAVE"),async (ev)=> { + await this.save(false); + this.plugin.triggerEmbedUpdates(); + }); + + this.textIsRaw_Element = this.addAction(TEXT_DISPLAY_RAW_ICON_NAME,t("RAW"), (ev) => this.changeTextMode(TextMode.parsed)); + this.textIsParsed_Element = this.addAction(TEXT_DISPLAY_PARSED_ICON_NAME,t("PARSED"), (ev) => this.changeTextMode(TextMode.raw)); + + this.addAction("link",t("OPEN_LINK"), (ev)=>this.handleLinkClick(this,ev)); + + if(!this.app.isMobile) { + this.addAction(FULLSCREEN_ICON_NAME,"Press ESC to exit fullscreen mode",()=>{ + this.contentEl.requestFullscreen();//{navigationUI: "hide"}); + if(this.excalidrawWrapperRef) this.excalidrawWrapperRef.current.focus(); + }); + this.contentEl.onfullscreenchange = () => { + this.zoomToFit(); + } + } + + //this is to solve sliding panes bug + if (this.app.workspace.layoutReady) { + (this.app.workspace.rootSplit as WorkspaceItem as WorkspaceItemExt).containerEl.addEventListener('scroll',(e)=>{if(this.refresh) this.refresh();}); + } else { + this.app.workspace.onLayoutReady( + async () => (this.app.workspace.rootSplit as WorkspaceItem as WorkspaceItemExt).containerEl.addEventListener('scroll',(e)=>{if(this.refresh) this.refresh();}) + ); + } + this.setupAutosaveTimer(); + } + + public async changeTextMode(textMode:TextMode,reload:boolean=true) { + this.textMode = textMode; + if(textMode == TextMode.parsed) { + this.textIsRaw_Element.hide(); + this.textIsParsed_Element.show(); + } else { + this.textIsRaw_Element.show(); + this.textIsParsed_Element.hide(); + } + if(reload) { + await this.save(false); + this.excalidrawRef.current.history.clear(); //to avoid undo replacing links with parsed text + } + } + + public setupAutosaveTimer() { + const timer = async () => { + if(this.dirty && (this.dirty == this.file?.path)) { + this.dirty = null; + this.autosaving=true; + if(this.excalidrawRef) await this.save(); + this.autosaving=false; + } + } + if(this.autosaveTimer) clearInterval(this.autosaveTimer); // clear previous timer if one exists + this.autosaveTimer = setInterval(timer,20000); + } + + //save current drawing when user closes workspace leaf + async onunload() { + if(this.autosaveTimer) { + clearInterval(this.autosaveTimer); + this.autosaveTimer = null; + } + } + + public async reload(fullreload:boolean = false, file?:TFile){ + if(this.preventReload) { + this.preventReload = false; + return; + } + if(!this.excalidrawRef) return; + if(!this.file) return; + if(file) this.data = await this.app.vault.cachedRead(file); + if(fullreload) await this.excalidrawData.loadData(this.data, this.file,this.textMode); + else await this.excalidrawData.setTextMode(this.textMode); + await this.loadDrawing(false); + this.dirty = null; + } + + // clear the view content + clear() { + if(!this.excalidrawRef) return; + this.excalidrawRef.current.resetScene(); + this.excalidrawRef.current.history.clear(); + } + + async setViewData (data: string, clear: boolean = false) { + if(clear) this.clear(); + data = this.data = data.replaceAll("\r\n","\n").replaceAll("\r","\n"); + this.app.workspace.onLayoutReady(async ()=>{ + this.dirty = null; + this.compatibilityMode = this.file.extension == "excalidraw"; + await this.plugin.loadSettings(); + this.plugin.opencount++; + if(this.compatibilityMode) { + this.textIsRaw_Element.hide(); + this.textIsParsed_Element.hide(); + await this.excalidrawData.loadLegacyData(data,this.file); + if (!this.plugin.settings.compatibilityMode) { + new Notice(t("COMPATIBILITY_MODE"),4000); + } + } else { + const parsed = data.search("excalidraw-plugin: parsed\n")>-1 || data.search("excalidraw-plugin: locked\n")>-1; //locked for backward compatibility + this.changeTextMode(parsed ? TextMode.parsed : TextMode.raw,false); + try { + if(!(await this.excalidrawData.loadData(data, this.file,this.textMode))) return; + } catch(e) { + new Notice( "Error loading drawing:\n" + + e.message + + ((e.message === "Cannot read property 'index' of undefined") + ? "\n'# Drawing' section is likely missing" + : "") + + "\nTry manually fixing the file or restoring an earlier version from sync history" ,8000); + this.setMarkdownView(); + return; + } + } + await this.loadDrawing(true) + }); + } + + /** + * + * @param justloaded - a flag to trigger zoom to fit after the drawing has been loaded + */ + private async loadDrawing(justloaded:boolean) { + const excalidrawData = this.excalidrawData.scene; + this.justLoaded = justloaded; + if(this.excalidrawRef) { + const viewModeEnabled = this.excalidrawRef.current.getAppState().viewModeEnabled; + const zenModeEnabled = this.excalidrawRef.current.getAppState().zenModeEnabled; + this.excalidrawRef.current.updateScene({ + elements: excalidrawData.elements, + appState: { + zenModeEnabled: zenModeEnabled, + viewModeEnabled: viewModeEnabled, + ... excalidrawData.appState, + }, + commitToHistory: true, + }); + if((this.app.workspace.activeLeaf === this.leaf) && this.excalidrawWrapperRef) { + this.excalidrawWrapperRef.current.focus(); + } + } else { + this.instantiateExcalidraw({ + elements: excalidrawData.elements, + appState: excalidrawData.appState, + libraryItems: await this.getLibrary(), + }); + } + } + + //Compatibility mode with .excalidraw files + canAcceptExtension(extension: string) { + return extension == "excalidraw"; + } + + // gets the title of the document + getDisplayText() { + if(this.file) return this.file.basename; + else return t("NOFILE"); + } + + // the view type name + getViewType() { + return VIEW_TYPE_EXCALIDRAW; + } + + // icon for the view + getIcon() { + return ICON_NAME; + } + + setMarkdownView() { + if(this.excalidrawRef) { + const el = this.excalidrawRef.current.getSceneElements(); + if(el.filter((e:any)=>e.type==="image").length>0) { + new Notice(t("DRAWING_CONTAINS_IMAGE"),6000); + } + } + this.plugin.excalidrawFileModes[this.id || this.file.path] = "markdown"; + this.plugin.setMarkdownView(this.leaf); + } + + onMoreOptionsMenu(menu: Menu) { + // Add a menu item to force the board to markdown view + if(!this.compatibilityMode) { + menu + .addItem((item) => { + item + .setTitle(t("OPEN_AS_MD")) + .setIcon("document") + .onClick(async () => { + this.setMarkdownView(); + }); + }) + .addItem((item) => { + item + .setTitle(t("EXPORT_EXCALIDRAW")) + .setIcon(ICON_NAME) + .onClick( async (ev) => { + if(!this.getScene || !this.file) return; + //@ts-ignore + if(this.app.isMobile) { + const prompt = new Prompt(this.app, "Please provide filename",this.file.basename,'filename, leave blank to cancel action'); + prompt.openAndGetValue( async (filename:string)=> { + if(!filename) return; + filename = filename + ".excalidraw"; + const folderpath = splitFolderAndFilename(this.file.path).folderpath; + await checkAndCreateFolder(this.app.vault,folderpath); //create folder if it does not exist + const fname = getNewUniqueFilepath(this.app.vault,filename,folderpath); + this.app.vault.create(fname,JSON.stringify(this.getScene())); + new Notice("Exported to " + fname,6000); + }); + return; + } + download('data:text/plain;charset=utf-8',encodeURIComponent(JSON.stringify(this.getScene())), this.file.basename+'.excalidraw'); + }); + }); + } else { + menu + .addItem((item) => { + item + .setTitle(t("CONVERT_FILE")) + .onClick(async () => { + await this.save(); + this.plugin.openDrawing(await this.plugin.convertSingleExcalidrawToMD(this.file),false); + }); + }); + } + menu + .addItem((item) => { + item + .setTitle(t("SAVE_AS_PNG")) + .setIcon(PNG_ICON_NAME) + .onClick( async (ev)=> { + if(!this.getScene || !this.file) return; + if(ev.ctrlKey || ev.metaKey) { + const exportSettings: ExportSettings = { + withBackground: this.plugin.settings.exportWithBackground, + withTheme: this.plugin.settings.exportWithTheme + } + const png = await ExcalidrawView.getPNG(this.getScene(),exportSettings,this.plugin.settings.pngExportScale); + if(!png) return; + let reader = new FileReader(); + reader.readAsDataURL(png); + const self = this; + reader.onloadend = function() { + let base64data = reader.result; + download(null,base64data,self.file.basename+'.png'); + } + return; + } + this.savePNG(); + }); + }) + .addItem((item) => { + item + .setTitle(t("SAVE_AS_SVG")) + .setIcon(SVG_ICON_NAME) + .onClick(async (ev)=> { + if(!this.getScene || !this.file) return; + if(ev.ctrlKey || ev.metaKey) { + const exportSettings: ExportSettings = { + withBackground: this.plugin.settings.exportWithBackground, + withTheme: this.plugin.settings.exportWithTheme + } + let svg = await ExcalidrawView.getSVG(this.getScene(),exportSettings); + if(!svg) return null; + svg = ExcalidrawView.embedFontsInSVG(svg); + download(null,svgToBase64(svg.outerHTML),this.file.basename+'.svg'); + return; + } + this.saveSVG() + }); + }) + .addSeparator(); + super.onMoreOptionsMenu(menu); + } + + async getLibrary() { + const data = JSON_parse(this.plugin.getStencilLibrary()); + return data?.library ? data.library : []; + } + + + private instantiateExcalidraw(initdata: any) { + //console.log("ExcalidrawView.instantiateExcalidraw()"); + this.dirty = null; + const reactElement = React.createElement(() => { + let previousSceneVersion = 0; + let currentPosition = {x:0, y:0}; + const excalidrawRef = React.useRef(null); + const excalidrawWrapperRef = React.useRef(null); + const [dimensions, setDimensions] = React.useState({ + width: undefined, + height: undefined + }); + + this.excalidrawRef = excalidrawRef; + this.excalidrawWrapperRef = excalidrawWrapperRef; + + React.useEffect(() => { + setDimensions({ + width: this.contentEl.clientWidth, + height: this.contentEl.clientHeight, + }); + + const onResize = () => { + try { + setDimensions({ + width: this.contentEl.clientWidth, + height: this.contentEl.clientHeight, + }); + } catch(err) {console.log ("Excalidraw React-Wrapper, onResize ",err)} + }; + window.addEventListener("resize", onResize); + return () => window.removeEventListener("resize", onResize); + }, [excalidrawWrapperRef]); + + + this.getSelectedTextElement = ():{id: string, text:string} => { + if(!excalidrawRef?.current) return {id:null,text:null}; + if(this.excalidrawRef.current.getAppState().viewModeEnabled) { + if(selectedTextElement) { + const retval = selectedTextElement; + selectedTextElement == null; + return retval; + } + return {id:null,text:null}; + } + const selectedElement = excalidrawRef.current.getSceneElements().filter((el:any)=>el.id==Object.keys(excalidrawRef.current.getAppState().selectedElementIds)[0]); + if(selectedElement.length==0) return {id:null,text:null}; + if(selectedElement[0].type == "text") return {id:selectedElement[0].id, text:selectedElement[0].text}; //a text element was selected. Return text + if(selectedElement[0].groupIds.length == 0) return {id:null,text:null}; //is the selected element part of a group? + const group = selectedElement[0].groupIds[0]; //if yes, take the first group it is part of + const textElement = excalidrawRef + .current + .getSceneElements() + .filter((el:any)=>el.groupIds?.includes(group)) + .filter((el:any)=>el.type=="text"); //filter for text elements of the group + if(textElement.length==0) return {id:null,text:null}; //the group had no text element member + return {id:selectedElement[0].id, text:selectedElement[0].text}; //return text element text + }; + + this.addText = (text:string, fontFamily?:1|2|3) => { + if(!excalidrawRef?.current) { + return; + } + const el: ExcalidrawElement[] = excalidrawRef.current.getSceneElements(); + const st: AppState = excalidrawRef.current.getAppState(); + window.ExcalidrawAutomate.reset(); + window.ExcalidrawAutomate.style.strokeColor = st.currentItemStrokeColor; + window.ExcalidrawAutomate.style.opacity = st.currentItemOpacity; + window.ExcalidrawAutomate.style.fontFamily = fontFamily ? fontFamily: st.currentItemFontFamily; + window.ExcalidrawAutomate.style.fontSize = st.currentItemFontSize; + window.ExcalidrawAutomate.style.textAlign = st.currentItemTextAlign; + const id:string = window.ExcalidrawAutomate.addText(currentPosition.x, currentPosition.y, text); + this.addElements(window.ExcalidrawAutomate.getElements(),false,true); + } + + this.addElements = async (newElements:ExcalidrawElement[],repositionToCursor:boolean = false, save:boolean=false, images:any):Promise => { + if(!excalidrawRef?.current) return false; + + const textElements = newElements.filter((el)=>el.type=="text"); + for(let i=0;i{ + st.files[k]={ + type:images[k].type, + id: images[k].id, + dataURL: images[k].dataURL + } + }); + } + //merge appstate.files with files + if(repositionToCursor) newElements = repositionElementsToCursor(newElements,currentPosition,true); + this.excalidrawRef.current.updateScene({ + elements: el.concat(newElements), + appState: st, + commitToHistory: true, + }); + if(save) this.save(); else this.dirty = this.file?.path; + return true; + }; + + this.getScene = () => { + if(!excalidrawRef?.current) { + return null; + } + const el: ExcalidrawElement[] = excalidrawRef.current.getSceneElements(); + const st: AppState = excalidrawRef.current.getAppState(); + + if(st.files) { + const imgIds = el.filter((e)=>e.type=="image").map((e:any)=>e.imageId); + const toDelete = Object.keys(st.files).filter((k)=>!imgIds.contains(k)); + toDelete.forEach((k)=>delete st.files[k]); + } + + return { + type: "excalidraw", + version: 2, + source: "https://excalidraw.com", + elements: el, + appState: { + theme: st.theme, + viewBackgroundColor: st.viewBackgroundColor, + currentItemStrokeColor: st.currentItemStrokeColor, + currentItemBackgroundColor: st.currentItemBackgroundColor, + currentItemFillStyle: st.currentItemFillStyle, + currentItemStrokeWidth: st.currentItemStrokeWidth, + currentItemStrokeStyle: st.currentItemStrokeStyle, + currentItemRoughness: st.currentItemRoughness, + currentItemOpacity: st.currentItemOpacity, + currentItemFontFamily: st.currentItemFontFamily, + currentItemFontSize: st.currentItemFontSize, + currentItemTextAlign: st.currentItemTextAlign, + currentItemStrokeSharpness: st.currentItemStrokeSharpness, + currentItemStartArrowhead: st.currentItemStartArrowhead, + currentItemEndArrowhead: st.currentItemEndArrowhead, + currentItemLinearStrokeSharpness: st.currentItemLinearStrokeSharpness, + gridSize: st.gridSize, + files: st.files??{}, + } + }; + }; + + this.refresh = () => { + if(!excalidrawRef?.current) return; + excalidrawRef.current.refresh(); + }; + + //variables used to handle click events in view mode + let selectedTextElement:{id:string,text:string} = null; + let timestamp = 0; + let blockOnMouseButtonDown = false; + + const getTextElementAtPointer = (pointer:any) => { + const elements = this.excalidrawRef.current.getSceneElements() + .filter((e:ExcalidrawElement)=>{ + return e.type == "text" + && e.x<=pointer.x && (e.x+e.width)>=pointer.x + && e.y<=pointer.y && (e.y+e.height)>=pointer.y; + }); + if(elements.length==0) return null; + return {id:elements[0].id,text:elements[0].text}; + } + + let hoverPoint = {x:0,y:0}; + let hoverPreviewTarget:EventTarget = null; + const clearHoverPreview = () => { + if(hoverPreviewTarget) { + const event = new MouseEvent('click', { + 'view': window, + 'bubbles': true, + 'cancelable': true, + }); + hoverPreviewTarget.dispatchEvent(event); + hoverPreviewTarget = null; + } + } + + const dropAction = (transfer: DataTransfer) => { + // Return a 'copy' or 'link' action according to the content types, or undefined if no recognized type + + //if (transfer.types.includes('text/uri-list')) return 'link'; + let files = (this.app as any).dragManager.draggable?.files; + if(files) { + if(files[0] == this.file) { + files.shift(); + (this.app as any).dragManager.draggable.title = files.length + " files"; + } + } + if (['file', 'files'].includes((this.app as any).dragManager.draggable?.type)) return 'link'; + if (transfer.types?.includes('text/html') || transfer.types?.includes('text/plain')) return 'copy'; + } + + const excalidrawDiv = React.createElement( + "div", + { + className: "excalidraw-wrapper", + ref: excalidrawWrapperRef, + key: "abc", + tabIndex: 0, + onKeyDown: (e:any) => { + //@ts-ignore + if(e.target === excalidrawDiv.ref.current) return; //event should originate from the canvas + if(document.fullscreenEnabled && document.fullscreenElement == this.contentEl && e.keyCode==27) { + document.exitFullscreen(); + this.zoomToFit(); + } + + this.ctrlKeyDown = e.ctrlKey || e.metaKey; + this.shiftKeyDown = e.shiftKey; + this.altKeyDown = e.altKey; + + if(e.ctrlKey && !e.shiftKey && !e.altKey) { // && !e.metaKey) { + const selectedElement = getTextElementAtPointer(currentPosition); + if(!selectedElement) return; + + const text:string = (this.textMode == TextMode.parsed) + ? this.excalidrawData.getRawText(selectedElement.id) + : selectedElement.text; + + if(!text) return; + if(text.match(REG_LINKINDEX_HYPERLINK)) return; + + const parts = text.matchAll(REGEX_LINK.EXPR).next(); + if(!parts.value) return; + let linktext = REGEX_LINK.getLink(parts); //parts.value[2] ? parts.value[2]:parts.value[6]; + + if(linktext.match(REG_LINKINDEX_HYPERLINK)) return; + + this.plugin.hover.linkText = linktext; + this.plugin.hover.sourcePath = this.file.path; + hoverPreviewTarget = this.contentEl; //e.target; + this.app.workspace.trigger('hover-link', { + event: this.mouseEvent, + source: VIEW_TYPE_EXCALIDRAW, + hoverParent: hoverPreviewTarget, + targetEl: hoverPreviewTarget, + linktext: this.plugin.hover.linkText, + sourcePath: this.plugin.hover.sourcePath + }); + hoverPoint = currentPosition; + if(document.fullscreenElement === this.contentEl) { + const self = this; + setTimeout(()=>{ + const popover = document.body.querySelector("div.popover"); + if(popover) self.contentEl.append(popover); + },100) + } + } + }, + onKeyUp: (e:any) => { + this.ctrlKeyDown = e.ctrlKey || e.metaKey; + this.shiftKeyDown = e.shiftKey; + this.altKeyDown = e.altKey; + }, + onClick: (e:MouseEvent):any => { + //@ts-ignore + if(!(e.ctrlKey||e.metaKey)) return; + if(!(this.plugin.settings.allowCtrlClick)) return; + if(!this.getSelectedTextElement().id) return; + this.handleLinkClick(this,e); + }, + onMouseMove: (e:MouseEvent) => { + //@ts-ignore + this.mouseEvent = e.nativeEvent; + }, + onMouseOver: (e:MouseEvent) => { + clearHoverPreview(); + }, + onDragOver: (e:any) => { + const action = dropAction(e.dataTransfer); + if (action) { + e.dataTransfer.dropEffect = action; + e.preventDefault(); + return false; + } + }, + onDragLeave: () => { }, + }, + React.createElement(Excalidraw.default, { + ref: excalidrawRef, + width: dimensions.width, + height: dimensions.height, + UIOptions: { + canvasActions: { + loadScene: false, + saveScene: false, + saveAsScene: false, + export: { saveFileToDisk: false }, + saveAsImage: false, + saveToActiveFile: false, + }, + }, + initialData: initdata, + detectScroll: true, + onPointerUpdate: (p:any) => { + currentPosition = p.pointer; + if(hoverPreviewTarget && (Math.abs(hoverPoint.x-p.pointer.x)>50 || Math.abs(hoverPoint.y-p.pointer.y)>50)) clearHoverPreview(); + if(!this.excalidrawRef.current.getAppState().viewModeEnabled) return; + const handleLinkClick = () => { + selectedTextElement = getTextElementAtPointer(p.pointer); + if(selectedTextElement) { + const event = new MouseEvent("click", {ctrlKey: true, shiftKey: this.shiftKeyDown, altKey:this.altKeyDown}); + this.handleLinkClick(this,event); + selectedTextElement = null; + } + } + + const buttonDown = !blockOnMouseButtonDown && p.button=="down"; + if(buttonDown) { + blockOnMouseButtonDown = true; + + //ctrl click + if(this.ctrlKeyDown) { + handleLinkClick(); + return; + } + + //dobule click + const now = (new Date()).getTime(); + if(now-timestamp < 600) { + handleLinkClick(); + } + timestamp = now; + return; + } + if (p.button=="up") { + blockOnMouseButtonDown=false; + } + }, + onChange: (et:ExcalidrawElement[],st:AppState) => { + if(this.justLoaded) { + this.justLoaded = false; + this.zoomToFit(false); + previousSceneVersion = getSceneVersion(et); + return; + } + if (st.editingElement == null && st.resizingElement == null && + st.draggingElement == null && st.editingGroupId == null && + st.editingLinearElement == null ) { + const sceneVersion = getSceneVersion(et); + if(sceneVersion != previousSceneVersion) { + previousSceneVersion = sceneVersion; + this.dirty=this.file?.path; + } + } + }, + onLibraryChange: (items:LibraryItems) => { + (async () => { + this.plugin.setStencilLibrary(EXCALIDRAW_LIB_HEADER+JSON.stringify(items)+'}'); + await this.plugin.saveSettings(); + })(); + }, + onPaste: (data: ClipboardData, event: ClipboardEvent | null) => { + if(data.elements) { + const self = this; + setTimeout(()=>self.save(false),300); + } + return true; + }, + onDrop: (event: React.DragEvent):boolean => { + const st: AppState = excalidrawRef.current.getAppState(); + currentPosition = viewportCoordsToSceneCoords({ clientX: event.clientX, clientY: event.clientY },st); + + const draggable = (this.app as any).dragManager.draggable; + const onDropHook = (type:"file"|"text"|"unknown", files:TFile[], text:string):boolean => { + if (window.ExcalidrawAutomate.onDropHook) { + try { + return window.ExcalidrawAutomate.onDropHook({ + //@ts-ignore + ea: window.ExcalidrawAutomate, //the Excalidraw Automate object + event: event, //React.DragEvent + draggable: draggable, //Obsidian draggable object + type: type, //"file"|"text" + payload: { + files: files, //TFile[] array of dropped files + text: text, //string + }, + excalidrawFile: this.file, //the file receiving the drop event + view: this, //the excalidraw view receiving the drop + pointerPosition: currentPosition //the pointer position on canvas at the time of drop + }); + } catch (e) { + new Notice("on drop hook error. See console log for details"); + console.log(e); + return false; + } + } else { + return false; + } + + } + + switch(draggable?.type) { + case "file": + if (!onDropHook("file",[draggable.file],null)) { + if((event.ctrlKey || event.metaKey) + && (IMAGE_TYPES.contains(draggable.file.extension) + || this.plugin.isExcalidrawFile(draggable.file))) { + const f = draggable.file; + const topX = currentPosition.x; + const topY = currentPosition.y; + const ea = window.ExcalidrawAutomate; + ea.reset(); + ea.setView(this); + (async () => { + await ea.addImage(currentPosition.x,currentPosition.y,draggable.file); + ea.addElementsToView(false,false); + })(); + return false; + } + this.addText(`[[${this.app.metadataCache.fileToLinktext(draggable.file,this.file.path,true)}]]`); + } + return false; + case "files": + if (!onDropHook("file",draggable.files,null)) { + for(const f of draggable.files) { + this.addText(`[[${this.app.metadataCache.fileToLinktext(f,this.file.path,true)}]]`); + currentPosition.y+=st.currentItemFontSize*2; + } + } + return false; + } + if (event.dataTransfer.types.includes("text/plain")) { + const text:string = event.dataTransfer.getData("text"); + if(!text) return true; + if (!onDropHook("text",null,text)) { + this.addText(text.replace(/(!\[\[.*#[^\]]*\]\])/g,"$1{40}")); + } + return false; + } + if(onDropHook("unknown",null,null)) return false; + return true; + }, + onBeforeTextEdit: (textElement: ExcalidrawTextElement) => { + if(this.autosaveTimer) { //stopping autosave to avoid autosave overwriting text while the user edits it + clearInterval(this.autosaveTimer); + this.autosaveTimer = null; + } + //if(this.textMode==TextMode.parsed) { + const raw = this.excalidrawData.getRawText(textElement.id); + if(!raw) return textElement.rawText; + return raw; + /*} + return null;*/ + }, + onBeforeTextSubmit: (textElement: ExcalidrawTextElement, text:string, isDeleted:boolean) => { + if(isDeleted) { + this.excalidrawData.deleteTextElement(textElement.id); + this.dirty=this.file?.path; + this.setupAutosaveTimer(); + return; + } + //If the parsed text is different than the raw text, and if View is in TextMode.parsed + //Then I need to clear the undo history to avoid overwriting raw text with parsed text and losing links + if(text!=textElement.text || !this.excalidrawData.getRawText(textElement.id)) { //the user made changes to the text or the text is missing from Excalidraw Data (recently copy/pasted) + //setTextElement will attempt a quick parse (without processing transclusions) + const parseResult = this.excalidrawData.setTextElement(textElement.id, text,async ()=>{ + await this.save(false); + //this callback function will only be invoked if quick parse fails, i.e. there is a transclusion in the raw text + //thus I only check if TextMode.parsed, text is always != with parseResult + if(this.textMode == TextMode.parsed) this.excalidrawRef.current.history.clear(); + this.setupAutosaveTimer(); + }); + if(parseResult) { //there were no transclusions in the raw text, quick parse was successful + this.setupAutosaveTimer(); + if(this.textMode == TextMode.raw) return; //text is displayed in raw, no need to clear the history, undo will not create problems + if(text == parseResult) return; //There were no links to parse, raw text and parsed text are equivalent + this.excalidrawRef.current.history.clear(); + return parseResult; + } + return; + } + this.setupAutosaveTimer(); + if(this.textMode==TextMode.parsed) return this.excalidrawData.getParsedText(textElement.id); + } + }) + ); + + return React.createElement( + React.Fragment, + null, + excalidrawDiv + ); + + }); + ReactDOM.render(reactElement,this.contentEl,()=>this.excalidrawWrapperRef.current.focus()); + } + + public zoomToFit(delay:boolean = true) { + if(!this.excalidrawRef) return; + const current = this.excalidrawRef.current; + const fullscreen = (document.fullscreenElement==this.contentEl); + const elements = current.getSceneElements(); + if(delay) { //time for the DOM to render, I am sure there is a more elegant solution + setTimeout(() => current.zoomToFit(elements,2,fullscreen?0:0.05),100); + } else { + current.zoomToFit(elements,2,fullscreen?0:0.05); + } + } + + public static async getSVG(scene:any, exportSettings:ExportSettings):Promise { + try { + return exportToSvg({ + elements: scene.elements, + appState: { + exportBackground: exportSettings.withBackground, + exportWithDarkMode: exportSettings.withTheme ? (scene.appState?.theme=="light" ? false : true) : false, + ... scene.appState,}, + exportPadding:10, + }); + } catch (error) { + return null; + } + } + + public static async getPNG(scene:any, exportSettings:ExportSettings, scale:number = 1) { + try { + return await Excalidraw.exportToBlob({ + elements: scene.elements, + appState: { + exportBackground: exportSettings.withBackground, + exportWithDarkMode: exportSettings.withTheme ? (scene.appState?.theme=="light" ? false : true) : false, + ... scene.appState,}, + mimeType: "image/png", + exportWithDarkMode: "true", + metadata: "Generated by Excalidraw-Obsidian plugin", + getDimensions: (width:number, height:number) => ({ width:width*scale, height:height*scale, scale:scale }) + }); + } catch (error) { + return null; + } + } +} diff --git a/src/Utils.ts b/src/Utils.ts index db2d6f3..8b2c395 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -1,201 +1,219 @@ -import { App, normalizePath, TAbstractFile, TFile, TFolder, Vault } from "obsidian"; -import { Random } from "roughjs/bin/math"; -import { Zoom } from "@zsviczian/excalidraw/types/types"; -import { nanoid } from "nanoid"; -import { IMAGE_TYPES } from "./constants"; -import {ExcalidrawAutomate} from './ExcalidrawAutomate'; -declare let window: ExcalidrawAutomate; - -/** - * Splits a full path including a folderpath and a filename into separate folderpath and filename components - * @param filepath - */ -export function splitFolderAndFilename(filepath: string):{folderpath: string, filename: string} { - let folderpath: string, filename:string; - const lastIndex = filepath.lastIndexOf("/"); - return { - folderpath: normalizePath(filepath.substr(0,lastIndex)), - filename: lastIndex==-1 ? filepath : filepath.substr(lastIndex+1), - }; -} - -/** - * Download data as file from Obsidian, to store on local device - * @param encoding - * @param data - * @param filename - */ -export function download(encoding:string,data:any,filename:string) { - let element = document.createElement('a'); - element.setAttribute('href', (encoding ? encoding + ',' : '') + data); - element.setAttribute('download', filename); - element.style.display = 'none'; - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); -} - -/** - * Generates the image filename based on the excalidraw filename - * @param excalidrawPath - Full filepath of ExclidrawFile - * @param newExtension - extension of IMG file in ".extension" format - * @returns - */ -export function getIMGPathFromExcalidrawFile (excalidrawPath:string,newExtension:string):string { - const isLegacyFile:boolean = excalidrawPath.endsWith(".excalidraw"); - const replaceExtension:string = isLegacyFile ? ".excalidraw" : ".md"; - return excalidrawPath.substring(0,excalidrawPath.lastIndexOf(replaceExtension)) + newExtension; -} - -/** - * Create new file, if file already exists find first unique filename by adding a number to the end of the filename - * @param filename - * @param folderpath - * @returns - */ - export function getNewUniqueFilepath(vault:Vault, filename:string, folderpath:string):string { - let fname = normalizePath(folderpath +'/'+ filename); - let file:TAbstractFile = vault.getAbstractFileByPath(fname); - let i = 0; - while(file) { - fname = normalizePath(folderpath + '/' + filename.slice(0,filename.lastIndexOf("."))+"_"+i+filename.slice(filename.lastIndexOf("."))); - i++; - file = vault.getAbstractFileByPath(fname); - } - return fname; -} - -/** -* Open or create a folderpath if it does not exist -* @param folderpath -*/ -export async function checkAndCreateFolder(vault:Vault,folderpath:string) { - folderpath = normalizePath(folderpath); - let folder = vault.getAbstractFileByPath(folderpath); - if(folder && folder instanceof TFolder) return; - await vault.createFolder(folderpath); -} - -let random = new Random(Date.now()); -export const randomInteger = () => Math.floor(random.next() * 2 ** 31); - -//https://macromates.com/blog/2006/wrapping-text-with-regular-expressions/ -export function wrapText(text:string, lineLen:number, forceWrap:boolean=false):string { - if(!lineLen) return text; - let outstring = ""; - if(forceWrap) { - for(const t of text.split("\n")) { - const v = t.match(new RegExp('(.){1,'+lineLen+'}','g')); - outstring += v ? v.join("\n")+"\n" : "\n"; - } - return outstring.replace(/\n$/, ''); - } - - // 1 2 3 4 - const reg = new RegExp(`(.{1,${lineLen}})(\\s+|$\\n?)|([^\\s]+)(\\s+|$\\n?)`,'gm'); - const res = text.matchAll(reg); - let parts; - while(!(parts = res.next()).done) { - outstring += parts.value[1] ? parts.value[1].trimEnd() : parts.value[3].trimEnd(); - const newLine1 = parts.value[2]?.includes("\n"); - const newLine2 = parts.value[4]?.includes("\n"); - if(newLine1) outstring += parts.value[2]; - if(newLine2) outstring += parts.value[4]; - if(!(newLine1 || newLine2)) outstring += "\n"; - } - return outstring.replace(/\n$/, ''); -} - -export const viewportCoordsToSceneCoords = ( - { clientX, clientY }: { clientX: number; clientY: number }, - { - zoom, - offsetLeft, - offsetTop, - scrollX, - scrollY, - }: { - zoom: Zoom; - offsetLeft: number; - offsetTop: number; - scrollX: number; - scrollY: number; - }, -) => { - const invScale = 1 / zoom.value; - const x = (clientX - zoom.translation.x - offsetLeft) * invScale - scrollX; - const y = (clientY - zoom.translation.y - offsetTop) * invScale - scrollY; - return { x, y }; -}; - -export const getObsidianImage = async (app: App, file: TFile) - :Promise<{ - imageId: string, - dataURL: string, - size: {height: number, width: number}, - }> => { - if(!app || !file) return null; - const isExcalidrawFile = window.ExcalidrawAutomate.isExcalidrawFile(file); - if (!(IMAGE_TYPES.contains(file.extension) || isExcalidrawFile)) { - return null; - } - const ab = await app.vault.readBinary(file); - const excalidrawSVG = isExcalidrawFile - ? svgToBase64((await window.ExcalidrawAutomate.createSVG(file.path,true)).outerHTML) - : null; - return { - imageId: await generateIdFromFile(ab), - dataURL: excalidrawSVG ?? (file.extension==="svg" ? await getSVGData(app,file) : await getDataURL(ab)), - size: await getImageSize(app,excalidrawSVG??app.vault.getResourcePath(file)) - } -} - - -const getSVGData = async (app: App, file: TFile): Promise => { - const svg = await app.vault.read(file); - return svgToBase64(svg); -} - -export const svgToBase64 = (svg:string):string => { - return "data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(svg.replaceAll(" "," ")))); -} -const getDataURL = async (file: ArrayBuffer): Promise => { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = () => { - const dataURL = reader.result as string; - resolve(dataURL); - }; - reader.onerror = (error) => reject(error); - reader.readAsDataURL(new Blob([new Uint8Array(file)])); - }); -}; - -const generateIdFromFile = async (file: ArrayBuffer):Promise => { - let id: string; - try { - const hashBuffer = await window.crypto.subtle.digest( - "SHA-1", - file, - ); - id = - // convert buffer to byte array - Array.from(new Uint8Array(hashBuffer)) - // convert to hex string - .map((byte) => byte.toString(16).padStart(2, "0")) - .join(""); - } catch (error) { - console.error(error); - id = nanoid(40); - } - return id; -}; - -const getImageSize = async (app: App, src:string):Promise<{height:number, width:number}> => { - return new Promise((resolve, reject) => { - let img = new Image() - img.onload = () => resolve({height: img.height, width:img.width}); - img.onerror = reject; - img.src = src; - }) -} +import { App, normalizePath, TAbstractFile, TFile, TFolder, Vault, WorkspaceLeaf } from "obsidian"; +import { Random } from "roughjs/bin/math"; +import { Zoom } from "@zsviczian/excalidraw/types/types"; +import { nanoid } from "nanoid"; +import { IMAGE_TYPES } from "./constants"; +import {ExcalidrawAutomate} from './ExcalidrawAutomate'; +import ExcalidrawPlugin from "./main"; + +declare module "obsidian" { + interface Workspace { + getAdjacentLeafInDirection(leaf: WorkspaceLeaf, direction: string): WorkspaceLeaf; + } +} +declare let window: ExcalidrawAutomate; + +/** + * Splits a full path including a folderpath and a filename into separate folderpath and filename components + * @param filepath + */ +export function splitFolderAndFilename(filepath: string):{folderpath: string, filename: string} { + let folderpath: string, filename:string; + const lastIndex = filepath.lastIndexOf("/"); + return { + folderpath: normalizePath(filepath.substr(0,lastIndex)), + filename: lastIndex==-1 ? filepath : filepath.substr(lastIndex+1), + }; +} + +/** + * Download data as file from Obsidian, to store on local device + * @param encoding + * @param data + * @param filename + */ +export function download(encoding:string,data:any,filename:string) { + let element = document.createElement('a'); + element.setAttribute('href', (encoding ? encoding + ',' : '') + data); + element.setAttribute('download', filename); + element.style.display = 'none'; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); +} + +/** + * Generates the image filename based on the excalidraw filename + * @param excalidrawPath - Full filepath of ExclidrawFile + * @param newExtension - extension of IMG file in ".extension" format + * @returns + */ +export function getIMGPathFromExcalidrawFile (excalidrawPath:string,newExtension:string):string { + const isLegacyFile:boolean = excalidrawPath.endsWith(".excalidraw"); + const replaceExtension:string = isLegacyFile ? ".excalidraw" : ".md"; + return excalidrawPath.substring(0,excalidrawPath.lastIndexOf(replaceExtension)) + newExtension; +} + +/** + * Create new file, if file already exists find first unique filename by adding a number to the end of the filename + * @param filename + * @param folderpath + * @returns + */ + export function getNewUniqueFilepath(vault:Vault, filename:string, folderpath:string):string { + let fname = normalizePath(folderpath +'/'+ filename); + let file:TAbstractFile = vault.getAbstractFileByPath(fname); + let i = 0; + while(file) { + fname = normalizePath(folderpath + '/' + filename.slice(0,filename.lastIndexOf("."))+"_"+i+filename.slice(filename.lastIndexOf("."))); + i++; + file = vault.getAbstractFileByPath(fname); + } + return fname; +} + +/** +* Open or create a folderpath if it does not exist +* @param folderpath +*/ +export async function checkAndCreateFolder(vault:Vault,folderpath:string) { + folderpath = normalizePath(folderpath); + let folder = vault.getAbstractFileByPath(folderpath); + if(folder && folder instanceof TFolder) return; + await vault.createFolder(folderpath); +} + +let random = new Random(Date.now()); +export const randomInteger = () => Math.floor(random.next() * 2 ** 31); + +//https://macromates.com/blog/2006/wrapping-text-with-regular-expressions/ +export function wrapText(text:string, lineLen:number, forceWrap:boolean=false):string { + if(!lineLen) return text; + let outstring = ""; + if(forceWrap) { + for(const t of text.split("\n")) { + const v = t.match(new RegExp('(.){1,'+lineLen+'}','g')); + outstring += v ? v.join("\n")+"\n" : "\n"; + } + return outstring.replace(/\n$/, ''); + } + + // 1 2 3 4 + const reg = new RegExp(`(.{1,${lineLen}})(\\s+|$\\n?)|([^\\s]+)(\\s+|$\\n?)`,'gm'); + const res = text.matchAll(reg); + let parts; + while(!(parts = res.next()).done) { + outstring += parts.value[1] ? parts.value[1].trimEnd() : parts.value[3].trimEnd(); + const newLine1 = parts.value[2]?.includes("\n"); + const newLine2 = parts.value[4]?.includes("\n"); + if(newLine1) outstring += parts.value[2]; + if(newLine2) outstring += parts.value[4]; + if(!(newLine1 || newLine2)) outstring += "\n"; + } + return outstring.replace(/\n$/, ''); +} + +export const viewportCoordsToSceneCoords = ( + { clientX, clientY }: { clientX: number; clientY: number }, + { + zoom, + offsetLeft, + offsetTop, + scrollX, + scrollY, + }: { + zoom: Zoom; + offsetLeft: number; + offsetTop: number; + scrollX: number; + scrollY: number; + }, +) => { + const invScale = 1 / zoom.value; + const x = (clientX - zoom.translation.x - offsetLeft) * invScale - scrollX; + const y = (clientY - zoom.translation.y - offsetTop) * invScale - scrollY; + return { x, y }; +}; + +export const getNewOrAdjacentLeaf = (plugin: ExcalidrawPlugin, leaf: WorkspaceLeaf):WorkspaceLeaf => { + if(plugin.settings.openInAdjacentPane) { + let leafToUse = plugin.app.workspace.getAdjacentLeafInDirection(leaf, "right"); + if(!leafToUse){leafToUse = plugin.app.workspace.getAdjacentLeafInDirection(leaf, "left");} + if(!leafToUse){leafToUse = plugin.app.workspace.getAdjacentLeafInDirection(leaf, "bottom");} + if(!leafToUse){leafToUse = plugin.app.workspace.getAdjacentLeafInDirection(leaf, "top");} + return leafToUse; + } + return plugin.app.workspace.createLeafBySplit(leaf); +} + +export const getObsidianImage = async (app: App, file: TFile) + :Promise<{ + imageId: string, + dataURL: string, + size: {height: number, width: number}, + }> => { + if(!app || !file) return null; + const isExcalidrawFile = window.ExcalidrawAutomate.isExcalidrawFile(file); + if (!(IMAGE_TYPES.contains(file.extension) || isExcalidrawFile)) { + return null; + } + const ab = await app.vault.readBinary(file); + const excalidrawSVG = isExcalidrawFile + ? svgToBase64((await window.ExcalidrawAutomate.createSVG(file.path,true)).outerHTML) + : null; + return { + imageId: await generateIdFromFile(ab), + dataURL: excalidrawSVG ?? (file.extension==="svg" ? await getSVGData(app,file) : await getDataURL(ab)), + size: await getImageSize(app,excalidrawSVG??app.vault.getResourcePath(file)) + } +} + + +const getSVGData = async (app: App, file: TFile): Promise => { + const svg = await app.vault.read(file); + return svgToBase64(svg); +} + +export const svgToBase64 = (svg:string):string => { + return "data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(svg.replaceAll(" "," ")))); +} +const getDataURL = async (file: ArrayBuffer): Promise => { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => { + const dataURL = reader.result as string; + resolve(dataURL); + }; + reader.onerror = (error) => reject(error); + reader.readAsDataURL(new Blob([new Uint8Array(file)])); + }); +}; + +const generateIdFromFile = async (file: ArrayBuffer):Promise => { + let id: string; + try { + const hashBuffer = await window.crypto.subtle.digest( + "SHA-1", + file, + ); + id = + // convert buffer to byte array + Array.from(new Uint8Array(hashBuffer)) + // convert to hex string + .map((byte) => byte.toString(16).padStart(2, "0")) + .join(""); + } catch (error) { + console.error(error); + id = nanoid(40); + } + return id; +}; + +const getImageSize = async (app: App, src:string):Promise<{height:number, width:number}> => { + return new Promise((resolve, reject) => { + let img = new Image() + img.onload = () => resolve({height: img.height, width:img.width}); + img.onerror = reject; + img.src = src; + }) +} \ No newline at end of file diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index bbc4374..3768ed1 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -81,6 +81,11 @@ export default { "the plugin will open it in a browser. " + "When Obsidian files change, the matching [[link]] in your drawings will also change. " + "If you don't want text accidentally changing in your drawings use [[links|with aliases]].", + ADJACENT_PANE_NAME: "Open in adjacent pane", + ADJACENT_PANE_DESC: "When CTRL+SHIFT clicking a link in Excalidraw by default the plugin will open the link in a new pane. " + + "Turning this setting on, Excalidraw will first look for an existing adjacent pane, and try to open the link there. " + + "Excalidraw will first look too the right, then to the left, then down, then up. If no pane is found, Excalidraw will open " + + "a new pane.", LINK_BRACKETS_NAME: "Show [[brackets]] around links", LINK_BRACKETS_DESC: "In PREVIEW mode, when parsing Text Elements, place brackets around links. " + "You can override this setting for a specific drawing by adding '" + FRONTMATTER_KEY_CUSTOM_LINK_BRACKETS + @@ -159,4 +164,4 @@ export default { TYPE_FILENAME: "Type name of drawing to select.", SELECT_FILE_OR_TYPE_NEW: "Select existing drawing or type name of a new drawing then press Enter.", SELECT_TO_EMBED: "Select the drawing to insert into active document.", -}; +}; \ No newline at end of file diff --git a/src/settings.ts b/src/settings.ts index a690fbc..6f02246 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -18,6 +18,7 @@ export interface ExcalidrawSettings { displaySVGInPreview: boolean, width: string, zoomToFitOnResize: boolean, + openInAdjacentPane: boolean, showLinkBrackets: boolean, linkPrefix: string, urlPrefix: string, @@ -52,6 +53,7 @@ export const DEFAULT_SETTINGS: ExcalidrawSettings = { zoomToFitOnResize: true, linkPrefix: "📍", urlPrefix: "🌐", + openInAdjacentPane: false, showLinkBrackets: true, allowCtrlClick: true, forceWrap: false, @@ -203,6 +205,16 @@ export class ExcalidrawSettingTab extends PluginSettingTab { this.containerEl.createEl('p',{ text: t("LINKS_DESC")}); + new Setting(containerEl) + .setName(t("ADJACENT_PANE_NAME")) + .setDesc(t("ADJACENT_PANE_DESC")) + .addToggle(toggle => toggle + .setValue(this.plugin.settings.openInAdjacentPane) + .onChange(async (value) => { + this.plugin.settings.openInAdjacentPane = value; + this.applySettingsUpdate(true); + })); + new Setting(containerEl) .setName(t("LINK_BRACKETS_NAME")) .setDesc(t("LINK_BRACKETS_DESC")) diff --git a/versions.json b/versions.json index d88ea67..b9bb4b3 100644 --- a/versions.json +++ b/versions.json @@ -1,3 +1,3 @@ { - "1.3.16": "0.11.13" + "1.3.17": "0.11.13" } diff --git a/yarn.lock b/yarn.lock index 2da87f5..e3216d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,25 +9,25 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8", "@babel/compat-data@^7.14.5": - "integrity" "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==" - "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz" - "version" "7.14.7" +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": + "integrity" "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz" + "version" "7.15.0" -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.13.0", "@babel/core@^7.14.6", "@babel/core@^7.4.0-0": - "integrity" "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==" - "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz" - "version" "7.14.6" +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.15.5", "@babel/core@^7.4.0-0": + "integrity" "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==" + "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz" + "version" "7.15.5" dependencies: "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helpers" "^7.14.6" - "@babel/parser" "^7.14.6" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.5" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" "convert-source-map" "^1.7.0" "debug" "^4.1.0" "gensync" "^1.0.0-beta.2" @@ -35,63 +35,64 @@ "semver" "^6.3.0" "source-map" "^0.5.0" -"@babel/generator@^7.14.5": - "integrity" "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==" - "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz" - "version" "7.14.5" +"@babel/generator@^7.15.4": + "integrity" "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==" + "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" "jsesc" "^2.5.1" "source-map" "^0.5.0" -"@babel/helper-annotate-as-pure@^7.12.13", "@babel/helper-annotate-as-pure@^7.14.5": - "integrity" "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==" - "resolved" "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": + "integrity" "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==" + "resolved" "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": - "integrity" "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==" - "resolved" "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz" - "version" "7.12.13" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + "integrity" "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==" + "resolved" "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-explode-assignable-expression" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-explode-assignable-expression" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.8", "@babel/helper-compilation-targets@^7.14.5": - "integrity" "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==" - "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": + "integrity" "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==" + "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/compat-data" "^7.14.5" + "@babel/compat-data" "^7.15.0" "@babel/helper-validator-option" "^7.14.5" "browserslist" "^4.16.6" "semver" "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.13.0": - "integrity" "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==" - "resolved" "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz" - "version" "7.13.11" +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": + "integrity" "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==" + "resolved" "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.13.0" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-split-export-declaration" "^7.12.13" + "@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@^7.12.13": - "integrity" "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==" - "resolved" "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz" - "version" "7.12.17" +"@babel/helper-create-regexp-features-plugin@^7.14.5": + "integrity" "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==" + "resolved" "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.14.5" "regexpu-core" "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.0": - "integrity" "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==" - "resolved" "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz" - "version" "0.2.0" +"@babel/helper-define-polyfill-provider@^0.2.2": + "integrity" "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==" + "resolved" "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz" + "version" "0.2.3" dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -102,144 +103,144 @@ "resolve" "^1.14.2" "semver" "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.12.13": - "integrity" "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==" - "resolved" "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz" - "version" "7.13.0" +"@babel/helper-explode-assignable-expression@^7.15.4": + "integrity" "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==" + "resolved" "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.15.4" -"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.5": - "integrity" "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": + "integrity" "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==" + "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-get-function-arity@^7.14.5": - "integrity" "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==" - "resolved" "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-get-function-arity@^7.15.4": + "integrity" "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==" + "resolved" "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-hoist-variables@^7.13.0", "@babel/helper-hoist-variables@^7.14.5": - "integrity" "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-hoist-variables@^7.15.4": + "integrity" "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==" + "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.14.5": - "integrity" "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==" - "resolved" "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz" - "version" "7.14.7" +"@babel/helper-member-expression-to-functions@^7.15.4": + "integrity" "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==" + "resolved" "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": - "integrity" "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": + "integrity" "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==" + "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.5": - "integrity" "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==" - "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": + "integrity" "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==" + "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz" + "version" "7.15.7" dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@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@^7.12.13", "@babel/helper-optimise-call-expression@^7.14.5": - "integrity" "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==" - "resolved" "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-optimise-call-expression@^7.15.4": + "integrity" "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==" + "resolved" "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": "integrity" "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz" "version" "7.14.5" -"@babel/helper-remap-async-to-generator@^7.13.0": - "integrity" "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==" - "resolved" "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz" - "version" "7.13.0" +"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": + "integrity" "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==" + "resolved" "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-wrap-function" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.14.5": - "integrity" "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==" - "resolved" "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": + "integrity" "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==" + "resolved" "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@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@^7.12.13", "@babel/helper-simple-access@^7.14.5": - "integrity" "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==" - "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-simple-access@^7.15.4": + "integrity" "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==" + "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - "integrity" "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==" - "resolved" "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz" - "version" "7.12.1" +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": + "integrity" "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==" + "resolved" "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.15.4" -"@babel/helper-split-export-declaration@^7.12.13", "@babel/helper-split-export-declaration@^7.14.5": - "integrity" "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==" - "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-split-export-declaration@^7.15.4": + "integrity" "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==" + "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.5": - "integrity" "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz" - "version" "7.14.5" +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + "integrity" "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz" + "version" "7.15.7" -"@babel/helper-validator-option@^7.12.17", "@babel/helper-validator-option@^7.14.5": +"@babel/helper-validator-option@^7.14.5": "integrity" "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz" "version" "7.14.5" -"@babel/helper-wrap-function@^7.13.0": - "integrity" "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==" - "resolved" "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz" - "version" "7.13.0" +"@babel/helper-wrap-function@^7.15.4": + "integrity" "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==" + "resolved" "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/helper-function-name" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helpers@^7.14.6": - "integrity" "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==" - "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz" - "version" "7.14.6" +"@babel/helpers@^7.15.4": + "integrity" "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==" + "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" "@babel/highlight@^7.14.5": "integrity" "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==" @@ -250,128 +251,147 @@ "chalk" "^2.0.0" "js-tokens" "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7": - "integrity" "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" - "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz" - "version" "7.14.7" +"@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.5": + "integrity" "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==" + "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz" + "version" "7.15.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": - "integrity" "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz" - "version" "7.13.12" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": + "integrity" "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==" + "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" + "version" "7.15.4" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@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@^7.13.15": - "integrity" "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz" - "version" "7.13.15" +"@babel/plugin-proposal-async-generator-functions@^7.15.4": + "integrity" "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@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@^7.13.0": - "integrity" "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-proposal-class-properties@^7.14.5": + "integrity" "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.13.8": - "integrity" "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz" - "version" "7.13.8" +"@babel/plugin-proposal-class-static-block@^7.15.4": + "integrity" "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@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@^7.14.5": + "integrity" "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz" + "version" "7.14.5" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - "integrity" "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + "integrity" "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.13.8": - "integrity" "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz" - "version" "7.13.8" +"@babel/plugin-proposal-json-strings@^7.14.5": + "integrity" "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": - "integrity" "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz" - "version" "7.13.8" +"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + "integrity" "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": - "integrity" "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz" - "version" "7.13.8" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + "integrity" "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13": - "integrity" "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-proposal-numeric-separator@^7.14.5": + "integrity" "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.13.8": - "integrity" "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz" - "version" "7.13.8" +"@babel/plugin-proposal-object-rest-spread@^7.15.6": + "integrity" "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz" + "version" "7.15.6" dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" - "@babel/helper-plugin-utils" "^7.13.0" + "@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.13.0" + "@babel/plugin-transform-parameters" "^7.15.4" -"@babel/plugin-proposal-optional-catch-binding@^7.13.8": - "integrity" "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz" - "version" "7.13.8" +"@babel/plugin-proposal-optional-catch-binding@^7.14.5": + "integrity" "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.13.12": - "integrity" "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz" - "version" "7.13.12" +"@babel/plugin-proposal-optional-chaining@^7.14.5": + "integrity" "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@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@^7.13.0": - "integrity" "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-proposal-private-methods@^7.14.5": + "integrity" "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - "integrity" "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-proposal-private-property-in-object@^7.15.4": + "integrity" "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@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@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + "integrity" "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==" + "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz" + "version" "7.14.5" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-async-generators@^7.8.4": "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==" @@ -387,6 +407,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-class-static-block@^7.14.5": + "integrity" "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + "version" "7.14.5" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import@^7.8.3": "integrity" "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==" "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" @@ -457,195 +484,202 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.12.13": - "integrity" "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + "integrity" "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.13.0": - "integrity" "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-syntax-top-level-await@^7.14.5": + "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.13.0": - "integrity" "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-transform-arrow-functions@^7.14.5": + "integrity" "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoped-functions@^7.12.13": - "integrity" "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-async-to-generator@^7.14.5": + "integrity" "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@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-scoping@^7.12.13": - "integrity" "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-block-scoped-functions@^7.14.5": + "integrity" "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-classes@^7.13.0": - "integrity" "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-transform-block-scoping@^7.15.3": + "integrity" "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz" + "version" "7.15.3" dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.15.4": + "integrity" "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz" + "version" "7.15.4" + 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" -"@babel/plugin-transform-computed-properties@^7.13.0": - "integrity" "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-transform-computed-properties@^7.14.5": + "integrity" "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.13.0": - "integrity" "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-transform-destructuring@^7.14.7": + "integrity" "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz" + "version" "7.14.7" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": - "integrity" "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + "integrity" "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-duplicate-keys@^7.12.13": - "integrity" "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-duplicate-keys@^7.14.5": + "integrity" "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-exponentiation-operator@^7.12.13": - "integrity" "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-exponentiation-operator@^7.14.5": + "integrity" "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-for-of@^7.13.0": - "integrity" "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-transform-for-of@^7.15.4": + "integrity" "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-function-name@^7.12.13": - "integrity" "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-function-name@^7.14.5": + "integrity" "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-literals@^7.12.13": - "integrity" "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-literals@^7.14.5": + "integrity" "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-member-expression-literals@^7.12.13": - "integrity" "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-member-expression-literals@^7.14.5": + "integrity" "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-amd@^7.13.0": - "integrity" "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-transform-modules-amd@^7.14.5": + "integrity" "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "babel-plugin-dynamic-import-node" "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.13.8": - "integrity" "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz" - "version" "7.13.8" +"@babel/plugin-transform-modules-commonjs@^7.15.4": + "integrity" "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@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" -"@babel/plugin-transform-modules-systemjs@^7.13.8": - "integrity" "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz" - "version" "7.13.8" +"@babel/plugin-transform-modules-systemjs@^7.15.4": + "integrity" "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-hoist-variables" "^7.13.0" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-identifier" "^7.12.11" + "@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" -"@babel/plugin-transform-modules-umd@^7.13.0": - "integrity" "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-transform-modules-umd@^7.14.5": + "integrity" "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": - "integrity" "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": + "integrity" "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz" + "version" "7.14.9" dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" -"@babel/plugin-transform-new-target@^7.12.13": - "integrity" "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-new-target@^7.14.5": + "integrity" "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-object-super@^7.12.13": - "integrity" "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-object-super@^7.14.5": + "integrity" "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" -"@babel/plugin-transform-parameters@^7.13.0": - "integrity" "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-transform-parameters@^7.15.4": + "integrity" "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz" + "version" "7.15.4" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.12.13": - "integrity" "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-property-literals@^7.14.5": + "integrity" "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-react-display-name@^7.14.5": "integrity" "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==" @@ -680,96 +714,99 @@ "@babel/helper-annotate-as-pure" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-regenerator@^7.13.15": - "integrity" "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz" - "version" "7.13.15" +"@babel/plugin-transform-regenerator@^7.14.5": + "integrity" "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz" + "version" "7.14.5" dependencies: "regenerator-transform" "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.12.13": - "integrity" "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-reserved-words@^7.14.5": + "integrity" "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-shorthand-properties@^7.12.13": - "integrity" "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-shorthand-properties@^7.14.5": + "integrity" "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-spread@^7.13.0": - "integrity" "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-transform-spread@^7.14.6": + "integrity" "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz" + "version" "7.14.6" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" -"@babel/plugin-transform-sticky-regex@^7.12.13": - "integrity" "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-sticky-regex@^7.14.5": + "integrity" "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-template-literals@^7.13.0": - "integrity" "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz" - "version" "7.13.0" +"@babel/plugin-transform-template-literals@^7.14.5": + "integrity" "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typeof-symbol@^7.12.13": - "integrity" "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-typeof-symbol@^7.14.5": + "integrity" "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-escapes@^7.12.13": - "integrity" "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-unicode-escapes@^7.14.5": + "integrity" "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.12.13": - "integrity" "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz" - "version" "7.12.13" +"@babel/plugin-transform-unicode-regex@^7.14.5": + "integrity" "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz" + "version" "7.14.5" dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/preset-env@^7.3.1": - "integrity" "sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA==" - "resolved" "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.15.tgz" - "version" "7.13.15" +"@babel/preset-env@^7.15.6": + "integrity" "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==" + "resolved" "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.6.tgz" + "version" "7.15.6" dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-compilation-targets" "^7.13.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.13.15" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-dynamic-import" "^7.13.8" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.13.8" - "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.13.8" - "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-private-methods" "^7.13.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@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.4" + "@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" @@ -779,45 +816,46 @@ "@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-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.13.0" - "@babel/plugin-transform-async-to-generator" "^7.13.0" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.13.0" - "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.0" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.13.0" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" - "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.13.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.13.0" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.13.15" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.13.0" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.13.0" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@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.14.6" + "@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.13.14" - "babel-plugin-polyfill-corejs2" "^0.2.0" - "babel-plugin-polyfill-corejs3" "^0.2.0" - "babel-plugin-polyfill-regenerator" "^0.2.0" - "core-js-compat" "^3.9.0" + "@babel/types" "^7.15.6" + "babel-plugin-polyfill-corejs2" "^0.2.2" + "babel-plugin-polyfill-corejs3" "^0.2.2" + "babel-plugin-polyfill-regenerator" "^0.2.2" + "core-js-compat" "^3.16.0" "semver" "^6.3.0" "@babel/preset-modules@^0.1.4": @@ -844,42 +882,42 @@ "@babel/plugin-transform-react-pure-annotations" "^7.14.5" "@babel/runtime@^7.8.4": - "integrity" "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==" - "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz" - "version" "7.12.1" + "integrity" "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==" + "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz" + "version" "7.15.4" dependencies: "regenerator-runtime" "^0.13.4" -"@babel/template@^7.12.13", "@babel/template@^7.14.5": - "integrity" "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==" - "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz" - "version" "7.14.5" +"@babel/template@^7.15.4": + "integrity" "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==" + "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5": - "integrity" "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==" - "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz" - "version" "7.14.7" +"@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4": + "integrity" "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==" + "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.14.7" - "@babel/types" "^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@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.14", "@babel/types@^7.14.5", "@babel/types@^7.3.0", "@babel/types@^7.4.4": - "integrity" "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==" - "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz" - "version" "7.14.5" +"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.4.4": + "integrity" "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==" + "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz" + "version" "7.15.6" dependencies: - "@babel/helper-validator-identifier" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" "to-fast-properties" "^2.0.0" "@rollup/plugin-babel@^5.3.0": @@ -890,10 +928,10 @@ "@babel/helper-module-imports" "^7.10.4" "@rollup/pluginutils" "^3.1.0" -"@rollup/plugin-commonjs@^15.1.0": - "integrity" "sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ==" - "resolved" "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz" - "version" "15.1.0" +"@rollup/plugin-commonjs@^21.0.0": + "integrity" "sha512-XDQimjHl0kNotAV5lLo34XoygaI0teqiKGJ100B3iCU8+15YscJPeqk2KqkqD3NIe1H8ZTUo5lYjUFZyEgASTw==" + "resolved" "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.0.tgz" + "version" "21.0.0" dependencies: "@rollup/pluginutils" "^3.1.0" "commondir" "^1.0.1" @@ -903,10 +941,10 @@ "magic-string" "^0.25.7" "resolve" "^1.17.0" -"@rollup/plugin-node-resolve@^13.0.0": - "integrity" "sha512-41X411HJ3oikIDivT5OKe9EZ6ud6DXudtfNrGbC4nniaxx2esiWjkLOzgnZsWq1IM8YIeL2rzRGLZLBjlhnZtQ==" - "resolved" "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.0.tgz" - "version" "13.0.0" +"@rollup/plugin-node-resolve@^13.0.5": + "integrity" "sha512-mVaw6uxtvuGx/XCI4qBQXsDZJUfyx5vp39iE0J/7Hd6wDhEbjHr6aES7Nr9yWbuE0BY+oKp6N7Bq6jX5NCGNmQ==" + "resolved" "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.5.tgz" + "version" "13.0.5" dependencies: "@rollup/pluginutils" "^3.1.0" "@types/resolve" "1.17.1" @@ -923,10 +961,10 @@ "@rollup/pluginutils" "^3.1.0" "magic-string" "^0.25.7" -"@rollup/plugin-typescript@^8.2.1": - "integrity" "sha512-Qd2E1pleDR4bwyFxqbjt4eJf+wB0UKVMLc7/BAFDGVdAXQMCsD4DUv5/7/ww47BZCYxWtJqe1Lo0KVNswBJlRw==" - "resolved" "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.1.tgz" - "version" "8.2.1" +"@rollup/plugin-typescript@^8.2.5": + "integrity" "sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ==" + "resolved" "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.5.tgz" + "version" "8.2.5" dependencies: "@rollup/pluginutils" "^3.1.0" "resolve" "^1.17.0" @@ -995,10 +1033,10 @@ "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz" "version" "15.7.3" -"@types/react-dom@^17.0.8": - "integrity" "sha512-0ohAiJAx1DAUEcY9UopnfwCE9sSMDGnY/oXjWMax6g3RpzmTt2GMyMVAXcbn0mo8XAff0SbQJl2/SBU+hjSZ1A==" - "resolved" "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.8.tgz" - "version" "17.0.8" +"@types/react-dom@^17.0.9": + "integrity" "sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==" + "resolved" "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz" + "version" "17.0.9" dependencies: "@types/react" "*" @@ -1702,29 +1740,29 @@ "resolved" "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz" "version" "20.0.3" -"babel-plugin-polyfill-corejs2@^0.2.0": - "integrity" "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==" - "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz" - "version" "0.2.0" +"babel-plugin-polyfill-corejs2@^0.2.2": + "integrity" "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==" + "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz" + "version" "0.2.2" dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" "semver" "^6.1.1" -"babel-plugin-polyfill-corejs3@^0.2.0": - "integrity" "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==" - "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz" - "version" "0.2.0" +"babel-plugin-polyfill-corejs3@^0.2.2": + "integrity" "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==" + "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz" + "version" "0.2.5" dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" - "core-js-compat" "^3.9.1" + "@babel/helper-define-polyfill-provider" "^0.2.2" + "core-js-compat" "^3.16.2" -"babel-plugin-polyfill-regenerator@^0.2.0": - "integrity" "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==" - "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz" - "version" "0.2.0" +"babel-plugin-polyfill-regenerator@^0.2.2": + "integrity" "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==" + "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz" + "version" "0.2.2" dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" "babel-plugin-syntax-async-functions@^6.8.0": "integrity" "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" @@ -2488,16 +2526,16 @@ "caniuse-lite" "^1.0.30000792" "electron-to-chromium" "^1.3.30" -"browserslist@^4.16.3", "browserslist@^4.16.6": - "integrity" "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==" - "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz" - "version" "4.16.6" +"browserslist@^4.16.6", "browserslist@^4.17.1": + "integrity" "sha512-jSDZyqJmkKMEMi7SZAgX5UltFdR5NAO43vY0AwTpu4X3sGH7GLLQ83KiUomgrnvZRCeW0yPPnKqnxPqQOER9zQ==" + "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.17.2.tgz" + "version" "4.17.2" dependencies: - "caniuse-lite" "^1.0.30001219" - "colorette" "^1.2.2" - "electron-to-chromium" "^1.3.723" + "caniuse-lite" "^1.0.30001261" + "electron-to-chromium" "^1.3.854" "escalade" "^3.1.1" - "node-releases" "^1.1.71" + "nanocolors" "^0.2.12" + "node-releases" "^1.1.76" "bser@1.0.2": "integrity" "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=" @@ -2663,10 +2701,10 @@ "resolved" "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001240.tgz" "version" "1.0.30001240" -"caniuse-lite@^1.0.30000748", "caniuse-lite@^1.0.30000792", "caniuse-lite@^1.0.30001219": - "integrity" "sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==" - "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz" - "version" "1.0.30001240" +"caniuse-lite@^1.0.30000748", "caniuse-lite@^1.0.30000792", "caniuse-lite@^1.0.30001261": + "integrity" "sha512-doiV5dft6yzWO1WwU19kt8Qz8R0/8DgEziz6/9n2FxUasteZNwNNYSmJO3GLBH8lCVE73AB1RPDPAeYbcO5Cvw==" + "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001263.tgz" + "version" "1.0.30001263" "capture-stack-trace@^1.0.0": "integrity" "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" @@ -2951,11 +2989,6 @@ "color-convert" "^1.3.0" "color-string" "^0.3.0" -"colorette@^1.2.2": - "integrity" "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - "resolved" "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz" - "version" "1.2.2" - "colormin@^1.0.5": "integrity" "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=" "resolved" "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz" @@ -3108,12 +3141,12 @@ "resolved" "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" "version" "0.1.1" -"core-js-compat@^3.9.0", "core-js-compat@^3.9.1": - "integrity" "sha512-ZHQTdTPkqvw2CeHiZC970NNJcnwzT6YIueDMASKt+p3WbZsLXOcoD392SkcWhkC0wBBHhlfhqGKKsNCQUozYtg==" - "resolved" "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.1.tgz" - "version" "3.10.1" +"core-js-compat@^3.16.0", "core-js-compat@^3.16.2": + "integrity" "sha512-XJMYx58zo4W0kLPmIingVZA10+7TuKrMLPt83+EzDmxFJQUMcTVVmQ+n5JP4r6Z14qSzhQBRi3NSWoeVyKKXUg==" + "resolved" "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.1.tgz" + "version" "3.18.1" dependencies: - "browserslist" "^4.16.3" + "browserslist" "^4.17.1" "semver" "7.0.0" "core-js@^2.4.0", "core-js@^2.5.0": @@ -3754,10 +3787,10 @@ "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" "version" "1.1.1" -"electron-to-chromium@^1.2.7", "electron-to-chromium@^1.3.30", "electron-to-chromium@^1.3.723": - "integrity" "sha512-nM76xH0t2FBH5iMEZDVc3S/qbdKjGH7TThezxC8k1Q7w7WHvIAyJh8lAe2UamGfdRqBTjHfPDn82LJ0ksCiB9g==" - "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.759.tgz" - "version" "1.3.759" +"electron-to-chromium@^1.2.7", "electron-to-chromium@^1.3.30", "electron-to-chromium@^1.3.854": + "integrity" "sha512-a5kIr2lajm4bJ5E4D3fp8Y/BRB0Dx2VOcCRE5Gtb679mXIME/OFhWler8Gy2ksrf8gFX+EFCSIGA33FB3gqYpg==" + "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.857.tgz" + "version" "1.3.857" "elliptic@^6.5.3": "integrity" "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==" @@ -6647,6 +6680,11 @@ "resolved" "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz" "version" "0.0.7" +"nanocolors@^0.2.12": + "integrity" "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==" + "resolved" "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz" + "version" "0.2.12" + "nanoid@^3.1.22", "nanoid@^3.1.23": "integrity" "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz" @@ -6746,10 +6784,10 @@ "shellwords" "^0.1.1" "which" "^1.3.0" -"node-releases@^1.1.71": - "integrity" "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" - "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz" - "version" "1.1.73" +"node-releases@^1.1.76": + "integrity" "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==" + "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz" + "version" "1.1.77" "normalize-package-data@^2.3.2", "normalize-package-data@^2.3.4": "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==" @@ -8101,14 +8139,14 @@ dependencies: "balanced-match" "^1.0.0" -"regenerate-unicode-properties@^8.2.0": - "integrity" "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==" - "resolved" "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz" - "version" "8.2.0" +"regenerate-unicode-properties@^9.0.0": + "integrity" "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==" + "resolved" "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz" + "version" "9.0.0" dependencies: - "regenerate" "^1.4.0" + "regenerate" "^1.4.2" -"regenerate@^1.2.1", "regenerate@^1.4.0": +"regenerate@^1.2.1", "regenerate@^1.4.2": "integrity" "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" "resolved" "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" "version" "1.4.2" @@ -8119,9 +8157,9 @@ "version" "0.11.1" "regenerator-runtime@^0.13.4": - "integrity" "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz" - "version" "0.13.7" + "integrity" "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" + "version" "0.13.9" "regenerator-transform@^0.10.0": "integrity" "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==" @@ -8172,16 +8210,16 @@ "regjsparser" "^0.1.4" "regexpu-core@^4.7.1": - "integrity" "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==" - "resolved" "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz" - "version" "4.7.1" + "integrity" "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==" + "resolved" "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz" + "version" "4.8.0" dependencies: - "regenerate" "^1.4.0" - "regenerate-unicode-properties" "^8.2.0" - "regjsgen" "^0.5.1" - "regjsparser" "^0.6.4" - "unicode-match-property-ecmascript" "^1.0.4" - "unicode-match-property-value-ecmascript" "^1.2.0" + "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@^3.0.1": "integrity" "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==" @@ -8203,7 +8241,7 @@ "resolved" "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz" "version" "0.2.0" -"regjsgen@^0.5.1": +"regjsgen@^0.5.2": "integrity" "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" "resolved" "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz" "version" "0.5.2" @@ -8215,10 +8253,10 @@ dependencies: "jsesc" "~0.5.0" -"regjsparser@^0.6.4": - "integrity" "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==" - "resolved" "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz" - "version" "0.6.9" +"regjsparser@^0.7.0": + "integrity" "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==" + "resolved" "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz" + "version" "0.7.0" dependencies: "jsesc" "~0.5.0" @@ -8406,17 +8444,17 @@ "hash-base" "^3.0.0" "inherits" "^2.0.1" -"rollup-plugin-visualizer@^5.5.0": - "integrity" "sha512-QUd0ZHGYn6rgogS+yzG08AvMk9J4kR1lO1cpLJCIAQhbyIGSBdqCddKWtxDsdmsxhkY/GCGw8CvoSB3MwMQOIQ==" - "resolved" "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.5.0.tgz" - "version" "5.5.0" +"rollup-plugin-visualizer@^5.5.2": + "integrity" "sha512-sh+P9KhuWTzeStyRA5yNZpoEFGuj5Ph34JLMa9+muhU8CneFf9L0XE4fmAwAojJLWp//uLUEyytBPSCdZEg5AA==" + "resolved" "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.5.2.tgz" + "version" "5.5.2" dependencies: "nanoid" "^3.1.22" "open" "^7.4.2" "source-map" "^0.7.3" "yargs" "^16.2.0" -"rollup@^1.20.0 || ^2.0.0", "rollup@^1.20.0||^2.0.0", "rollup@^2.0.0", "rollup@^2.14.0", "rollup@^2.22.0", "rollup@^2.42.0", "rollup@^2.52.3": +"rollup@^1.20.0 || ^2.0.0", "rollup@^1.20.0||^2.0.0", "rollup@^2.0.0", "rollup@^2.14.0", "rollup@^2.38.3", "rollup@^2.42.0", "rollup@^2.52.3": "integrity" "sha512-QF3Sju8Kl2z0osI4unyOLyUudyhOMK6G0AeqJWgfiyigqLAlnNrfBcDWDx+f1cqn+JU2iIYVkDrgQ6/KtwEfrg==" "resolved" "https://registry.npmjs.org/rollup/-/rollup-2.52.3.tgz" "version" "2.52.3" @@ -9328,10 +9366,10 @@ "resolved" "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" "version" "1.0.1" -"tslib@*", "tslib@^2.3.0": - "integrity" "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz" - "version" "2.3.0" +"tslib@*", "tslib@^2.3.1": + "integrity" "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" + "version" "2.3.1" "tunnel-agent@^0.6.0": "integrity" "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" @@ -9375,10 +9413,10 @@ "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" "version" "0.0.6" -"typescript@^4.3.4", "typescript@>=3.7.0": - "integrity" "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz" - "version" "4.3.4" +"typescript@^4.4.3", "typescript@>=3.7.0": + "integrity" "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==" + "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz" + "version" "4.4.3" "tty-browserify@0.0.0": "integrity" "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" @@ -9437,28 +9475,28 @@ "has-symbols" "^1.0.2" "which-boxed-primitive" "^1.0.2" -"unicode-canonical-property-names-ecmascript@^1.0.4": - "integrity" "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" - "resolved" "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz" - "version" "1.0.4" +"unicode-canonical-property-names-ecmascript@^2.0.0": + "integrity" "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + "resolved" "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + "version" "2.0.0" -"unicode-match-property-ecmascript@^1.0.4": - "integrity" "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==" - "resolved" "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz" - "version" "1.0.4" +"unicode-match-property-ecmascript@^2.0.0": + "integrity" "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==" + "resolved" "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + "version" "2.0.0" dependencies: - "unicode-canonical-property-names-ecmascript" "^1.0.4" - "unicode-property-aliases-ecmascript" "^1.0.4" + "unicode-canonical-property-names-ecmascript" "^2.0.0" + "unicode-property-aliases-ecmascript" "^2.0.0" -"unicode-match-property-value-ecmascript@^1.2.0": - "integrity" "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" - "resolved" "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz" - "version" "1.2.0" +"unicode-match-property-value-ecmascript@^2.0.0": + "integrity" "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" + "resolved" "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" + "version" "2.0.0" -"unicode-property-aliases-ecmascript@^1.0.4": - "integrity" "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" - "resolved" "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz" - "version" "1.1.0" +"unicode-property-aliases-ecmascript@^2.0.0": + "integrity" "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" + "resolved" "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" + "version" "2.0.0" "union-value@^1.0.0": "integrity" "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg=="