diff --git a/package.json b/package.json index 09a5cef..090192c 100644 --- a/package.json +++ b/package.json @@ -57,10 +57,7 @@ "@lumino/messaging": "^1.4.2", "@lumino/properties": "^1.2.2", "@lumino/signaling": "^1.4.2", - "@lumino/widgets": "^1.13.2", - "@popperjs/core": "^2.4.4", - "crypto": "1.0.1", - "react-popper": "^2.2.3" + "@lumino/widgets": "^1.13.2" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^2.25.0", diff --git a/src/CodeSnippetDisplay.tsx b/src/CodeSnippetDisplay.tsx index 8711fe7..3d8e5d6 100644 --- a/src/CodeSnippetDisplay.tsx +++ b/src/CodeSnippetDisplay.tsx @@ -1,7 +1,7 @@ import insertSVGstr from '../style/icon/insertsnippet.svg'; import launchEditorSVGstr from '../style/icon/jupyter_launcher.svg'; -import { SearchBar } from './SearchBar'; -import { FilterSnippet } from './FilterSnippet'; +import { FilterTools } from './FilterTools'; +// import { FilterSnippet } from './FilterSnippet'; import { showPreview } from './PreviewSnippet'; import { ICodeSnippet @@ -93,6 +93,7 @@ interface ICodeSnippetDisplayProps { interface ICodeSnippetDisplayState { codeSnippets: ICodeSnippet[]; searchValue: string; + filterTags: string[]; } /** @@ -106,7 +107,11 @@ export class CodeSnippetDisplay extends React.Component< _dragData: { pressX: number; pressY: number; dragImage: HTMLElement }; constructor(props: ICodeSnippetDisplayProps) { super(props); - this.state = { codeSnippets: this.props.codeSnippets, searchValue: '' }; + this.state = { + codeSnippets: this.props.codeSnippets, + searchValue: '', + filterTags: [] + }; this._drag = null; this._dragData = null; this.handleDragMove = this.handleDragMove.bind(this); @@ -116,7 +121,6 @@ export class CodeSnippetDisplay extends React.Component< // Handle code snippet insert into an editor private insertCodeSnippet = async (snippet: ICodeSnippet): Promise => { const widget: Widget = this.props.getCurrentWidget(); - console.log('current widget: ' + widget); const snippetStr: string = snippet.code.join('\n'); // if the widget is document widget and it's a file?? in the file editor @@ -222,20 +226,6 @@ export class CodeSnippetDisplay extends React.Component< }); }; - // Pick color for side of snippet box based on number of code lines - // private codeLines = (codeSnippet: ICodeSnippet): string => { - // let i; - // let counter = 0; - // for (i = 0; i < codeSnippet.code[0].length; i++) { - // if (codeSnippet.code[0][i] === '\n') { - // counter++; - // } - // } - // counter += 1; - // console.log(counter); - // return 'LOC\t\t' + counter; - // }; - // Insert 6 dots on hover private dragHoverStyle = (id: string): void => { const _id: number = parseInt(id, 10); @@ -270,19 +260,6 @@ export class CodeSnippetDisplay extends React.Component< .getElementsByClassName('drag-hover') [_id].classList.add('drag-hover-clicked'); } - // if ( - // document - // .getElementsByClassName(CODE_SNIPPET_ITEM) - // [_id].classList.contains('codeSnippet-item-clicked') - // ) { - // document - // .getElementsByClassName(CODE_SNIPPET_ITEM) - // [_id].classList.remove('codeSnippet-item-clicked'); - // } else { - // document - // .getElementsByClassName(CODE_SNIPPET_ITEM) - // [_id].classList.add('codeSnippet-item-clicked'); - // } }; // Bold text in snippet name based on search @@ -419,7 +396,6 @@ export class CodeSnippetDisplay extends React.Component< target.removeEventListener('mouseup', this._evtMouseUp, true); return this._drag.start(clientX, clientY).then(() => { - console.log('drag done'); this.dragHoverStyleRemove(codeSnippet.id.toString()); this._drag = null; this._dragData = null; @@ -453,8 +429,6 @@ export class CodeSnippetDisplay extends React.Component< //Set the position of the preview to be next to the snippet title. private _setPreviewPosition(id: string): void { const intID = parseInt(id, 10); - const target = event.target as HTMLElement; - console.log(target); const realTarget = document.getElementsByClassName( 'expandableContainer-title' )[intID]; @@ -496,16 +470,7 @@ export class CodeSnippetDisplay extends React.Component< title: 'Launch Editor', icon: launchEditorIcon, onClick: (): void => { - // showPreview( - // { - // id: parseInt(id, 10), - // title: displayName, - // body: new PreviewHandler(codeSnippet), - // codeSnippet: codeSnippet - // } - // ); this.props.openCodeSnippetEditor(codeSnippet); - // this.snippetClicked(id); } } ]; @@ -617,28 +582,57 @@ export class CodeSnippetDisplay extends React.Component< props: ICodeSnippetDisplayProps, state: ICodeSnippetDisplayState ): ICodeSnippetDisplayState { - console.log('udpating display!'); - console.log(props); - console.log(state); - if (props.codeSnippets !== state.codeSnippets && state.searchValue === '') { + console.log(props.codeSnippets); + console.log(state.codeSnippets); + console.log(state.searchValue); + console.log(state.filterTags === []); + if ( + props.codeSnippets !== state.codeSnippets && + state.searchValue === '' && + state.filterTags.length === 0 + ) { return { codeSnippets: props.codeSnippets, - searchValue: '' + searchValue: '', + filterTags: [] }; } return null; } - searchSnippets = (searchValue: string): void => { - const newSnippets = this.props.codeSnippets.filter( + filterSnippets = (searchValue: string, filterTags: string[]): void => { + console.log(searchValue); + console.log(filterTags); + + // filter with search + let filteredSnippets = this.props.codeSnippets.filter( codeSnippet => codeSnippet.name.includes(searchValue) || codeSnippet.language.includes(searchValue) ); + + // filter with tags + if (filterTags.length !== 0) { + filteredSnippets = filteredSnippets.filter(codeSnippet => { + return filterTags.some(tag => { + if (codeSnippet.tags) { + return codeSnippet.tags.includes(tag); + } + return false; + }); + }); + } + this.setState( - { codeSnippets: newSnippets, searchValue: searchValue }, + { + codeSnippets: filteredSnippets, + searchValue: searchValue, + filterTags: filterTags + }, + + // { codeSnippets: newSnippets, searchValue: this.state.searchValue }, () => { - console.log('CodeSnippets are successfully filtered.'); + console.log('CodeSnippets are succesfully filtered.'); } ); }; @@ -665,10 +659,16 @@ export class CodeSnippetDisplay extends React.Component< top="5px" /> -
- - -
+ {/*
*/} + + {/* */} + {/*
*/}
{this.state.codeSnippets.map((codeSnippet, id) => diff --git a/src/FilterSnippet.tsx b/src/FilterSnippet.tsx deleted file mode 100644 index 9f49c24..0000000 --- a/src/FilterSnippet.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import React from 'react'; -// import { usePopper } from 'react-popper'; -// import { createPopper } from '@popperjs/core'; -// import { Overlay, Button } from 'react-bootstrap'; - -interface IFilterSnippetProps { - tags: string[]; -} - -interface IFilterSnippetState { - show: boolean; -} - -export class FilterSnippet extends React.Component< - IFilterSnippetProps, - IFilterSnippetState -> { - button: Element; - option: HTMLElement; - constructor(props: IFilterSnippetProps) { - super(props); - this.state = { show: false }; - this.createFilterBox = this.createFilterBox.bind(this); - this.renderFilterOption = this.renderFilterOption.bind(this); - this.renderTags = this.renderTags.bind(this); - this.renderTag = this.renderTag.bind(this); - // this.target = useRef(null); - } - - // show() {} - createFilterBox(): void { - this.setState((state, _) => ({ - show: !state.show - })); - } - - renderTags(): JSX.Element { - return ( -
- {this.props.tags.map((tag: string, index: number) => - this.renderTag(tag, index.toString()) - )} -
- ); - } - - renderTag(tag: string, index: string): JSX.Element { - return ( -
- -
- ); - } - - renderFilterOption(): JSX.Element { - return ( -
-
- cell tags -
- {this.renderTags()} -
- ); - } - - // renderOption(): JSX.Element {} - - render(): React.ReactElement { - return ( -
- - {this.state.show ? ( -
- ) : null} - {this.state.show ? this.renderFilterOption() : null} - {/* */} -
- ); - } -} diff --git a/src/FilterTools.tsx b/src/FilterTools.tsx new file mode 100644 index 0000000..2e778df --- /dev/null +++ b/src/FilterTools.tsx @@ -0,0 +1,184 @@ +import { InputGroup } from '@jupyterlab/ui-components'; +import { checkIcon } from '@jupyterlab/ui-components'; + +import React from 'react'; + +interface IFilterSnippetProps { + tags: string[]; + onFilter: (searchValue: string, filterTags: string[]) => void; +} + +interface IFilterSnippetState { + show: boolean; + filteredTags: string[]; + searchValue: string; +} + +export class FilterTools extends React.Component< + IFilterSnippetProps, + IFilterSnippetState +> { + constructor(props: IFilterSnippetProps) { + super(props); + this.state = { show: false, filteredTags: [], searchValue: '' }; + this.createFilterBox = this.createFilterBox.bind(this); + this.renderFilterOption = this.renderFilterOption.bind(this); + this.renderTags = this.renderTags.bind(this); + this.renderTag = this.renderTag.bind(this); + this.handleClick = this.handleClick.bind(this); + this.filterSnippets = this.filterSnippets.bind(this); + // this.searchSnippets = this.searchSnippets.bind(this); + // this.updateValue = this.updateValue.bind(this); + } + + createFilterBox(): void { + // toggle filtercontainer display none ... + // this.setState(state => ({ + // show: !state.show + // })); + const filterArrow = document.querySelector( + '.jp-codeSnippet-filter-arrow-up' + ); + + const filterOption = document.querySelector( + '.jp-codeSnippet-filter-option' + ); + + filterArrow.classList.toggle('idle'); + filterOption.classList.toggle('idle'); + } + + renderTags(): JSX.Element { + return ( +
+ {this.props.tags.map((tag: string, index: number) => + this.renderTag(tag, index.toString()) + )} +
+ ); + } + + renderTag(tag: string, index: string): JSX.Element { + return ( +
+ +
+ ); + } + + handleClick(event: React.MouseEvent): void { + const target = event.target as HTMLElement; + const clickedTag = target.innerText; + const parent = target.parentElement; + // const filteredTags = this.state.filteredTags.slice(); + + this.setState( + state => ({ + filteredTags: this.handleClickHelper( + target, + parent, + state.filteredTags, + clickedTag + ) + }), + this.filterSnippets + ); + } + + handleClickHelper( + target: HTMLElement, + parent: HTMLElement, + currentTags: string[], + clickedTag: string + ): string[] { + if (parent.classList.contains('unapplied-tag')) { + parent.classList.replace('unapplied-tag', 'applied-tag'); + const iconContainer = checkIcon.element({ + className: 'jp-codeSnippet-filter-check', + tag: 'span', + elementPosition: 'center', + height: '18px', + width: '18px', + marginLeft: '5px', + marginRight: '-3px' + }); + const color = getComputedStyle(document.documentElement).getPropertyValue( + '--jp-ui-font-color1' + ); + target.style.color = color; + if (parent.children.length === 1) { + parent.appendChild(iconContainer); + } + + currentTags.splice(-1, 0, clickedTag); + } else if (parent.classList.contains('applied-tag')) { + parent.classList.replace('applied-tag', 'unapplied-tag'); + const color = getComputedStyle(document.documentElement).getPropertyValue( + '--jp-ui-font-color2' + ); + target.style.color = color; + + if (parent.children.length !== 1) { + // remove check icon + parent.removeChild(parent.children.item(1)); + } + + const idx = currentTags.indexOf(clickedTag); + currentTags.splice(idx, 1); + } + console.log(currentTags); + return currentTags; + } + + handleSearch = (event: React.ChangeEvent): void => { + this.setState({ searchValue: event.target.value }, this.filterSnippets); + }; + + filterSnippets(): void { + this.props.onFilter(this.state.searchValue, this.state.filteredTags); + } + + renderFilterOption(): JSX.Element { + return ( +
+
+ cell tags +
+ {this.renderTags()} +
+ ); + } + + render(): JSX.Element { + return ( +
+
+ +
+
+ + {/*
*/} +
+ {this.renderFilterOption()} +
+ {/*
*/} +
+ ); + } +} diff --git a/src/PreviewSnippet.tsx b/src/PreviewSnippet.tsx index 7fbf658..ca667ba 100644 --- a/src/PreviewSnippet.tsx +++ b/src/PreviewSnippet.tsx @@ -32,7 +32,6 @@ export function showPreview( //Insert check method to see if the preview is already open const preview = new Preview(options, openCodeSnippetEditor, editorServices); if (preview.ready === false) { - console.log('This is where I am stuck.'); return; } return preview.launch(); @@ -159,9 +158,6 @@ export class Preview extends Widget { */ protected _evtClick(event: MouseEvent): void { //gray area - console.log( - "If this function hasn't been hit for the same snippet then don't launchhhh for that snippet" - ); const content = this.node.getElementsByClassName( PREVIEW_CONTENT )[0] as HTMLElement; @@ -330,9 +326,8 @@ export class Preview extends Widget { }) }) }); + this.editor.setSize({ width: 300, height: 106 }); } - this.editor.setSize({ width: 300, height: 106 }); - console.log(document.getElementById(PREVIEW_CONTENT + this._id)); if (this.isVisible) { this._hasRefreshedSinceAttach = true; this.editor.refresh(); diff --git a/src/SearchBar.tsx b/src/SearchBar.tsx deleted file mode 100644 index 2c8b7f5..0000000 --- a/src/SearchBar.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { InputGroup } from '@jupyterlab/ui-components'; -import React from 'react'; - -interface ISearchProp { - onSearch: (searchValue: string) => void; -} - -export class SearchBar extends React.Component { - state = { - value: '' - }; - - updateValue = (event: React.ChangeEvent): void => { - this.setState({ value: event.target.value }, this.searchSnippets); - }; - - searchSnippets = (): void => { - this.props.onSearch(this.state.value); - }; - - render(): JSX.Element { - return ( -
- -
- ); - } -} diff --git a/style/index.css b/style/index.css index 1074544..febbf04 100644 --- a/style/index.css +++ b/style/index.css @@ -286,10 +286,14 @@ cursor: pointer; } */ -.jp-codesnippet-searchbar { +.jp-codeSnippet-searchbar { margin: 10px; } +.jp-codeSnippet-filterTools { + border-bottom: var(--jp-border-width) solid var(--jp-border-color1); +} + .triangle:hover { border-color: transparent #1976d2 transparent transparent; } @@ -529,7 +533,6 @@ mark.jp-search-bolding { /* code snippet filter */ .jp-codeSnippet-filter { - /* border-bottom: var(--jp-border-width) solid var(--jp-border-color1); */ display: flex; flex-direction: column; align-items: center; @@ -548,6 +551,10 @@ mark.jp-search-bolding { display: inline-block; border-bottom: 1px dotted black; */ } +.jp-codeSnippet-filter-arrow-up.idle, +.jp-codeSnippet-filter-option.idle { + display: none; +} .jp-codeSnippet-filter-arrow-up { position: absolute; @@ -591,50 +598,6 @@ mark.jp-search-bolding { border: none; color: var(--jp-ui-font-color2); } -/* -.jp-codeSnippet-filter-option { - background: #333; - color: white; - font-weight: bold; - padding: 4px 8px; - font-size: 13px; - border-radius: 4px; - /* display: none; */ -/* } */ - -/* .jp-codeSnippet-filter-option[data-show] { - display: block; -} */ - -/* #arrow, -#arrow::before { - position: absolute; - width: 8px; - height: 8px; - z-index: -1; -} - -#arrow::before { - content: ''; - transform: rotate(45deg); - background: #333; -} - -.jp-codeSnippet-filter-option[data-popper-placement^='top'] > #arrow { - bottom: -4px; -} - -.jp-codeSnippet-filter-option[data-popper-placement^='bottom'] > #arrow { - top: -4px; -} - -.jp-codeSnippet-filter-option[data-popper-placement^='left'] > #arrow { - right: -4px; -} - -.jp-codeSnippet-filter-option[data-popper-placement^='right'] > #arrow { - left: -4px; -} */ /* code snippet create button */ .jp-createSnippetBtn { diff --git a/yarn.lock b/yarn.lock index 8579e84..7fe6de4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,12 +30,12 @@ dependencies: regenerator-runtime "^0.13.4" -"@blueprintjs/core@^3.22.2", "@blueprintjs/core@^3.30.1": - version "3.30.1" - resolved "https://registry.yarnpkg.com/@blueprintjs/core/-/core-3.30.1.tgz#e9edad79ee474dc5b2c1ac3a54055174482f94e3" - integrity sha512-vx4Sfpj3EatYGp7BbL9Y8bFHl9XeQhD86QDbK3E2QH+rPSVod1HvUmGnEvzt0fgbpYWGhfIx/AIEj9D4Ap3rKg== +"@blueprintjs/core@^3.22.2", "@blueprintjs/core@^3.31.0": + version "3.31.0" + resolved "https://registry.yarnpkg.com/@blueprintjs/core/-/core-3.31.0.tgz#75702c3cdcb84cf28ba1e9e856b7b863700d8cc4" + integrity sha512-kfCYeyY2ojTMU5hxURNCwV4jQNDmLjTMOPImtbdW3Z7gHwiT2OA9qgNCkM0lhUjv0vyZ5py+AtZalx2FOH6PiA== dependencies: - "@blueprintjs/icons" "^3.20.0" + "@blueprintjs/icons" "^3.20.1" "@types/dom4" "^2.0.1" classnames "^2.2" dom4 "^2.1.5" @@ -45,24 +45,24 @@ react-popper "^1.3.7" react-transition-group "^2.9.0" resize-observer-polyfill "^1.5.1" - tslib "~1.10.0" + tslib "~1.13.0" -"@blueprintjs/icons@^3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@blueprintjs/icons/-/icons-3.20.0.tgz#8eae6fa490735ed2e20a670851cb6ff9d0d3973f" - integrity sha512-bEn7S/aYF8K1p9QJb4KcQ8R9vJLDJ+VtB81w0JlMWIrWTJyM/U3953mp22mK/jr7zJ1pyVIzw6ZRSrG8ht4rgw== +"@blueprintjs/icons@^3.20.1": + version "3.20.1" + resolved "https://registry.yarnpkg.com/@blueprintjs/icons/-/icons-3.20.1.tgz#fde6bf4daaf644947497f19aa2c4b853ffc623df" + integrity sha512-BYXr2oOeKlcYoqpbCj2qCmTvAMf1HEM98v0yo024NXKFcnBdcf9ZF3/y4vmrRUijSJ2JLLCR+a0XE3lhweFWow== dependencies: classnames "^2.2" - tslib "~1.10.0" + tslib "~1.13.0" "@blueprintjs/select@^3.11.2": - version "3.13.6" - resolved "https://registry.yarnpkg.com/@blueprintjs/select/-/select-3.13.6.tgz#9ed41e150011d27e615cb50200fa5c6c767800e3" - integrity sha512-qE5pcFNc7occAFJtEWx8SysRylZSWTyOtGNuAF3MjC4iqVnhBcQJjGGTAC2lf42ZD3OL4u14TI0kFEEB4VNnQQ== + version "3.13.7" + resolved "https://registry.yarnpkg.com/@blueprintjs/select/-/select-3.13.7.tgz#166675a8caeccacdb31216e92ef114f29888dbf6" + integrity sha512-kJVtbDDGVwIIC1+cN7H0DUrlumSVZGNEq2CnczQNI07RkHpPzuIR5stjn3LU+NjtCa3pidPNr4w78JRTesZzLg== dependencies: - "@blueprintjs/core" "^3.30.1" + "@blueprintjs/core" "^3.31.0" classnames "^2.2" - tslib "~1.10.0" + tslib "~1.13.0" "@elyra/application@^1.0.0-beta.1": version "1.0.0" @@ -634,9 +634,9 @@ integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== "@types/react@~16.9.16": - version "16.9.44" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.44.tgz#da84b179c031aef67dc92c33bd3401f1da2fa3bc" - integrity sha512-BtLoJrXdW8DVZauKP+bY4Kmiq7ubcJq+H/aCpRfvPF7RAT3RwR73Sg8szdc2YasbAlWBDrQ6Q+AFM0KwtQY+WQ== + version "16.9.46" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.46.tgz#f0326cd7adceda74148baa9bff6e918632f5069e" + integrity sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -1135,9 +1135,9 @@ eslint-plugin-prettier@^3.1.2: prettier-linter-helpers "^1.0.0" eslint-plugin-react@^7.20.4: - version "7.20.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.5.tgz#29480f3071f64a04b2c3d99d9b460ce0f76fb857" - integrity sha512-ajbJfHuFnpVNJjhyrfq+pH1C0gLc2y94OiCbAXT5O0J0YCKaFEHDV8+3+mDOr+w8WguRX+vSs1bM2BDG0VLvCw== + version "7.20.6" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz#4d7845311a93c463493ccfa0a19c9c5d0fd69f60" + integrity sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg== dependencies: array-includes "^3.1.1" array.prototype.flatmap "^1.2.3" @@ -1372,9 +1372,9 @@ get-stdin@^6.0.0: integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== get-stream@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" @@ -1673,9 +1673,9 @@ lint-staged@^10.2.11: stringify-object "^3.3.0" listr2@^2.1.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.4.1.tgz#006fc94ae77b3195403cbf3a4a563e2d6366224f" - integrity sha512-8pYsCZCztr5+KAjReLyBeGhLV0vaQ2Du/eMe/ux9QAfQl7efiWejM1IWjALh0zHIRYuIbhQ8N2KztZ4ci56pnQ== + version "2.5.1" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.5.1.tgz#f265dddf916c8a9b475437b34ae85a7d8f495c7a" + integrity sha512-qkNRW70SwfwWLD/eiaTf2tfgWT/ZvjmMsnEFJOCzac0cjcc8rYHDBr1eQhRxopj6lZO7Oa5sS/pZzS6q+BsX+w== dependencies: chalk "^4.1.0" cli-truncate "^2.1.0" @@ -1683,7 +1683,7 @@ listr2@^2.1.0: indent-string "^4.0.0" log-update "^4.0.0" p-map "^4.0.0" - rxjs "^6.6.0" + rxjs "^6.6.2" through "^2.3.8" locate-path@^5.0.0: @@ -1724,9 +1724,9 @@ lodash.mergewith@^4.6.1: integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== log-symbols@^4.0.0: version "4.0.0" @@ -1911,9 +1911,9 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: wrappy "1" onetime@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.1.tgz#5c8016847b0d67fcedb7eef254751cfcdc7e9418" - integrity sha512-ZpZpjcJeugQfWsfyQlshVoowIIQ1qBGSVll4rfDq6JJVO//fesjoX808hXWfBjY+ROZgpKDI5TRSRBSoJiZ8eg== + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" @@ -2244,7 +2244,13 @@ rimraf@^2.6.1: dependencies: glob "^7.1.3" -rxjs@^6.6.0: + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +rxjs@^6.6.0, rxjs@^6.6.2: version "6.6.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== @@ -2517,16 +2523,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1, tslib@^1.9.0, tslib@~1.13.0: version "1.13.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== -tslib@~1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== - tsutils@^3.17.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"