@datagrok/helm 2.2.0 → 2.3.0

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.
Files changed (48) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/package-test.js +1 -1
  3. package/dist/package-test.js.map +1 -1
  4. package/dist/package.js +1 -1
  5. package/dist/package.js.map +1 -1
  6. package/package.json +15 -16
  7. package/src/cell-renderer.ts +13 -36
  8. package/src/constants.ts +0 -11
  9. package/src/helm-helper.ts +67 -17
  10. package/src/helm-monomer-placer.ts +8 -26
  11. package/src/helm-web-editor.ts +33 -3
  12. package/src/package-test.ts +12 -4
  13. package/src/package-utils.ts +160 -0
  14. package/src/package.ts +123 -197
  15. package/src/tests/findMonomers-tests.ts +2 -0
  16. package/src/tests/get-all-parts-tests.ts +5 -0
  17. package/src/tests/{get-molfiles.ts → get-molfiles-tests.ts} +3 -1
  18. package/src/tests/get-monomer-tests.ts +279 -0
  19. package/src/tests/helm-service-tests.ts +4 -0
  20. package/src/tests/helm-tests.ts +8 -1
  21. package/src/tests/helm-web-editor-tests.ts +55 -0
  22. package/src/tests/parse-helm-tests.ts +98 -0
  23. package/src/tests/properties-widget-tests.ts +33 -4
  24. package/src/tests/renderers-tests.ts +3 -1
  25. package/src/tests/utils.ts +6 -0
  26. package/src/types/index.ts +5 -0
  27. package/src/utils/get-hovered.ts +9 -21
  28. package/src/utils/get-monomer-dummy.ts +149 -0
  29. package/src/utils/get-monomer-of-library.ts +90 -0
  30. package/src/utils/get-monomer.ts +113 -0
  31. package/src/utils/helm-grid-cell-renderer.ts +12 -7
  32. package/src/utils/helm-service.ts +19 -45
  33. package/src/utils/index.ts +11 -17
  34. package/src/widgets/properties-widget.ts +29 -9
  35. package/tsconfig.json +1 -1
  36. package/vendor/helm-web-editor.development.js +39640 -0
  37. package/vendor/helm-web-editor.production.js +2 -0
  38. package/vendor/helm-web-editor.production.js.map +1 -0
  39. package/webpack.config.js +14 -11
  40. package/helm/JSDraw/Pistoia.HELM-uncompressed.js +0 -9694
  41. package/helm/JSDraw/Pistoia.HELM.js +0 -27
  42. package/helm/JSDraw/ReadMe.txt +0 -8
  43. package/helm/JSDraw/Scilligence.JSDraw2.Lite-uncompressed.js +0 -31126
  44. package/helm/JSDraw/Scilligence.JSDraw2.Lite.js +0 -12
  45. package/helm/JSDraw/Scilligence.JSDraw2.Resources.js +0 -762
  46. package/helm/JSDraw/dojo.js +0 -250
  47. package/helm/JSDraw/test.html +0 -24
  48. package/src/utils/dummy-monomer.ts +0 -69
package/src/package.ts CHANGED
@@ -3,161 +3,138 @@ import * as grok from 'datagrok-api/grok';
3
3
  import * as ui from 'datagrok-api/ui';
4
4
  import * as DG from 'datagrok-api/dg';
5
5
 
6
- // import '@datagrok-libraries/bio/src/types/dojo';
7
- // import * as dojo from 'DOJO';
8
- import '@datagrok-libraries/bio/src/types/helm';
9
- import * as scil from 'scil';
10
- import * as org from 'org';
11
- import '@datagrok-libraries/bio/src/types/jsdraw2';
12
- import * as JSDraw2 from 'JSDraw2';
13
-
14
6
  import $ from 'cash-dom';
15
7
 
8
+ import {testEvent} from '@datagrok-libraries/utils/src/test';
16
9
  import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
10
+ import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
17
11
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
18
- import {GapOriginals, SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
19
- import {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';
12
+ import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
13
+ import {IMonomerLib} from '@datagrok-libraries/bio/src/types';
14
+ import {App, HweWindow} from '@datagrok-libraries/bio/src/helm/types';
20
15
  import {IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
21
16
  import {HelmServiceBase} from '@datagrok-libraries/bio/src/viewers/helm-service';
17
+ import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
22
18
 
23
- import {findMonomers, parseHelm} from './utils';
24
19
  import {HelmCellRenderer} from './cell-renderer';
25
20
  import {HelmHelper} from './helm-helper';
26
21
  import {getPropertiesWidget} from './widgets/properties-widget';
27
22
  import {HelmGridCellRenderer, HelmGridCellRendererBack} from './utils/helm-grid-cell-renderer';
28
- import {_getHelmService} from './package-utils';
23
+ import {_getHelmService, HelmPackage, initHelmLoadAndPatchDojo} from './package-utils';
24
+ import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';
25
+ import {getRS} from './utils/get-monomer-dummy';
29
26
 
30
- import {WebEditorMonomer, RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';
27
+ // Do not import anything than types from @datagrok/helm-web-editor/src/types
28
+ import {buildWebEditorApp} from './helm-web-editor';
29
+ import {JSDraw2HelmModule, OrgHelmModule, ScilModule} from './types';
30
+
31
+ export const _package = new HelmPackage();
31
32
 
32
33
  let monomerLib: IMonomerLib | null = null;
33
34
 
34
- export const _package = new DG.Package();
35
-
36
- function initHelmPatchDojo(): void {
37
- // patch window.dojox.gfx.svg.Text.prototype.getTextWidth hangs
38
- /** get the text width in pixels */
39
- // @ts-ignore
40
- window.dojox.gfx.svg.Text.prototype.getTextWidth = function() {
41
- const rawNode = this.rawNode;
42
- const oldParent = rawNode.parentNode;
43
- const _measurementNode = rawNode.cloneNode(true);
44
- _measurementNode.style.visibility = 'hidden';
45
-
46
- // solution to the "orphan issue" in FF
47
- let _width = 0;
48
- const _text = _measurementNode.firstChild.nodeValue;
49
- oldParent.appendChild(_measurementNode);
50
-
51
- // solution to the "orphan issue" in Opera
52
- // (nodeValue == "" hangs firefox)
53
- if (_text != '') {
54
- let watchdogCounter = 100;
55
- while (!_width && --watchdogCounter > 0) { // <-- hangs
56
- //Yang: work around svgweb bug 417 -- http://code.google.com/p/svgweb/issues/detail?id=417
57
- if (_measurementNode.getBBox)
58
- _width = parseInt(_measurementNode.getBBox().width);
59
- else
60
- _width = 68;
61
- }
62
- }
63
- oldParent.removeChild(_measurementNode);
64
- return _width;
65
- };
66
- }
35
+ /*
36
+ Loading modules:
37
+ Through Helm/package.json/sources section
38
+ dojo from ajax.googleapis.com
39
+ HELMWebEditor
40
+ JSDraw.Lite is embedded into HELMWebEditor bundle (dist/package.js)
41
+ */
42
+
43
+ declare const window: Window & HweWindow;
44
+ declare const scil: ScilModule;
45
+ declare const JSDraw2: JSDraw2HelmModule;
46
+ declare const org: OrgHelmModule;
67
47
 
68
48
  //tags: init
69
49
  export async function initHelm(): Promise<void> {
70
- const logPrefix: string = 'Helm: initHelm()';
50
+ const logPrefix: string = 'Helm: _package.initHelm()';
71
51
  _package.logger.debug(`${logPrefix}, start`);
72
- org.helm.webeditor.kCaseSensitive = true; // GROK-13880
73
-
74
- return Promise.all([
75
- new Promise((resolve, reject) => {
76
- // @ts-ignore
77
- dojo.ready(function() { resolve(null); });
78
- }).then(() => {
79
- initHelmPatchDojo();
80
- }),
81
- grok.functions.call('Bio:getBioLib'),
82
- ])
83
- .then(([_, lib]: [unknown, IMonomerLib]) => {
84
- _package.logger.debug(`${logPrefix}, then(), lib loaded`);
85
- monomerLib = lib;
86
- rewriteLibraries(); // initHelm()
87
- monomerLib.onChanged.subscribe((_) => {
88
- try {
89
- const logPrefixInt = `${logPrefix} monomerLib.onChanged()`;
90
- _package.logger.debug(`${logPrefixInt}, start, org,helm.webeditor.Monomers updating`);
91
- rewriteLibraries(); // initHelm()
92
-
93
- const libSummary: string = monomerLib!.getSummary()
94
- .replaceAll('\n', '<br />\n')
95
- .replaceAll(',', ' ');
96
- const libMsg: string = `Monomer lib updated:<br /> ${libSummary}'`;
97
- grok.shell.info(libMsg);
98
-
99
- _package.logger.debug(`${logPrefixInt}, end, org.helm.webeditor.Monomers completed`);
100
- } catch (err: any) {
101
- const errMsg = errorToConsole(err);
102
- console.error('Helm: initHelm monomerLib.onChanged() error:\n' + errMsg);
103
- // throw err; // Prevent disabling event handler
104
- }
105
- });
106
- })
107
- .catch((err: any) => {
108
- const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \'undefined\'';
109
- grok.shell.error(`Package \'Helm\' init initHelm() error: ${errMsg}`);
110
- const errRes = new Error(errMsg);
111
- errRes.stack = err.stack;
112
- throw errRes;
113
- });
114
- }
115
52
 
116
- export function getMonomerLib(): IMonomerLib {
117
- return monomerLib!;
118
- }
119
-
120
- /** Fills org.helm.webeditor.Monomers dictionary for WebEditor */
121
- function rewriteLibraries() {
122
- org.helm.webeditor.Monomers.clear();
123
- monomerLib!.getPolymerTypes().forEach((polymerType) => {
124
- const monomerSymbols = monomerLib!.getMonomerSymbolsByType(polymerType);
125
- monomerSymbols.forEach((monomerSymbol) => {
126
- let isBroken = false;
127
- const monomer: Monomer = monomerLib!.getMonomer(polymerType, monomerSymbol)!;
128
- const webEditorMonomer: WebEditorMonomer = {
129
- id: monomerSymbol,
130
- m: monomer.molfile,
131
- n: monomer.name,
132
- na: monomer.naturalAnalog,
133
- rs: monomer.rgroups.length,
134
- type: monomer.polymerType,
135
- mt: monomer.monomerType,
136
- at: {}
137
- };
138
-
139
- if (monomer.rgroups.length > 0) {
140
- webEditorMonomer.rs = monomer.rgroups.length;
141
- const at: { [prop: string]: any } = {};
142
- monomer.rgroups.forEach((it) => {
143
- at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];
144
- });
145
- webEditorMonomer.at = at;
146
- } else if (monomer[SMILES] != null) {
147
- webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;
148
- webEditorMonomer.at = getRS(monomer[SMILES].toString());
149
- } else
150
- isBroken = true;
151
-
152
- if (!isBroken) {
153
- org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);
53
+ try {
54
+ const [_, lib]: [void, IMonomerLib] = await Promise.all([
55
+ Promise.all([
56
+ new Promise<void>((resolve, reject) => {
57
+ // @ts-ignore
58
+ // try { dojo.ready(function() { resolve(null); }); } catch (err: any) { reject(err); }
59
+ resolve();
60
+ }),
61
+ (async () => {
62
+ _package.logger.debug(`${logPrefix}, dependence loading …`);
63
+ const t1: number = performance.now();
64
+
65
+ _package.logger.debug(`${logPrefix}, dojox loading and patching …`);
66
+ await initHelmLoadAndPatchDojo();
67
+ _package.logger.debug(`${logPrefix}, dojox loaded and patched`);
68
+
69
+ // through webpack.config.ts/alias
70
+ require('vendor/helm-web-editor');
71
+
72
+ _package.logger.debug(`${logPrefix}, HelmWebEditor awaiting …`);
73
+ await window.helmWebEditor$.initPromise;
74
+ _package.logger.debug(`${logPrefix}, HelmWebEditor loaded`);
75
+ org.helm.webeditor.kCaseSensitive = true; // GROK-13880
76
+
77
+ _package.logger.debug(`${logPrefix}, scil.Utils.alert patch`);
78
+ _package.initHelmPatchScilAlert(); // patch immediately
79
+
80
+ const t2: number = performance.now();
81
+ _package.logger.debug(`${logPrefix}, dependence loaded, ET: ${(t2 - t1)} ms`);
82
+ })()
83
+ ]).then(() => {
84
+
85
+ // settings
86
+ }),
87
+ (async () => {
88
+ const libHelper = await getMonomerLibHelper();
89
+ return libHelper.getBioLib();
90
+ })()
91
+ ]);
92
+
93
+ _package.logger.debug(`${logPrefix}, then(), lib loaded`);
94
+ monomerLib = lib;
95
+ // rewriteLibraries(); // initHelm()
96
+ await _package.initHelmPatchPistoia(monomerLib);
97
+
98
+ monomerLib.onChanged.subscribe((_) => {
99
+ const logPrefixInt = `${logPrefix} monomerLib.onChanged()`;
100
+ try {
101
+ const libSummary = monomerLib!.getSummaryObj();
102
+ const isLibEmpty = Object.keys(libSummary).length == 0;
103
+ const libSummaryLog = isLibEmpty ? 'empty' : Object.entries(libSummary)
104
+ .map(([pt, count]) => `${pt}: ${count}`)
105
+ .join(', ');
106
+ _package.logger.debug(`${logPrefixInt}, start, lib: { ${libSummaryLog} }`);
107
+
108
+ const libSummaryHtml = isLibEmpty ? 'empty' : Object.entries(libSummary)
109
+ .map(([pt, count]) => `${pt} ${count}`)
110
+ .join('<br />');
111
+ const libMsg: string = `Monomer lib updated:<br /> ${libSummaryHtml}`;
112
+ grok.shell.info(libMsg);
113
+
114
+ // _package.logger.debug(`${logPrefixInt}, org,helm.webeditor.Monomers updating ...`);
115
+ // rewriteLibraries(); // initHelm() monomerLib.onChanged()
116
+ // _package.logger.debug(`${logPrefixInt}, end, org.helm.webeditor.Monomers completed`);
117
+ } catch (err: any) {
118
+ const errMsg = errorToConsole(err);
119
+ console.error(`${logPrefixInt} error:\n` + errMsg);
120
+ // throw err; // Prevent disabling event handler
154
121
  }
155
122
  });
156
- });
123
+ } catch (err: any) {
124
+ const [errMsg, errStack] = errInfo(err);
125
+ // const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \'undefined\'';
126
+ grok.shell.error(`Package \'Helm\' init error:\n${errMsg}`);
127
+ const errRes = new Error(`${logPrefix} error:\n ${errMsg}\n${errStack}`);
128
+ errRes.stack = errStack;
129
+ throw errRes;
130
+ } finally {
131
+ _package.logger.debug(`${logPrefix}, finally`);
132
+ }
133
+ _package.logger.debug(`${logPrefix}, end`);
134
+ }
157
135
 
158
- // Obsolete
159
- const grid: DG.Grid = grok.shell.tv?.grid;
160
- if (grid) grid.invalidate();
136
+ export function getMonomerLib(): IMonomerLib | null {
137
+ return monomerLib;
161
138
  }
162
139
 
163
140
  //name: getHelmService
@@ -172,24 +149,14 @@ export function getHelmService(): HelmServiceBase {
172
149
  //meta.columnTags: quality=Macromolecule, units=helm
173
150
  //output: grid_cell_renderer result
174
151
  export function helmCellRenderer(): HelmCellRenderer {
152
+ const logPrefix = `Helm: _package.getHelmCellRenderer()`;
153
+ _package.logger.debug(`${logPrefix}, start`);
175
154
  // return new HelmCellRenderer(); // old
176
155
  return new HelmGridCellRenderer(); // new
177
156
  }
178
157
 
179
158
  function checkMonomersAndOpenWebEditor(cell: DG.Cell, value?: string, units?: string) {
180
- const cellValue: string = !!cell && units === undefined ? cell.value : value;
181
- const monomerList: string[] = parseHelm(cellValue);
182
- const missedMonomerSet = findMonomers(monomerList);
183
- if (missedMonomerSet.size === 0)
184
- webEditor(cell, value, units);
185
- else if (missedMonomerSet.size === 1 && missedMonomerSet.has(GapOriginals[NOTATION.HELM]))
186
- grok.shell.warning(`WebEditor doesn't support Helm with gaps '${GapOriginals[NOTATION.HELM]}'.`);
187
- else {
188
- grok.shell.warning(
189
- `Monomers ${Array.from(missedMonomerSet).map((m) => `'${m}'`).join(', ')} are not found. <br/>` +
190
- `Please specify the monomer library to use. <br/>` +
191
- `<a href="https://datagrok.ai/help/datagrok/solutions/domains/bio/#manage-monomer-libraries" target="_blank">Learn more</a>`);
192
- }
159
+ openWebEditor(cell, value, units);
193
160
  }
194
161
 
195
162
  //tags: cellEditor
@@ -224,41 +191,23 @@ export function propertiesWidget(sequence: DG.SemanticValue): DG.Widget {
224
191
  return getPropertiesWidget(sequence);
225
192
  }
226
193
 
227
- function webEditor(cell: DG.Cell, value?: string, units?: string) {
194
+ function openWebEditor(cell: DG.Cell, value?: string, units?: string) {
228
195
  const view = ui.div();
229
196
  // const df = grok.shell.tv.grid.dataFrame;
230
197
  // const col = df.columns.bySemType('Macromolecule')!;
231
198
  const col = cell.column as DG.Column<string>;
232
199
  const sh = SeqHandler.forColumn(col);
233
200
  const rowIdx = cell.rowIndex;
234
- org.helm.webeditor.MolViewer.molscale = 0.8;
235
- const app = new org.helm.webeditor.App(view, {
236
- showabout: false,
237
- mexfontsize: '90%',
238
- mexrnapinontab: true,
239
- topmargin: 20,
240
- mexmonomerstab: true,
241
- sequenceviewonly: false,
242
- mexfavoritefirst: true,
243
- mexfilter: true
244
- });
245
- const sizes = app.calculateSizes();
246
- app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);
247
- let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};
248
- scil.apply(app.sequence.style, s);
249
- scil.apply(app.notation.style, s);
250
- s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};
251
- scil.apply(app.properties.parent.style, s);
252
- app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);
253
- app.mex.resize(sizes.topheight - 80);
254
- setTimeout(() => {
201
+ let app: App;
202
+ setTimeout(async () => {
203
+ app = await buildWebEditorApp(view);
255
204
  if (!!cell && units === undefined)
256
205
  app.canvas.helm.setSequence(cell.value, 'HELM');
257
206
  else
258
207
  app.canvas.helm.setSequence(value!, 'HELM');
259
- }, 200);
260
- ui.dialog({showHeader: false, showFooter: true})
261
- .add(view)
208
+ }, 20);
209
+ const dlg = ui.dialog({showHeader: false, showFooter: true});
210
+ dlg.add(view)
262
211
  .onOK(() => {
263
212
  const helmValue: string = app.canvas.getHelm(true).replace(/<\/span>/g, '')
264
213
  .replace(/<span style='background:#bbf;'>/g, '');
@@ -271,30 +220,10 @@ function webEditor(cell: DG.Cell, value?: string, units?: string) {
271
220
  }
272
221
  }
273
222
  }).show({modal: true, fullScreen: true});
274
- }
275
223
 
276
- function getRS(smiles: string) {
277
- const newS = smiles.match(/(?<=\[)[^\][]*(?=])/gm);
278
- const res: { [name: string]: string } = {};
279
- let el = '';
280
- let digit;
281
- if (!!newS) {
282
- for (let i = 0; i < newS.length; i++) {
283
- if (newS[i] != null) {
284
- if (/\d/.test(newS[i])) {
285
- digit = newS[i][newS[i].length - 1];
286
- newS[i] = newS[i].replace(/[0-9]/g, '');
287
- for (let j = 0; j < newS[i].length; j++) {
288
- if (newS[i][j] != ':')
289
- el += newS[i][j];
290
- }
291
- res['R' + digit] = el;
292
- el = '';
293
- }
294
- }
295
- }
296
- }
297
- return res;
224
+ // Quick fix for full screen dialog
225
+ const dlgCntDiv = $(dlg.root).find('div').get()[0] as HTMLDivElement;
226
+ dlgCntDiv.className = dlgCntDiv.className.replace('dlg- ui-form', 'dlg-ui-form');
298
227
  }
299
228
 
300
229
  //name: getMolfiles
@@ -324,12 +253,9 @@ export function getMolfiles(col: DG.Column): DG.Column {
324
253
  //name: getHelmHelper
325
254
  //output: object result
326
255
  export async function getHelmHelper(): Promise<IHelmHelper> {
327
- return HelmHelper.getInstance();
256
+ return _package.hh;
328
257
  }
329
258
 
330
- import {testEvent} from '@datagrok-libraries/utils/src/test';
331
- import {CellRendererBackAsyncBase} from '@datagrok-libraries/bio/src/utils/cell-renderer-async-base';
332
-
333
259
  //name: measureCellRenderer
334
260
  export async function measureCellRenderer(): Promise<void> {
335
261
  const grid = grok.shell.tv.grid;
@@ -10,6 +10,7 @@ import {
10
10
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
11
11
 
12
12
  import {findMonomers, parseHelm} from '../utils';
13
+ import {initHelmMainPackage} from './utils';
13
14
 
14
15
 
15
16
  /** Tests with default monomer library */
@@ -19,6 +20,7 @@ category('findMonomers', () => {
19
20
  let userLibSettings: UserLibSettings;
20
21
 
21
22
  before(async () => {
23
+ await initHelmMainPackage();
22
24
  monomerLibHelper = await getMonomerLibHelper();
23
25
  userLibSettings = await getUserLibSettings();
24
26
 
@@ -5,6 +5,7 @@ import * as DG from 'datagrok-api/dg';
5
5
  import {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/utils/src/test';
6
6
 
7
7
  import {getAllParts} from '../helm-monomer-placer';
8
+ import {initHelmMainPackage} from './utils';
8
9
 
9
10
  category('getAllParts', () => {
10
11
  /** All parts of Helm string are required for fallback rendering. */
@@ -21,6 +22,10 @@ category('getAllParts', () => {
21
22
  }
22
23
  };
23
24
 
25
+ before(async () => {
26
+ await initHelmMainPackage();
27
+ });
28
+
24
29
  for (const [testName, testData] of Object.entries(tests)) {
25
30
  test(`${testName}`, async () => {
26
31
  await _testAllParts(testData.seq, testData.tgt);
@@ -3,6 +3,7 @@ import * as ui from 'datagrok-api/ui';
3
3
  import * as DG from 'datagrok-api/dg';
4
4
 
5
5
  import {after, before, category, delay, expect, test, expectArray, testEvent} from '@datagrok-libraries/utils/src/test';
6
+ import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
6
7
  import {
7
8
  getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
8
9
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
@@ -11,7 +12,7 @@ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/sr
11
12
  import {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';
12
13
  import {MolfileHandlerBase} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base';
13
14
 
14
- import {awaitGrid} from './utils';
15
+ import {awaitGrid, initHelmMainPackage} from './utils';
15
16
 
16
17
  import {_package} from '../package-test';
17
18
 
@@ -20,6 +21,7 @@ category('getMolfiles', () => {
20
21
  let userLibSettings: UserLibSettings;
21
22
 
22
23
  before(async () => {
24
+ await initHelmMainPackage();
23
25
  monomerLibHelper = await getMonomerLibHelper();
24
26
  userLibSettings = await getUserLibSettings();
25
27
  await setUserLibSettingsForTests();