devexpress-richedit 24.2.7-build-25107-0104 → 24.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -61,8 +61,8 @@ export class ClientRichEdit {
61
61
  this.rawDataSource = settings.rawDataSource;
62
62
  this.contextMenuSettings = settings.contextMenuSettings;
63
63
  this.fullScreenHelper = new FullScreenHelper(element);
64
- if ("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaVZqWlNVWEpJWkdZelVXRmlNbGQ1YldsWlpIZFlUU0lLZlE9PS53aEFZRnYvUVRDWlVKalVITm14M25DLzVnWE9aV09wQmFYbm9JMlg1MHJadTdrbm9Mc2lIRUs0REoyZWlQZi9tSEExRk9ySlltanFtSWdKWTZpQ2prSTVtYlVnN1N6ZEI0SUIvektuMTdlQlRUQit0YThVZDNzSThNK3NES2ZRd3NMNU5tdz09In0=")
65
- config(JSON.parse(atob("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaVZqWlNVWEpJWkdZelVXRmlNbGQ1YldsWlpIZFlUU0lLZlE9PS53aEFZRnYvUVRDWlVKalVITm14M25DLzVnWE9aV09wQmFYbm9JMlg1MHJadTdrbm9Mc2lIRUs0REoyZWlQZi9tSEExRk9ySlltanFtSWdKWTZpQ2prSTVtYlVnN1N6ZEI0SUIvektuMTdlQlRUQit0YThVZDNzSThNK3NES2ZRd3NMNU5tdz09In0=")));
64
+ if ("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaVVUTmhiM0ZJYzFKRU0zWllaVlZOVUdSWVNEZHhOU0lLZlE9PS5rMTA4KzRjbVFYSU96S1F1bUlqUE5oQkw0ejc5N0VSNlByVkkxcTB3V1QwbnkwUTVNZnkzRkJONlV5Zk9PV2p1eUJwaDR1ZllMM0llb0g4UHhNUU5wQUhUb3VUTTFFOHZaM01CM0lac2c1L1ZoOXhUNkg4TFJQSGZoQk00Rk5HUE5zNkY0dz09In0=")
65
+ config(JSON.parse(atob("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaVVUTmhiM0ZJYzFKRU0zWllaVlZOVUdSWVNEZHhOU0lLZlE9PS5rMTA4KzRjbVFYSU96S1F1bUlqUE5oQkw0ejc5N0VSNlByVkkxcTB3V1QwbnkwUTVNZnkzRkJONlV5Zk9PV2p1eUJwaDR1ZllMM0llb0g4UHhNUU5wQUhUb3VUTTFFOHZaM01CM0lac2c1L1ZoOXhUNkg4TFJQSGZoQk00Rk5HUE5zNkY0dz09In0=")));
66
66
  this.prepareElement(element, settings);
67
67
  this.initDefaultFontsAndStyles();
68
68
  this.initBars(settings.ribbon, settings.fonts);
@@ -44,7 +44,8 @@ export class MailMergeCommand extends CommandBase {
44
44
  return true;
45
45
  }
46
46
  executeCore(_state, options) {
47
- const docxExporter = new DocxExporter(this.control.modelManager.modelManipulator, new DocxExportOptions());
47
+ const exportModelOptions = this.control.getExportModelOptions();
48
+ const docxExporter = new DocxExporter(exportModelOptions, new DocxExportOptions());
48
49
  docxExporter.exportToBlob((blob) => {
49
50
  const docxImporter = new Importer(new ImporterOptions());
50
51
  docxImporter.importFromFile(blob, this.control.modelManager.richOptions, (documentModel, formatImagesImporter) => {
@@ -23,6 +23,9 @@ import { BaseSubDocumentExporter } from './exporters/sub-document/base-sub-docum
23
23
  import { TextBoxSubDocumentExporter } from './exporters/sub-document/text-box-content-exporter';
24
24
  import { IdGenerator } from './utils/id-generator';
25
25
  import { WriterHelper } from './utils/writer-helper';
26
+ import { Grid } from '../../../../common/layout-formatter/table/grid-engine/grid';
27
+ import { IExportModelOptions } from '../../../../common/formats/i-document-exporter';
28
+ import { Table } from '../../../../common/model/tables/main-structures/table';
26
29
  export declare class Data {
27
30
  get writer(): XmlWriter;
28
31
  set writer(val: XmlWriter);
@@ -30,6 +33,7 @@ export declare class Data {
30
33
  get relationExporter(): RelationCollectionExporter;
31
34
  get mainSubDocumentRelations(): DocumentRelationsExporter;
32
35
  model: DocumentModel;
36
+ grids: Map<Table, Grid>;
33
37
  options: DocxExportOptions;
34
38
  headerCounter: number;
35
39
  footerCounter: number;
@@ -58,7 +62,7 @@ export declare class Data {
58
62
  endNotes: Map<SubDocument, number>;
59
63
  private writerStack;
60
64
  private relationExporters;
61
- constructor(model: DocumentModel, options: DocxExportOptions);
65
+ constructor(exportModelOptions: IExportModelOptions, options: DocxExportOptions);
62
66
  popWriter(): void;
63
67
  pushRelationExporter(exporter: RelationCollectionExporter): void;
64
68
  popRelationExporter(): void;
@@ -23,11 +23,12 @@ export class Data {
23
23
  get subDocumentExporter() { return this.subDocumentExporterStack.last; }
24
24
  get relationExporter() { return ListUtils.last(this.relationExporters); }
25
25
  get mainSubDocumentRelations() { return this.relationExporters[0]; }
26
- constructor(model, options) {
26
+ constructor(exportModelOptions, options) {
27
27
  this.drawingElementId = 1;
28
28
  this.exportSubDocumentsList = [];
29
29
  this.relationExporters = [];
30
- this.model = model;
30
+ this.model = exportModelOptions.modelManager.model;
31
+ this.grids = exportModelOptions.grids;
31
32
  this.options = options;
32
33
  this.constants = new DocxConstants();
33
34
  this.writerStack = new Stack();
@@ -1,11 +1,10 @@
1
- import { IDocumentExporter } from '../../../../common/formats/i-document-exporter';
2
- import { ModelManipulator } from '../../../../common/model/manipulators/model-manipulator';
1
+ import { IDocumentExporter, IExportModelOptions } from '../../../../common/formats/i-document-exporter';
3
2
  import { DocxExportOptions } from './docx-export-options';
4
3
  export declare class DocxExporter implements IDocumentExporter {
5
4
  private data;
6
5
  private modelManipulator;
7
6
  private options;
8
- constructor(modelManipulator: ModelManipulator, options: DocxExportOptions);
7
+ constructor(exportModelOptions: IExportModelOptions, options: DocxExportOptions);
9
8
  exportToBlob(callback: (blob: Blob) => void): void;
10
9
  exportToBase64(callback: (base64: string) => void): void;
11
10
  private exportInner;
@@ -9,10 +9,10 @@ import { MainSubDocumentExporter } from './exporters/sub-document/main-sub-docum
9
9
  import { ThemeExporter } from './exporters/theme';
10
10
  import { EndNoteExporter, FootNoteExporter } from './exporters/sub-document/note-sub-document-exporter';
11
11
  export class DocxExporter {
12
- constructor(modelManipulator, options) {
13
- this.modelManipulator = modelManipulator;
12
+ constructor(exportModelOptions, options) {
13
+ this.modelManipulator = exportModelOptions.modelManager.modelManipulator;
14
14
  this.options = options;
15
- this.data = new Data(modelManipulator.model, options);
15
+ this.data = new Data(exportModelOptions, options);
16
16
  }
17
17
  exportToBlob(callback) {
18
18
  this.modelManipulator.picture.loader.ensureAllPicturesLoaded(this.options.ensurePictureLoadedTimeout, (_loaded) => {
@@ -8,7 +8,7 @@ export declare class TableExporter extends BaseExporter {
8
8
  private initTableDeferred;
9
9
  init(): void;
10
10
  checkTable(pos: number, allowInitNextTable: boolean): void;
11
- getTableGrid(table: Table): number[];
11
+ private getTableGrid;
12
12
  private initNewTables;
13
13
  private closeTables;
14
14
  private handleNextCell;
@@ -6,6 +6,7 @@ import { ListUtils } from '@devexpress/utils/lib/utils/list';
6
6
  import { BaseExporter } from '../../base';
7
7
  import { TableCellPropertiesExporter } from './table-cell-properties';
8
8
  import { TableRowPropertiesExporter } from './table-row-properties';
9
+ import { UnitConverter } from '@devexpress/utils/lib/class/unit-converter';
9
10
  export class TableExporter extends BaseExporter {
10
11
  constructor() {
11
12
  super(...arguments);
@@ -35,10 +36,9 @@ export class TableExporter extends BaseExporter {
35
36
  }
36
37
  }
37
38
  getTableGrid(table) {
38
- if (table.rows[0].logicColumnCount < 64)
39
- return [];
40
- const colGrid = [];
41
- return colGrid;
39
+ var _a, _b;
40
+ const grid = this.data.grids.get(table);
41
+ return ((_b = (_a = grid === null || grid === void 0 ? void 0 : grid.columns) === null || _a === void 0 ? void 0 : _a.width) === null || _b === void 0 ? void 0 : _b.map(UnitConverter.pixelsToTwips)) || [];
42
42
  }
43
43
  initNewTables(newIndexes, allowInitNextTable) {
44
44
  for (let levelIndex = this.tableIndexes.length; levelIndex < newIndexes.length; levelIndex++) {
@@ -12,10 +12,12 @@ export class ParagraphSpacingDestination extends ParagraphFormattingLeafElementD
12
12
  const spacingBefore = this.data.readerHelper.getWpSTIntegerValue(reader, 'before', Constants.MIN_SAFE_INTEGER);
13
13
  if (spacingBefore >= 0)
14
14
  this.paragraphProperties.setValue(ParagraphPropertyDescriptor.spacingBefore, spacingBefore);
15
- this.paragraphProperties.setValue(ParagraphPropertyDescriptor.beforeAutoSpacing, spacingBefore == -1 ||
16
- this.data.readerHelper.getWpSTOnOffValue(reader, new WordProcessingMLValue('beforeAutospacing', 'before-autospacing').openXmlValue, false));
17
- this.paragraphProperties.setValue(ParagraphPropertyDescriptor.afterAutoSpacing, spacingAfter == -1 ||
18
- this.data.readerHelper.getWpSTOnOffValue(reader, new WordProcessingMLValue('afterAutospacing', 'after-autospacing').openXmlValue, false));
15
+ const beforeAutoSpacing = this.data.readerHelper.getWpSTOnOffValue(reader, 'beforeAutospacing', null);
16
+ if (spacingBefore == -1 || beforeAutoSpacing != null)
17
+ this.paragraphProperties.setValue(ParagraphPropertyDescriptor.beforeAutoSpacing, spacingBefore == -1 || beforeAutoSpacing);
18
+ const afterAutoSpacing = this.data.readerHelper.getWpSTOnOffValue(reader, 'afterAutospacing', null);
19
+ if (spacingAfter == -1 || afterAutoSpacing != null)
20
+ this.paragraphProperties.setValue(ParagraphPropertyDescriptor.afterAutoSpacing, spacingAfter == -1 || afterAutoSpacing);
19
21
  const lineSpacing = this.data.readerHelper.getWpSTIntegerValue(reader, 'line', Constants.MIN_SAFE_INTEGER);
20
22
  if (lineSpacing != Constants.MIN_SAFE_INTEGER && lineSpacing > 0) {
21
23
  const attribute = new WordProcessingMLValue('lineRule', 'line-rule');
@@ -15,7 +15,7 @@ export function exportModelToBlob(exportModelOptions, callback) {
15
15
  function getExporter(exportModelOptions) {
16
16
  const { modelManipulator } = exportModelOptions.modelManager;
17
17
  switch (exportModelOptions.documentFormat) {
18
- case DocumentFormat.OpenXml: return new DocxExporter(modelManipulator, new DocxExportOptions());
18
+ case DocumentFormat.OpenXml: return new DocxExporter(exportModelOptions, new DocxExportOptions());
19
19
  case DocumentFormat.Rtf: return new RtfExporter(modelManipulator, new RtfDocumentExporterOptions());
20
20
  case DocumentFormat.PlainText: return new TxtExporter(modelManipulator, new DocumentExporterOptions());
21
21
  case DocumentFormat.Html: return new HtmlDocumentExporter(exportModelOptions, new DocumentExporterOptions());
@@ -1,6 +1,8 @@
1
1
  import { IPictureRenderer } from "../canvas/picture-renderer";
2
2
  import { DocumentFormat } from "../document-format";
3
+ import { Grid } from "../layout-formatter/table/grid-engine/grid";
3
4
  import { IModelManager } from "../model-manager";
5
+ import { Table } from "../model/tables/main-structures/table";
4
6
  import { IRichEditUnitConverter } from "../utils/unit-converter";
5
7
  export interface IDocumentExporter {
6
8
  exportToBlob(callback: (blob: Blob) => void): any;
@@ -14,5 +16,6 @@ export interface IExportModelOptions {
14
16
  sessionGuid: string;
15
17
  clientGuid: string;
16
18
  lastMaxNumPages?: number;
19
+ grids?: Map<Table, Grid>;
17
20
  pageIndex?: number;
18
21
  }
@@ -2,6 +2,8 @@ import { DocumentModel } from '../model/document-model';
2
2
  import { PositionManager } from '../model/position/position-manager';
3
3
  import { LayoutAnchoredObjectBox } from './main-structures/layout-boxes/layout-anchored-object-box';
4
4
  import { LayoutPage } from './main-structures/layout-page';
5
+ import { Grid } from '../layout-formatter/table/grid-engine/grid';
6
+ import { Table } from '../model/tables/main-structures/table';
5
7
  export declare class ModelPositionHolder {
6
8
  private pos;
7
9
  private posManager;
@@ -25,6 +27,7 @@ export declare class DocumentLayout {
25
27
  isFullyFormatted: boolean;
26
28
  anchorObjectsPositionInfo: AnchorObjectsPositionInfo;
27
29
  pageColor: number;
30
+ get grids(): Map<Table, Grid>;
28
31
  constructor(anchorObjectsPositionInfo: AnchorObjectsPositionInfo);
29
32
  setEmptyLayout(pageColor: number): void;
30
33
  getLastValidPage(): LayoutPage;
@@ -37,6 +37,12 @@ export class AnchorObjectsPositionInfo {
37
37
  }
38
38
  }
39
39
  export class DocumentLayout {
40
+ get grids() {
41
+ return this.pages.reduce((res, page) => {
42
+ page.grids.forEach((grid, table) => res.set(table, grid));
43
+ return res;
44
+ }, new Map());
45
+ }
40
46
  constructor(anchorObjectsPositionInfo) {
41
47
  this.anchorObjectsPositionInfo = anchorObjectsPositionInfo;
42
48
  this.setEmptyLayout(ColorHelper.NO_COLOR);
@@ -1,10 +1,13 @@
1
1
  import { Rectangle } from '@devexpress/utils/lib/geometry/rectangle';
2
2
  import { SubDocument } from '../../model/sub-document';
3
3
  import { LayoutColumn } from './layout-column';
4
+ import { Grid } from '../../layout-formatter/table/grid-engine/grid';
5
+ import { Table } from '../../model/tables/main-structures/table';
4
6
  export declare class LayoutPageArea extends Rectangle {
5
7
  subDocument: SubDocument;
6
8
  columns: LayoutColumn[];
7
9
  pageOffset: number;
10
+ get grids(): Map<Table, Grid>;
8
11
  constructor(subDocument: SubDocument);
9
12
  getEndPosition(): number;
10
13
  getLastColumn(): LayoutColumn;
@@ -1,6 +1,12 @@
1
1
  import { Rectangle } from '@devexpress/utils/lib/geometry/rectangle';
2
2
  import { ListUtils } from '@devexpress/utils/lib/utils/list';
3
3
  export class LayoutPageArea extends Rectangle {
4
+ get grids() {
5
+ return this.columns.reduce((res, column) => {
6
+ column.tablesInfo.forEach(tableInfo => res.set(tableInfo.logicInfo.grid.table, tableInfo.logicInfo.grid));
7
+ return res;
8
+ }, new Map());
9
+ }
4
10
  constructor(subDocument) {
5
11
  super(0, 0, 0, 0);
6
12
  this.columns = [];
@@ -8,6 +8,8 @@ import { AnchorObjectsPositionInfo } from '../document-layout';
8
8
  import { LayoutAnchoredObjectBox } from './layout-boxes/layout-anchored-object-box';
9
9
  import { LayoutPageArea } from './layout-page-area';
10
10
  import { TableAnchoredObjectsHolder } from '../../layout-formatter/table/utils/table-anchored-objects-holder';
11
+ import { Grid } from '../../layout-formatter/table/grid-engine/grid';
12
+ import { Table } from '../../model/tables/main-structures/table';
11
13
  export declare enum LayoutPageFlags {
12
14
  MustBeRendered = 1,
13
15
  ContentRendered = 2,
@@ -42,6 +44,7 @@ export declare class LayoutPage extends Rectangle {
42
44
  tableAnchoredObjectsHolder: TableAnchoredObjectsHolder;
43
45
  renderLevelCalculator: RenderLevelCalculator;
44
46
  private contentIntervals;
47
+ get grids(): Map<Table, Grid>;
45
48
  constructor();
46
49
  setRenderLevelCalculator(anchorObjectsPositionInfo: AnchorObjectsPositionInfo, compatibilityMode: CompatibilityMode): void;
47
50
  setAbsolutePosition(pos: number): void;
@@ -38,6 +38,14 @@ export class LayoutOtherPageAreasInfo {
38
38
  }
39
39
  }
40
40
  export class LayoutPage extends Rectangle {
41
+ get grids() {
42
+ const result = new Map();
43
+ for (let pageArea of this.mainSubDocumentPageAreas)
44
+ pageArea.grids.forEach((grid, table) => result.set(table, grid));
45
+ for (let pageArea of Object.values(this.otherPageAreas))
46
+ pageArea.grids.forEach((grid, table) => result.set(table, grid));
47
+ return result;
48
+ }
41
49
  constructor() {
42
50
  super(0, 0, 0, 0);
43
51
  this.mainSubDocumentPageAreas = [];
@@ -11,6 +11,7 @@ export declare class AnchorObjectHorizontalPositionCalculator extends AnchorObje
11
11
  private alignment;
12
12
  private getAlignPosition;
13
13
  private absolute;
14
+ private getAnchorXPosition;
14
15
  private bookLayout;
15
16
  private relative;
16
17
  }
@@ -41,7 +41,7 @@ export class AnchorObjectHorizontalPositionCalculator extends AnchorObjectPositi
41
41
  alignment(type, alignment) {
42
42
  switch (type) {
43
43
  case AnchorObjectHorizontalPositionType.Character:
44
- return this.getAlignPosition(alignment, 0);
44
+ return this.getAnchorXPosition() + this.getAlignPosition(alignment, 0);
45
45
  case AnchorObjectHorizontalPositionType.Column:
46
46
  return this.isRelativeCell ?
47
47
  this.relativeColumnPos() + this.lp.row.tableCellInfo.x +
@@ -90,17 +90,8 @@ export class AnchorObjectHorizontalPositionCalculator extends AnchorObjectPositi
90
90
  return this.isRelativeCell ? this.relativeColumnPos() + this.lp.row.tableCellInfo.x : 0;
91
91
  case AnchorObjectHorizontalPositionType.Column:
92
92
  return this.isRelativeCell ? this.relativeColumnPos() + this.lp.row.tableCellInfo.x + this.leftCellMargin : this.relativeColumnPos();
93
- case AnchorObjectHorizontalPositionType.Character: {
94
- const rowAbsPos = this.lp.getLogPosition(DocumentLayoutDetailsLevel.Row);
95
- const ancBoxAbsPos = this.obj.rowOffset;
96
- const boxIndex = SearchUtils.normedInterpolationIndexOf(this.lp.row.boxes, (box) => rowAbsPos + box.rowOffset, ancBoxAbsPos);
97
- const box = this.lp.row.boxes[boxIndex];
98
- if (!box)
99
- return this.lp.getLayoutX(null, DocumentLayoutDetailsLevel.Row);
100
- const symbolCount = Math.max(0, ancBoxAbsPos - rowAbsPos - box.rowOffset);
101
- return this.lp.getLayoutX(null, DocumentLayoutDetailsLevel.Row) + box.x +
102
- box.getCharOffsetXInPixels(this.manager.measurer, symbolCount);
103
- }
93
+ case AnchorObjectHorizontalPositionType.Character:
94
+ return this.getAnchorXPosition();
104
95
  case AnchorObjectHorizontalPositionType.Margin:
105
96
  return this.isRelativeCell ? this.relativeColumnPos() + this.lp.row.tableCellInfo.x + this.leftCellMargin :
106
97
  this.manager.boundsCalculator.marginLeft;
@@ -117,6 +108,19 @@ export class AnchorObjectHorizontalPositionCalculator extends AnchorObjectPositi
117
108
  throw new Error(Errors.InternalException);
118
109
  }
119
110
  }
111
+ getAnchorXPosition() {
112
+ const rowAbsPos = this.lp.getLogPosition(DocumentLayoutDetailsLevel.Row);
113
+ const ancBoxAbsPos = this.obj.rowOffset;
114
+ let boxIndex = SearchUtils.normedInterpolationIndexOf(this.lp.row.boxes, (box) => rowAbsPos + box.rowOffset, ancBoxAbsPos);
115
+ if (boxIndex < 0)
116
+ boxIndex = 0;
117
+ const box = this.lp.row.boxes[boxIndex];
118
+ if (!box)
119
+ return this.lp.getLayoutX(null, DocumentLayoutDetailsLevel.Row);
120
+ const symbolCount = Math.max(0, ancBoxAbsPos - rowAbsPos - box.rowOffset);
121
+ return this.lp.getLayoutX(null, DocumentLayoutDetailsLevel.Row) + box.x +
122
+ box.getCharOffsetXInPixels(this.manager.measurer, symbolCount);
123
+ }
120
124
  bookLayout() {
121
125
  return this.alignment(this.anchorInfo.horizontalPositionType, AnchorObjectHorizontalPositionCalculator.mapBookLayoutALignmentType[this.anchorInfo.horizontalPositionAlignment]);
122
126
  }
@@ -21,8 +21,6 @@ export class RowBaseFormatterState {
21
21
  this.rowFormatter.finishRow();
22
22
  }
23
23
  addAnchorObject() {
24
- if (!this.rowFormatter.wordHolder.pushBoxes())
25
- return;
26
24
  this.rowFormatter.addAnchorObject();
27
25
  }
28
26
  addTextBox() {
@@ -384,6 +384,7 @@ export class RichEditCore {
384
384
  pictureRenderer: this.viewManager.renderer,
385
385
  uiUnitConverter: this.uiUnitConverter,
386
386
  lastMaxNumPages: this.layout.lastMaxNumPages,
387
+ grids: this.layout.grids,
387
388
  pageIndex: this.selection.pageIndex,
388
389
  sessionGuid: this.sessionGuid,
389
390
  clientGuid: this.clientGuid,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devexpress-richedit",
3
- "version": "24.2.7-build-25107-0104",
3
+ "version": "24.2.7",
4
4
  "homepage": "https://www.devexpress.com/",
5
5
  "bugs": "https://www.devexpress.com/support/",
6
6
  "author": "Developer Express Inc.",
@@ -14,8 +14,8 @@
14
14
  "build-nspell": "webpack --mode production --config=bin/nspell.webpack.config.js"
15
15
  },
16
16
  "peerDependencies": {
17
- "devextreme": "24.2.7-build-25105-1935",
18
- "devextreme-dist": "24.2.7-build-25105-1935"
17
+ "devextreme": "24.2.7",
18
+ "devextreme-dist": "24.2.7"
19
19
  },
20
20
  "dependencies": {
21
21
  "jszip": "~3.10.1",