Browse Source

Removing empty columns (with no cells anchored).

Kuba Niegowski 5 years ago
parent
commit
12e1b3aa59

+ 13 - 3
packages/ckeditor5-table/src/commands/mergecellcommand.js

@@ -11,6 +11,7 @@ import Command from '@ckeditor/ckeditor5-core/src/command';
 import TableWalker from '../tablewalker';
 import { getTableCellsContainingSelection } from '../utils/selection';
 import { findAncestor, isHeadingColumnCell } from '../utils/common';
+import { getEmptyColumnsIndexes } from '../utils/structure';
 
 /**
  * The merge cell command.
@@ -104,12 +105,21 @@ export default class MergeCellCommand extends Command {
 			writer.setAttribute( spanAttribute, cellSpan + cellToMergeSpan, cellToExpand );
 			writer.setSelection( writer.createRangeIn( cellToExpand ) );
 
+			const tableUtils = this.editor.plugins.get( 'TableUtils' );
+			const table = findAncestor( 'table', removedTableCellRow );
+
 			// Remove empty row after merging.
 			if ( !removedTableCellRow.childCount ) {
-				const tableUtils = this.editor.plugins.get( 'TableUtils' );
-				const table = findAncestor( 'table', removedTableCellRow );
-
 				tableUtils.removeRows( table, { at: removedTableCellRow.index, batch: writer.batch } );
+			} else {
+				// If there were some rows removed then empty columns were already verified.
+				const emptyColumnsIndexes = getEmptyColumnsIndexes( table );
+
+				if ( emptyColumnsIndexes.length ) {
+					emptyColumnsIndexes.reverse().forEach( column => {
+						tableUtils.removeColumns( table, { at: column, batch: writer.batch } );
+					} );
+				}
 			}
 		} );
 	}

+ 15 - 3
packages/ckeditor5-table/src/commands/mergecellscommand.js

@@ -11,6 +11,7 @@ import Command from '@ckeditor/ckeditor5-core/src/command';
 import TableUtils from '../tableutils';
 import { getSelectedTableCells, isSelectionRectangular } from '../utils/selection';
 import { findAncestor, updateNumericAttribute } from '../utils/common';
+import { getEmptyColumnsIndexes } from '../utils/structure';
 
 /**
  * The merge cells command.
@@ -69,10 +70,21 @@ export default class MergeCellsCommand extends Command {
 				}
 			}
 
-			if ( emptyRowsIndexes.length ) {
-				const table = findAncestor( 'table', firstTableCell );
+			const table = findAncestor( 'table', firstTableCell );
 
-				emptyRowsIndexes.reverse().forEach( row => tableUtils.removeRows( table, { at: row, batch: writer.batch } ) );
+			if ( emptyRowsIndexes.length ) {
+				emptyRowsIndexes.reverse().forEach( row => {
+					tableUtils.removeRows( table, { at: row, batch: writer.batch } );
+				} );
+			} else {
+				// If there were some rows removed then empty columns were already verified.
+				const emptyColumnsIndexes = getEmptyColumnsIndexes( table );
+
+				if ( emptyColumnsIndexes.length ) {
+					emptyColumnsIndexes.reverse().forEach( column => {
+						tableUtils.removeColumns( table, { at: column, batch: writer.batch } );
+					} );
+				}
 			}
 
 			writer.setSelection( firstTableCell, 'in' );

+ 14 - 2
packages/ckeditor5-table/src/tableutils.js

@@ -11,6 +11,7 @@ import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 
 import TableWalker from './tablewalker';
 import { createEmptyTableCell, updateNumericAttribute } from './utils/common';
+import { getEmptyColumnsIndexes } from './utils/structure';
 
 /**
  * The table utilities plugin.
@@ -336,7 +337,16 @@ export default class TableUtils extends Plugin {
 				updateNumericAttribute( 'rowspan', rowspan, cell, writer );
 			}
 
-			// 2d. Adjust heading rows if removed rows were in a heading section.
+			// 2d. Check if there are any empty columns (no anchored cells).
+			const emptyColumnsIndexes = getEmptyColumnsIndexes( table );
+
+			if ( emptyColumnsIndexes.length ) {
+				emptyColumnsIndexes.reverse().forEach( column => {
+					this.removeColumns( table, { at: column, batch: writer.batch } );
+				} );
+			}
+
+			// 2e. Adjust heading rows if removed rows were in a heading section.
 			updateHeadingRows( table, first, last, model, batch );
 		} );
 	}
@@ -401,7 +411,9 @@ export default class TableUtils extends Plugin {
 				}
 			}
 
-			emptyRowsIndexes.reverse().forEach( row => this.removeRows( table, { at: row, batch: writer.batch } ) );
+			emptyRowsIndexes.reverse().forEach( row => {
+				this.removeRows( table, { at: row, batch: writer.batch } );
+			} );
 		} );
 	}
 

+ 33 - 0
packages/ckeditor5-table/src/utils/structure.js

@@ -305,3 +305,36 @@ function addHeadingsToCroppedTable( croppedTable, sourceTable, startRow, startCo
 		updateNumericAttribute( 'headingColumns', headingColumnsInCrop, croppedTable, writer, 0 );
 	}
 }
+
+/**
+ * Returns array of column indexes that have no cells anchored.
+ *
+ * For this table:
+ *
+ *     +----+----+----+----+----+----+----+
+ *     | 00 | 01      | 03 | 04      | 06 |
+ *     +----+----+----+----+         +----+
+ *     | 10 | 11      | 13 |         | 16 |
+ *     +----+----+----+----+----+----+----+
+ *     | 20 | 21      | 23 | 24      | 26 |
+ *     +----+----+----+----+----+----+----+
+ *                  ^--- empty ---^
+ *
+ * Will return: [ 2, 5 ]
+ */
+export function getEmptyColumnsIndexes( table ) {
+	const tableMap = Array.from( new TableWalker( table, { includeAllSlots: true } ) );
+	const lastColumn = tableMap[ tableMap.length - 1 ].column;
+
+	const columns = new Array( lastColumn + 1 ).fill( 0 );
+
+	for ( const { column, isAnchor } of tableMap ) {
+		if ( isAnchor ) {
+			columns[ column ]++;
+		}
+	}
+
+	return columns.reduce( ( result, cellsCount, column ) => {
+		return cellsCount ? result : [ ...result, column ];
+	}, [] );
+}

+ 62 - 18
packages/ckeditor5-table/tests/commands/mergecellcommand.js

@@ -189,49 +189,69 @@ describe( 'MergeCellCommand', () => {
 		describe( 'execute()', () => {
 			it( 'should merge table cells', () => {
 				setData( model, modelTable( [
+					[ '[]00', '01' ],
+					[ '10', '11' ]
+				] ) );
+
+				command.execute();
+
+				assertEqualMarkup( getData( model ), modelTable( [
+					[ { colspan: 2, contents: '<paragraph>[00</paragraph><paragraph>01]</paragraph>' } ],
+					[ '10', '11' ]
+				] ) );
+			} );
+
+			it( 'should merge table cells and remove empty columns', () => {
+				setData( model, modelTable( [
 					[ '[]00', '01' ]
 				] ) );
 
 				command.execute();
 
 				assertEqualMarkup( getData( model ), modelTable( [
-					[ { colspan: 2, contents: '<paragraph>[00</paragraph><paragraph>01]</paragraph>' } ]
+					[ '<paragraph>[00</paragraph><paragraph>01]</paragraph>' ]
 				] ) );
 			} );
 
 			it( 'should result in single empty paragraph if both cells are empty', () => {
 				setData( model, modelTable( [
-					[ '[]', '' ]
+					[ '[]', '' ],
+					[ '10', '11' ]
 				] ) );
 
 				command.execute();
 
 				assertEqualMarkup( getData( model ), modelTable( [
-					[ { colspan: 2, contents: '<paragraph>[]</paragraph>' } ]
+					[ { colspan: 2, contents: '<paragraph>[]</paragraph>' } ],
+					[ '10', '11' ]
 				] ) );
 			} );
 
 			it( 'should result in single paragraph (other cell is empty)', () => {
 				setData( model, modelTable( [
-					[ 'foo[]', '' ]
+					[ 'foo[]', '' ],
+					[ '10', '11' ]
 				] ) );
 
 				command.execute();
 
 				assertEqualMarkup( getData( model ), modelTable( [
-					[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ]
+					[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ],
+					[ '10', '11' ]
 				] ) );
 			} );
 
 			it( 'should result in single paragraph (selection cell is empty)', () => {
 				setData( model, modelTable( [
-					[ '[]', 'foo' ]
+					[ '[]', 'foo' ],
+					[ '10', '11' ]
 				] ) );
 
 				command.execute();
 
 				assertEqualMarkup( getData( model ), modelTable( [
-					[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ]
+					[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ],
+					[ '10', '11' ]
 				] ) );
 			} );
 
@@ -243,13 +263,15 @@ describe( 'MergeCellCommand', () => {
 				} );
 
 				setData( model, modelTable( [
-					[ '<block>[]</block>', '<block></block>' ]
+					[ '<block>[]</block>', '<block></block>' ],
+					[ '10', '11' ]
 				] ) );
 
 				command.execute();
 
 				assertEqualMarkup( getData( model ), modelTable( [
-					[ { colspan: 2, contents: '<block>[</block><block>]</block>' } ]
+					[ { colspan: 2, contents: '<block>[</block><block>]</block>' } ],
+					[ '10', '11' ]
 				] ) );
 			} );
 		} );
@@ -403,49 +425,69 @@ describe( 'MergeCellCommand', () => {
 		describe( 'execute()', () => {
 			it( 'should merge table cells', () => {
 				setData( model, modelTable( [
+					[ '00', '[]01' ],
+					[ '10', '11' ]
+				] ) );
+
+				command.execute();
+
+				assertEqualMarkup( getData( model ), modelTable( [
+					[ { colspan: 2, contents: '<paragraph>[00</paragraph><paragraph>01]</paragraph>' } ],
+					[ '10', '11' ]
+				] ) );
+			} );
+
+			it( 'should merge table cells and remove empty columns', () => {
+				setData( model, modelTable( [
 					[ '00', '[]01' ]
 				] ) );
 
 				command.execute();
 
 				assertEqualMarkup( getData( model ), modelTable( [
-					[ { colspan: 2, contents: '<paragraph>[00</paragraph><paragraph>01]</paragraph>' } ]
+					[ '<paragraph>[00</paragraph><paragraph>01]</paragraph>' ]
 				] ) );
 			} );
 
 			it( 'should result in single empty paragraph if both cells are empty', () => {
 				setData( model, modelTable( [
-					[ '', '[]' ]
+					[ '', '[]' ],
+					[ '10', '11' ]
 				] ) );
 
 				command.execute();
 
 				assertEqualMarkup( getData( model ), modelTable( [
-					[ { colspan: 2, contents: '<paragraph>[]</paragraph>' } ]
+					[ { colspan: 2, contents: '<paragraph>[]</paragraph>' } ],
+					[ '10', '11' ]
 				] ) );
 			} );
 
 			it( 'should result in single paragraph (other cell is empty)', () => {
 				setData( model, modelTable( [
-					[ '', 'foo[]' ]
+					[ '', 'foo[]' ],
+					[ '10', '11' ]
 				] ) );
 
 				command.execute();
 
 				assertEqualMarkup( getData( model ), modelTable( [
-					[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ]
+					[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ],
+					[ '10', '11' ]
 				] ) );
 			} );
 
 			it( 'should result in single paragraph (selection cell is empty)', () => {
 				setData( model, modelTable( [
-					[ 'foo', '[]' ]
+					[ 'foo', '[]' ],
+					[ '10', '11' ]
 				] ) );
 
 				command.execute();
 
 				assertEqualMarkup( getData( model ), modelTable( [
-					[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ]
+					[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ],
+					[ '10', '11' ]
 				] ) );
 			} );
 
@@ -457,13 +499,15 @@ describe( 'MergeCellCommand', () => {
 				} );
 
 				setData( model, modelTable( [
-					[ '<block></block>', '<block>[]</block>' ]
+					[ '<block></block>', '<block>[]</block>' ],
+					[ '10', '11' ]
 				] ) );
 
 				command.execute();
 
 				assertEqualMarkup( getData( model ), modelTable( [
-					[ { colspan: 2, contents: '<block>[</block><block>]</block>' } ]
+					[ { colspan: 2, contents: '<block>[</block><block>]</block>' } ],
+					[ '10', '11' ]
 				] ) );
 			} );
 		} );

+ 54 - 11
packages/ckeditor5-table/tests/commands/mergecellscommand.js

@@ -312,6 +312,25 @@ describe( 'MergeCellsCommand', () => {
 	describe( 'execute()', () => {
 		it( 'should merge simple table cell selection', () => {
 			setData( model, modelTable( [
+				[ '[]00', '01' ],
+				[ '10', '11' ]
+			] ) );
+
+			tableSelection.setCellSelection(
+				root.getNodeByPath( [ 0, 0, 0 ] ),
+				root.getNodeByPath( [ 0, 0, 1 ] )
+			);
+
+			command.execute();
+
+			assertEqualMarkup( getData( model ), modelTable( [
+				[ { colspan: 2, contents: '<paragraph>[00</paragraph><paragraph>01]</paragraph>' } ],
+				[ '10', '11' ]
+			] ) );
+		} );
+
+		it( 'should merge simple table cell selection and remove empty columns', () => {
+			setData( model, modelTable( [
 				[ '[]00', '01' ]
 			] ) );
 
@@ -323,7 +342,7 @@ describe( 'MergeCellsCommand', () => {
 			command.execute();
 
 			assertEqualMarkup( getData( model ), modelTable( [
-				[ { colspan: 2, contents: '<paragraph>[00</paragraph><paragraph>01]</paragraph>' } ]
+				[ '<paragraph>[00</paragraph><paragraph>01]</paragraph>' ]
 			] ) );
 		} );
 
@@ -403,9 +422,17 @@ describe( 'MergeCellsCommand', () => {
 		} );
 
 		it( 'should merge table cells - extend colspan attribute', () => {
+			// +----+----+----+----+
+			// | 00      | 02 | 03 |
+			// +----+----+----+----+
+			// | 10 | 11 | 12 | 13 |
+			// +----+----+----+----+
+			// | 20 | 21 | 22 | 23 |
+			// +----+----+----+----+
 			setData( model, modelTable( [
 				[ { colspan: 2, contents: '00' }, '02', '03' ],
-				[ '10', '11', '12', '13' ]
+				[ '10', '11', '12', '13' ],
+				[ '20', '21', '22', '23' ]
 			] ) );
 
 			selectNodes( [
@@ -415,6 +442,13 @@ describe( 'MergeCellsCommand', () => {
 
 			command.execute();
 
+			// +----+----+----+----+
+			// | 00        02 | 03 |
+			// +              +----+
+			// | 10   11   12 | 13 |
+			// +----+----+----+----+
+			// | 20 | 21 | 22 | 23 |
+			// +----+----+----+----+
 			assertEqualMarkup( getData( model ), modelTable( [
 				[ {
 					colspan: 3,
@@ -425,13 +459,15 @@ describe( 'MergeCellsCommand', () => {
 						'<paragraph>11</paragraph>' +
 						'<paragraph>12]</paragraph>'
 				}, '03' ],
-				[ '13' ]
+				[ '13' ],
+				[ '20', '21', '22', '23' ]
 			] ) );
 		} );
 
 		it( 'should merge to a single paragraph - every cell is empty', () => {
 			setData( model, modelTable( [
-				[ '[]', '' ]
+				[ '[]', '' ],
+				[ '10', '11' ]
 			] ) );
 
 			selectNodes( [ [ 0, 0, 0 ], [ 0, 0, 1 ] ] );
@@ -439,13 +475,15 @@ describe( 'MergeCellsCommand', () => {
 			command.execute();
 
 			assertEqualMarkup( getData( model ), modelTable( [
-				[ { colspan: 2, contents: '<paragraph>[]</paragraph>' } ]
+				[ { colspan: 2, contents: '<paragraph>[]</paragraph>' } ],
+				[ '10', '11' ]
 			] ) );
 		} );
 
 		it( 'should merge to a single paragraph - merged cell is empty', () => {
 			setData( model, modelTable( [
-				[ 'foo', '' ]
+				[ 'foo', '' ],
+				[ '10', '11' ]
 			] ) );
 
 			selectNodes( [ [ 0, 0, 0 ], [ 0, 0, 1 ] ] );
@@ -453,13 +491,15 @@ describe( 'MergeCellsCommand', () => {
 			command.execute();
 
 			assertEqualMarkup( getData( model ), modelTable( [
-				[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ]
+				[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ],
+				[ '10', '11' ]
 			] ) );
 		} );
 
 		it( 'should merge to a single paragraph - cell to which others are merged is empty', () => {
 			setData( model, modelTable( [
-				[ '', 'foo' ]
+				[ '', 'foo' ],
+				[ '10', '11' ]
 			] ) );
 
 			selectNodes( [ [ 0, 0, 0 ], [ 0, 0, 1 ] ] );
@@ -467,7 +507,8 @@ describe( 'MergeCellsCommand', () => {
 			command.execute();
 
 			assertEqualMarkup( getData( model ), modelTable( [
-				[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ]
+				[ { colspan: 2, contents: '<paragraph>[foo]</paragraph>' } ],
+				[ '10', '11' ]
 			] ) );
 		} );
 
@@ -479,7 +520,8 @@ describe( 'MergeCellsCommand', () => {
 			} );
 
 			setData( model, modelTable( [
-				[ '<block>[]</block>', '<block></block>' ]
+				[ '<block>[]</block>', '<block></block>' ],
+				[ '10', '11' ]
 			] ) );
 
 			selectNodes( [ [ 0, 0, 0 ], [ 0, 0, 1 ] ] );
@@ -487,7 +529,8 @@ describe( 'MergeCellsCommand', () => {
 			command.execute();
 
 			assertEqualMarkup( getData( model ), modelTable( [
-				[ { colspan: 2, contents: '<block>[</block><block>]</block>' } ]
+				[ { colspan: 2, contents: '<block>[</block><block>]</block>' } ],
+				[ '10', '11' ]
 			] ) );
 		} );
 

+ 13 - 0
packages/ckeditor5-table/tests/commands/removerowcommand.js

@@ -535,5 +535,18 @@ describe( 'RemoveRowCommand', () => {
 				[ '30', '31', '32' ]
 			] ) );
 		} );
+
+		it( 'should remove empty columns after removing row', () => {
+			setData( model, modelTable( [
+				[ '00', { contents: '01', colspan: 2 } ],
+				[ '[]10', '11', '12' ]
+			] ) );
+
+			command.execute();
+
+			assertEqualMarkup( getData( model ), modelTable( [
+				[ '[]00', '01' ]
+			] ) );
+		} );
 	} );
 } );

+ 12 - 2
packages/ckeditor5-table/tests/manual/tablemocking.html

@@ -25,9 +25,19 @@
 	#input-status {
 		color: hsl( 0, 90%, 50% );
 	}
+	#tools {
+		margin-bottom: 10px;
+	}
+	#tools input[type="checkbox"] {
+		vertical-align: middle;
+	}
+	#tools label > span {
+		vertical-align: middle;
+		display: inline-block;
+	}
 </style>
 
-<div style="margin-bottom: 10px;">
+<div id="tools">
 	<label for="model-data">Table data as expected by <a href="https://github.com/ckeditor/ckeditor5-table/blob/1004f9106110be9de125825afd491a1618b71271/tests/_utils/utils.js#L48">modelTable</a> helper function:</label>
 	<textarea id="model-data">
 [
@@ -43,7 +53,7 @@
 	<button type="button" id="set-model-data">↓ Set model data ↓</button>
 	<button type="button" id="get-model-data">↑ Get model data ↑</button>
 	<button type="button" id="renumber-cells">Renumber cells</button>
-	<label><input type="checkbox" id="use-letters" checked="false">Use letters</label>
+	<label><input type="checkbox" id="use-letters" checked="false"><span>Use letters</span></label>
 
 	<span id="input-status"></span>
 </div>

+ 8 - 3
packages/ckeditor5-table/tests/tableselection-integration.js

@@ -229,7 +229,10 @@ describe( 'TableSelection - integration', () => {
 
 		// See https://github.com/ckeditor/ckeditor5/issues/6634.
 		it( 'works with merge cells command', () => {
-			setModelData( editor.model, modelTable( [ [ '00', '01' ] ] ) );
+			setModelData( editor.model, modelTable( [
+				[ '00', '01' ],
+				[ '10', '11' ]
+			] ) );
 
 			tableSelection.setCellSelection(
 				modelRoot.getNodeByPath( [ 0, 0, 0 ] ),
@@ -239,13 +242,15 @@ describe( 'TableSelection - integration', () => {
 			editor.execute( 'mergeTableCells' );
 
 			assertEqualMarkup( getModelData( model ), modelTable( [
-				[ { colspan: 2, contents: '<paragraph>[00</paragraph><paragraph>01]</paragraph>' } ]
+				[ { colspan: 2, contents: '<paragraph>[00</paragraph><paragraph>01]</paragraph>' } ],
+				[ '10', '11' ]
 			] ) );
 
 			editor.execute( 'undo' );
 
 			assertEqualMarkup( getModelData( model ), modelTable( [
-				[ '[]00', '01' ]
+				[ '[]00', '01' ],
+				[ '10', '11' ]
 			] ) );
 		} );
 	} );

+ 16 - 16
yarn.lock

@@ -1178,9 +1178,9 @@
     "@types/node" ">= 8"
 
 "@octokit/types@^4.0.1":
-  version "4.1.3"
-  resolved "https://registry.yarnpkg.com/@octokit/types/-/types-4.1.3.tgz#9a90f2c2dd2d42105c4dbf5cabcb31e4ac960835"
-  integrity sha512-MMBEO1k+fMa44gATPamxdpZmya9ugPBdcxwBIPgnH8/uD/1FWO3hiQFMGJT8diUk7E5UnnkraTFx00oHfUIFAA==
+  version "4.1.4"
+  resolved "https://registry.yarnpkg.com/@octokit/types/-/types-4.1.4.tgz#75a0bcdff6198ef98d7edf108c4d7f2c585caefa"
+  integrity sha512-W+aHUBA6pEZ8OC1fgfFW1/jrgtkaMVBhNr7jhhBErvbWQY4Ii9Hlf3LAurwcy5XXjz8EYluiCZjHhnQO4GSfNg==
   dependencies:
     "@types/node" ">= 8"
 
@@ -1340,9 +1340,9 @@
   integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
 
 "@types/node@*", "@types/node@>= 8":
-  version "14.0.6"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.6.tgz#f9e178b2da31a4b0ec60b64649e244c31ce18daf"
-  integrity sha512-FbNmu4F67d3oZMWBV6Y4MaPER+0EpE9eIYf2yaHhCWovc1dlXCZkqGX4NLHfVVr6umt20TNBdRzrNJIzIKfdbw==
+  version "14.0.9"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.9.tgz#43896ab87fc82bda1dfd600cdf44a0c8a64e11d2"
+  integrity sha512-0sCTiXKXELOBxvZLN4krQ0FPOAA7ij+6WwvD0k/PHd9/KAkr4dXel5J9fh6F4x1FwAQILqAWkmpeuS6mjf1iKA==
 
 "@types/node@^13.7.0":
   version "13.13.9"
@@ -4218,9 +4218,9 @@ ee-first@1.1.1:
   integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
 
 electron-to-chromium@^1.3.413:
-  version "1.3.455"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.455.tgz#fd65a3f5db6ffa83eb7c84f16ea9b1b7396f537d"
-  integrity sha512-4lwnxp+ArqOX9hiLwLpwhfqvwzUHFuDgLz4NTiU3lhygUzWtocIJ/5Vix+mWVNE2HQ9aI1k2ncGe5H/0OktMvA==
+  version "1.3.456"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.456.tgz#5125bce136b04a8e39473696509e83038f679cbd"
+  integrity sha512-jaVZ9+8HG2qvEN7c9r5EVguvhtevITJou4L10XuqoiZUoXIMF5qLG1pB9raP3WFcME4exDZRq1b6qyCA+u5Vew==
 
 elegant-spinner@^2.0.0:
   version "2.0.0"
@@ -5490,9 +5490,9 @@ globby@^10.0.1:
     slash "^3.0.0"
 
 globby@^11.0.0:
-  version "11.0.0"
-  resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154"
-  integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==
+  version "11.0.1"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
+  integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
   dependencies:
     array-union "^2.1.0"
     dir-glob "^3.0.1"
@@ -6899,7 +6899,7 @@ jsbn@~0.1.0:
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
   integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
 
-"jsdoc@github:ckeditor/jsdoc#node12":
+jsdoc@ckeditor/jsdoc#node12:
   version "3.4.3"
   resolved "https://codeload.github.com/ckeditor/jsdoc/tar.gz/e6c213ab53c20457d2778953a6d3fc54311f9a67"
   dependencies:
@@ -9583,9 +9583,9 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^
   integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
 
 postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7:
-  version "7.0.31"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.31.tgz#332af45cb73e26c0ee2614d7c7fb02dfcc2bd6dd"
-  integrity sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA==
+  version "7.0.32"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d"
+  integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==
   dependencies:
     chalk "^2.4.2"
     source-map "^0.6.1"