Before implementing readyPromise for excalidrawRef

This commit is contained in:
Zsolt Viczian
2021-10-23 08:56:51 +02:00
parent 3b9a6404c5
commit d2da408a59
7 changed files with 143 additions and 82 deletions

View File

@@ -5,7 +5,7 @@
- Add "files" to legacy excalidraw export
[ ] PNG preview
[ ] markdown embed SVG
[ ] markdown embed SVG 190
[ ] markdown embed PNG
[ ] embed Excalidraw into other Excalidraw

View File

@@ -10,7 +10,7 @@ import {
TFile
} from "obsidian"
import ExcalidrawView from "./ExcalidrawView";
import { getJSON } from "./ExcalidrawData";
import { getJSON, getSVGString } from "./ExcalidrawData";
import {
FRONTMATTER,
nanoid,
@@ -813,7 +813,13 @@ export function measureText (newText:string, fontSize:number, fontFamily:number)
return {w: width, h: height, baseline: baseline };
};
async function getTemplate(fileWithPath: string):Promise<{elements: any,appState: any, frontmatter: string}> {
async function getTemplate(fileWithPath:string, loadFiles:boolean = false):Promise<{
elements: any,
appState: any,
frontmatter: string,
files: any,
svgSnapshot: string
}> {
const app = window.ExcalidrawAutomate.plugin.app;
const vault = app.vault;
const file = app.metadataCache.getFirstLinkpathDest(normalizePath(fileWithPath),'');
@@ -823,17 +829,24 @@ async function getTemplate(fileWithPath: string):Promise<{elements: any,appState
let trimLocation = data.search("# Text Elements\n");
if(trimLocation == -1) trimLocation = data.search("# Drawing\n");
const excalidrawData = JSON_parse(getJSON(data)[0]);
const [scene,pos] = getJSON(data);
const svgSnapshot = getSVGString(data.substr(pos+scene.length));
const excalidrawData = JSON_parse(scene);
return {
elements: excalidrawData.elements,
appState: excalidrawData.appState,
frontmatter: data.substring(0,trimLocation)
frontmatter: data.substring(0,trimLocation),
files: null,
svgSnapshot: svgSnapshot
};
};
return {
elements: [],
appState: {},
frontmatter: null
frontmatter: null,
files: [],
svgSnapshot: null,
}
}

View File

@@ -36,9 +36,10 @@ 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, generateSVGString, getNewOrAdjacentLeaf, getNewUniqueFilepath, getObsidianImage, getPNG, getSVG, rotatedDimensions, splitFolderAndFilename, svgToBase64, viewportCoordsToSceneCoords } from "./Utils";
import { checkAndCreateFolder, download, generateSVGString, getNewOrAdjacentLeaf, getNewUniqueFilepath, getObsidianImage, getPNG, getSVG, loadSceneFiles, rotatedDimensions, splitFolderAndFilename, svgToBase64, viewportCoordsToSceneCoords } from "./Utils";
import { Prompt } from "./Prompt";
import { ClipboardData } from "@zsviczian/excalidraw/types/clipboard";
import { sceneCoordsToViewportCoords } from "@zsviczian/excalidraw/types/utils";
declare let window: ExcalidrawAutomate;
@@ -434,14 +435,17 @@ export default class ExcalidrawView extends TextFileView {
if((this.app.workspace.activeLeaf === this.leaf) && this.excalidrawWrapperRef) {
this.excalidrawWrapperRef.current.focus();
}
loadSceneFiles(this.app,this.excalidrawData.files,this.excalidrawRef.current.addFiles);
} else {
this.instantiateExcalidraw({
elements: excalidrawData.elements,
appState: excalidrawData.appState,
libraryItems: await this.getLibrary(),
});
setTimeout(()=>loadSceneFiles(this.app,this.excalidrawData.files,this.excalidrawRef.current.addFiles),1000);
}
/*
//load files
this.excalidrawData.files.forEach((value,key)=> {
const file = this.app.vault.getAbstractFileByPath(value);
@@ -458,7 +462,8 @@ export default class ExcalidrawView extends TextFileView {
this.excalidrawRef.current.addFiles(files);
});
}
});
});*/
}
//Compatibility mode with .excalidraw files
@@ -629,7 +634,6 @@ export default class ExcalidrawView extends TextFileView {
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) {
@@ -1114,7 +1118,10 @@ export default class ExcalidrawView extends TextFileView {
);
});
ReactDOM.render(reactElement,this.contentEl,()=>this.excalidrawWrapperRef.current.focus());
ReactDOM.render(reactElement,this.contentEl,()=>{
this.excalidrawWrapperRef.current.focus();
});
}
public zoomToFit(delay:boolean = true) {

View File

@@ -1,7 +1,7 @@
import Excalidraw,{exportToSvg} from "@zsviczian/excalidraw";
import { App, normalizePath, TAbstractFile, TFile, TFolder, Vault, WorkspaceLeaf } from "obsidian";
import { Random } from "roughjs/bin/math";
import { DataURL, Zoom } from "@zsviczian/excalidraw/types/types";
import { BinaryFileData, DataURL, Zoom } from "@zsviczian/excalidraw/types/types";
import { nanoid } from "nanoid";
import { IMAGE_TYPES } from "./constants";
import {ExcalidrawAutomate} from './ExcalidrawAutomate';
@@ -350,4 +350,28 @@ export const getPNG = async (scene:any, exportSettings:ExportSettings, scale:num
} catch (error) {
return null;
}
}
export const loadSceneFiles = async (app:App, filesMap: Map<FileId, string>,addFiles:Function) => {
const entries = filesMap.entries();
let entry;
let files:BinaryFileData[] = [];
while(!(entry = entries.next()).done) {
const file = app.vault.getAbstractFileByPath(entry.value[1]);
if(file && file instanceof TFile) {
const data = await getObsidianImage(app,file);
files.push({
mimeType : data.mimeType,
id: entry.value[0],
dataURL: data.dataURL,
created: data.created
});
}
}
try { //in try block because by the time files are loaded the user may have closed the view
addFiles(files);
} catch(e) {
}
}

View File

@@ -57,7 +57,6 @@ import { around } from "monkey-around";
import { t } from "./lang/helpers";
import { MigrationPrompt } from "./MigrationPrompt";
import { checkAndCreateFolder, download, generateSVGString, getAttachmentsFolderAndFilePath, getIMGPathFromExcalidrawFile, getNewUniqueFilepath, getPNG, getSVG, splitFolderAndFilename, svgToBase64 } from "./Utils";
import { directive } from "@babel/types";
declare module "obsidian" {
interface App {
@@ -225,7 +224,10 @@ export default class ExcalidrawPlugin extends Plugin {
const [scene,pos] = getJSON(content);
const svgSnapshot = getSVGString(content.substr(pos+scene.length));
if(!this.settings.displaySVGInPreview) {
//Removed in 1.4.0 when implementing ImageElement. Key reason for removing this
//is to use SVG snapshot in file, to avoid resource intensive process to generating PNG
//due to the need to load excalidraw plus all linked images
/* if(!this.settings.displaySVGInPreview) {
const width = parseInt(imgAttributes.fwidth);
let scale = 1;
if(width>=800) scale = 2;
@@ -235,10 +237,9 @@ export default class ExcalidrawPlugin extends Plugin {
if(!png) return null;
img.src = URL.createObjectURL(png);
return img;
}
}*/
let svg:SVGSVGElement = null;
if(svgSnapshot) {
console.log("using snapshot");
const el = document.createElement('div');
el.innerHTML = svgSnapshot;
const firstChild = el.firstChild;

View File

@@ -15,7 +15,7 @@ export interface ExcalidrawSettings {
templateFilePath: string,
drawingFilenamePrefix: string,
drawingFilenameDateTime: string,
displaySVGInPreview: boolean,
//displaySVGInPreview: boolean,
width: string,
matchTheme: boolean,
zoomToFitOnResize: boolean,
@@ -49,7 +49,7 @@ export const DEFAULT_SETTINGS: ExcalidrawSettings = {
templateFilePath: 'Excalidraw/Template.excalidraw',
drawingFilenamePrefix: 'Drawing ',
drawingFilenameDateTime: 'YYYY-MM-DD HH.mm.ss',
displaySVGInPreview: true,
//displaySVGInPreview: true,
width: '400',
matchTheme: false,
zoomToFitOnResize: true,
@@ -307,8 +307,8 @@ export class ExcalidrawSettingTab extends PluginSettingTab {
this.containerEl.createEl('h1', {text: t("EMBED_HEAD")});
new Setting(containerEl)
//Removed in 1.4.0 when implementing ImageElement.
/* new Setting(containerEl)
.setName(t("EMBED_PREVIEW_SVG_NAME"))
.setDesc(t("EMBED_PREVIEW_SVG_DESC"))
.addToggle(toggle => toggle
@@ -316,8 +316,7 @@ export class ExcalidrawSettingTab extends PluginSettingTab {
.onChange(async (value) => {
this.plugin.settings.displaySVGInPreview = value;
this.applySettingsUpdate();
}));
}));*/
new Setting(containerEl)
.setName(t("EMBED_WIDTH_NAME"))

139
yarn.lock
View File

@@ -2750,34 +2750,7 @@
"strip-ansi" "^3.0.0"
"supports-color" "^2.0.0"
"chalk@^2.0.0":
"integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
"resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
"version" "2.4.2"
dependencies:
"ansi-styles" "^3.2.1"
"escape-string-regexp" "^1.0.5"
"supports-color" "^5.3.0"
"chalk@^2.0.1":
"integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
"resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
"version" "2.4.2"
dependencies:
"ansi-styles" "^3.2.1"
"escape-string-regexp" "^1.0.5"
"supports-color" "^5.3.0"
"chalk@^2.1.0":
"integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
"resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
"version" "2.4.2"
dependencies:
"ansi-styles" "^3.2.1"
"escape-string-regexp" "^1.0.5"
"supports-color" "^5.3.0"
"chalk@^2.4.1":
"chalk@^2.0.0", "chalk@^2.0.1", "chalk@^2.1.0", "chalk@^2.4.1":
"integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
"resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
"version" "2.4.2"
@@ -3888,21 +3861,25 @@
"is-arrayish" "^0.2.1"
"es-abstract@^1.18.0-next.2":
"integrity" "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw=="
"resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz"
"version" "1.18.3"
"integrity" "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w=="
"resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz"
"version" "1.19.1"
dependencies:
"call-bind" "^1.0.2"
"es-to-primitive" "^1.2.1"
"function-bind" "^1.1.1"
"get-intrinsic" "^1.1.1"
"get-symbol-description" "^1.0.0"
"has" "^1.0.3"
"has-symbols" "^1.0.2"
"is-callable" "^1.2.3"
"internal-slot" "^1.0.3"
"is-callable" "^1.2.4"
"is-negative-zero" "^2.0.1"
"is-regex" "^1.1.3"
"is-string" "^1.0.6"
"object-inspect" "^1.10.3"
"is-regex" "^1.1.4"
"is-shared-array-buffer" "^1.0.1"
"is-string" "^1.0.7"
"is-weakref" "^1.0.1"
"object-inspect" "^1.11.0"
"object-keys" "^1.1.1"
"object.assign" "^4.1.2"
"string.prototype.trimend" "^1.0.4"
@@ -4712,7 +4689,7 @@
"resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
"version" "2.0.5"
"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.1":
"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.0", "get-intrinsic@^1.1.1":
"integrity" "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q=="
"resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz"
"version" "1.1.1"
@@ -4731,6 +4708,14 @@
"resolved" "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz"
"version" "3.0.0"
"get-symbol-description@^1.0.0":
"integrity" "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw=="
"resolved" "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz"
"version" "1.0.0"
dependencies:
"call-bind" "^1.0.2"
"get-intrinsic" "^1.1.1"
"get-value@^2.0.3", "get-value@^2.0.6":
"integrity" "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
"resolved" "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz"
@@ -4946,6 +4931,13 @@
"resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz"
"version" "1.0.2"
"has-tostringtag@^1.0.0":
"integrity" "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ=="
"resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz"
"version" "1.0.0"
dependencies:
"has-symbols" "^1.0.2"
"has-value@^0.3.1":
"integrity" "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8="
"resolved" "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz"
@@ -5275,6 +5267,15 @@
dependencies:
"meow" "^3.3.0"
"internal-slot@^1.0.3":
"integrity" "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA=="
"resolved" "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz"
"version" "1.0.3"
dependencies:
"get-intrinsic" "^1.1.0"
"has" "^1.0.3"
"side-channel" "^1.0.4"
"interpret@^1.0.0":
"integrity" "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
"resolved" "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz"
@@ -5371,10 +5372,10 @@
dependencies:
"builtin-modules" "^1.0.0"
"is-callable@^1.1.4", "is-callable@^1.2.3":
"integrity" "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ=="
"resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz"
"version" "1.2.3"
"is-callable@^1.1.4", "is-callable@^1.2.4":
"integrity" "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
"resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz"
"version" "1.2.4"
"is-ci@^1.0.10":
"integrity" "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg=="
@@ -5631,13 +5632,13 @@
dependencies:
"@types/estree" "*"
"is-regex@^1.0.4", "is-regex@^1.1.3":
"integrity" "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ=="
"resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz"
"version" "1.1.3"
"is-regex@^1.0.4", "is-regex@^1.1.4":
"integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg=="
"resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
"version" "1.1.4"
dependencies:
"call-bind" "^1.0.2"
"has-symbols" "^1.0.2"
"has-tostringtag" "^1.0.0"
"is-resolvable@^1.0.0":
"integrity" "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
@@ -5654,15 +5655,22 @@
"resolved" "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz"
"version" "1.0.0"
"is-shared-array-buffer@^1.0.1":
"integrity" "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA=="
"resolved" "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz"
"version" "1.0.1"
"is-stream@^1.0.0", "is-stream@^1.1.0":
"integrity" "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
"resolved" "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz"
"version" "1.1.0"
"is-string@^1.0.5", "is-string@^1.0.6":
"integrity" "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w=="
"resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz"
"version" "1.0.6"
"is-string@^1.0.5", "is-string@^1.0.7":
"integrity" "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg=="
"resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz"
"version" "1.0.7"
dependencies:
"has-tostringtag" "^1.0.0"
"is-svg@^2.0.0":
"integrity" "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk="
@@ -5688,6 +5696,13 @@
"resolved" "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz"
"version" "0.2.1"
"is-weakref@^1.0.1":
"integrity" "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ=="
"resolved" "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz"
"version" "1.0.1"
dependencies:
"call-bind" "^1.0.0"
"is-windows@^1.0.1", "is-windows@^1.0.2":
"integrity" "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
"resolved" "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz"
@@ -6930,10 +6945,10 @@
"resolved" "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz"
"version" "1.3.1"
"object-inspect@^1.10.3":
"integrity" "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw=="
"resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz"
"version" "1.10.3"
"object-inspect@^1.11.0", "object-inspect@^1.9.0":
"integrity" "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
"resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz"
"version" "1.11.0"
"object-is@^1.0.1":
"integrity" "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw=="
@@ -8766,6 +8781,15 @@
"resolved" "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz"
"version" "0.1.1"
"side-channel@^1.0.4":
"integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw=="
"resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz"
"version" "1.0.4"
dependencies:
"call-bind" "^1.0.0"
"get-intrinsic" "^1.0.2"
"object-inspect" "^1.9.0"
"sigmund@^1.0.1":
"integrity" "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA="
"resolved" "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz"
@@ -9198,14 +9222,7 @@
dependencies:
"has-flag" "^2.0.0"
"supports-color@^5.1.0":
"integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
"resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
"version" "5.5.0"
dependencies:
"has-flag" "^3.0.0"
"supports-color@^5.3.0", "supports-color@^5.4.0":
"supports-color@^5.1.0", "supports-color@^5.3.0", "supports-color@^5.4.0":
"integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
"resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
"version" "5.5.0"