@abi-software/simulationvuer 2.0.7 → 2.0.9

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.
@@ -1,9 +1,9 @@
1
1
  <template>
2
2
  <div class="simulation-vuer" v-loading="showUserMessage" :element-loading-text="userMessage">
3
- <p v-if="!hasValidSimulationUiInfo && !showUserMessage" class="default error"><span class="error">Error:</span> an unknown or invalid model was provided.</p>
3
+ <p v-if="!hasValidSimulationUiInfo && !showUserMessage" class="default error"><span class="error">Error:</span> {{ errorMessage }}.</p>
4
4
  <div class="main" v-if="hasValidSimulationUiInfo">
5
5
  <div class="main-left">
6
- <p class="default name" v-if="!libopencorSet">{{name}}</p>
6
+ <p class="default name" v-if="!libopencorSet">{{ name }}</p>
7
7
  <el-divider v-if="!libopencorSet"></el-divider>
8
8
  <p class="default input-parameters">Input parameters</p>
9
9
  <div class="input scrollbar">
@@ -33,10 +33,10 @@
33
33
  <p class="default note" v-if="uuid">Additional parameters are available on oSPARC</p>
34
34
  </div>
35
35
  <div class="main-right" ref="output" v-show="isSimulationValid">
36
- <PlotVuer v-for="(outputPlot, index) in simulationUiInfo.output.plots"
36
+ <PlotVuer v-for="(_outputPlot, index) in simulationUiInfo.output.plots"
37
37
  :key="`output-${index}`"
38
38
  :metadata="plotMetadata(index)"
39
- :data-source="{data: simulationResults[index]}"
39
+ :data-source="{ data: simulationResults[index] }"
40
40
  :plotLayout="layout[index]"
41
41
  :plotType="'plotly-only'"
42
42
  :selectorUi="false"
@@ -82,7 +82,7 @@ export default {
82
82
  },
83
83
  props: {
84
84
  /**
85
- * The the URL to the API location.
85
+ * The URL to the API location.
86
86
  */
87
87
  apiLocation: {
88
88
  required: true,
@@ -93,10 +93,19 @@ export default {
93
93
  * to a PMR file, if it is a string.
94
94
  */
95
95
  id: {
96
- required: true,
96
+ required: false,
97
+ default: 0,
98
+ },
99
+ /**
100
+ * A COMBINE archive that was passed directly.
101
+ */
102
+ combineArchive: {
103
+ required: false,
104
+ type: Uint8Array,
105
+ default: undefined,
97
106
  },
98
107
  },
99
- data: function() {
108
+ data: function () {
100
109
  // Retrieve some information about the dataset.
101
110
 
102
111
  if (this.id > 0) {
@@ -109,7 +118,7 @@ export default {
109
118
  const datasetInfo = JSON.parse(xmlhttp.responseText);
110
119
 
111
120
  this.name = datasetInfo.name;
112
- this.uuid = (datasetInfo.study !== undefined)?datasetInfo.study.uuid:undefined;
121
+ this.uuid = (datasetInfo.study !== undefined) ? datasetInfo.study.uuid : undefined;
113
122
  }
114
123
  }
115
124
  };
@@ -159,29 +168,6 @@ export default {
159
168
  },
160
169
  };
161
170
  },
162
- /**
163
- * @public
164
- * Download the PMR file associated with the given `url`.
165
- * @arg `url`
166
- */
167
- downloadPmrFile(url) {
168
- return new Promise((resolve, reject) => {
169
- const xmlhttp = new XMLHttpRequest();
170
-
171
- xmlhttp.open("POST", this.apiLocation + "/pmr_file");
172
- xmlhttp.setRequestHeader("Content-type", "application/json");
173
- xmlhttp.onreadystatechange = () => {
174
- if (xmlhttp.readyState === 4) {
175
- if (xmlhttp.status === 200) {
176
- resolve(Uint8Array.from(atob(xmlhttp.response), (c) => c.charCodeAt(0)));
177
- }
178
-
179
- reject();
180
- }
181
- };
182
- xmlhttp.send(JSON.stringify({path: url.replace(PMR_URL, "")}));
183
- });
184
- },
185
171
  /**
186
172
  * @public
187
173
  * Manage the file associated with the given `url` and `fileContents`.
@@ -235,10 +221,16 @@ export default {
235
221
 
236
222
  const res = {};
237
223
  const instanceTask = this.instance.tasks().get(0);
224
+ let foundAllOutputs = true;
225
+ let foundOutput;
238
226
 
239
227
  for (const output of this.outputData()) {
228
+ foundOutput = false;
229
+
240
230
  if (output === instanceTask.voiName()) {
241
231
  res[output] = instanceTask.voiAsArray();
232
+
233
+ foundOutput = true;
242
234
  }
243
235
 
244
236
  if (res[output] === undefined) {
@@ -246,23 +238,38 @@ export default {
246
238
  if (output === instanceTask.stateName(i)) {
247
239
  res[output] = instanceTask.stateAsArray(i);
248
240
 
241
+ foundOutput = true;
242
+
249
243
  break;
250
244
  }
251
245
  }
252
246
  }
253
247
 
254
248
  if (res[output] === undefined) {
255
- for (let i = 0; instanceTask.variableCount(); ++i) {
249
+ for (let i = 0; i < instanceTask.variableCount(); ++i) {
256
250
  if (output === instanceTask.variableName(i)) {
257
251
  res[output] = instanceTask.variableAsArray(i);
258
252
 
253
+ foundOutput = true;
254
+
259
255
  break;
260
256
  }
261
257
  }
262
258
  }
259
+
260
+ if (!foundOutput) {
261
+ console.warn("SIMULATION: output '" + output + "' could not be found.");
262
+
263
+ foundAllOutputs = false;
264
+ }
263
265
  }
264
266
 
265
- this.processSimulationResults(res);
267
+ if (foundAllOutputs) {
268
+ this.processSimulationResults(res);
269
+ } else {
270
+ this.hasValidSimulationUiInfo = false;
271
+ this.errorMessage = "some outputs could not be found";
272
+ }
266
273
 
267
274
  this.showUserMessage = false;
268
275
  },
@@ -281,6 +288,8 @@ export default {
281
288
  this.hasValidSimulationUiInfo = validJson(this.simulationUiInfo, this.libopencor === undefined);
282
289
 
283
290
  if (!this.hasValidSimulationUiInfo) {
291
+ this.errorMessage = "the simulation.json file is malformed";
292
+
284
293
  return;
285
294
  }
286
295
 
@@ -295,7 +304,8 @@ export default {
295
304
  });
296
305
 
297
306
  if (this.solver === undefined) {
298
- console.warn("SIMULATION: no solver name and/or solver version specified.");
307
+ this.hasValidSimulationUiInfo = false;
308
+ this.errorMessage = "no solver name and/or solver version specified";
299
309
 
300
310
  return;
301
311
  }
@@ -303,17 +313,6 @@ export default {
303
313
  this.opencorBasedSimulation = this.solver.name === OPENCOR_SOLVER_NAME;
304
314
  }
305
315
 
306
- // Run the model if we are dealing with a PMR-based COMBINE archive.
307
-
308
- if (this.libopencor !== undefined) {
309
- this.userMessage = "Running the model...";
310
- this.showUserMessage = true;
311
-
312
- this.$nextTick(() => {
313
- this.runSimulation();
314
- });
315
- }
316
-
317
316
  // Initialise our UI.
318
317
 
319
318
  this.simulationUiInfo.output.data.forEach((data) => {
@@ -370,6 +369,40 @@ export default {
370
369
  finaliseUi(this);
371
370
  });
372
371
  },
372
+ /**
373
+ * @public
374
+ * Extract the simulation UI JSON file from the given file contents and build the simulation UI.
375
+ * @arg `libopencor`
376
+ * @arg `fileContents`
377
+ */
378
+ extractAndBuildSimulationUi(libopencor, fileContents) {
379
+ this.libopencor = markRaw(libopencor);
380
+ this.libopencorSet = true;
381
+ this.fileManager = markRaw(this.libopencor.FileManager.instance());
382
+
383
+ const file = this.manageFile(PMR_URL + this.id, fileContents);
384
+
385
+ if (file.type().value !== libopencor.File.Type.COMBINE_ARCHIVE.value) {
386
+ this.showUserMessage = false;
387
+ } else {
388
+ const decoder = new TextDecoder();
389
+ const simulationJson = file.childFile("simulation.json");
390
+
391
+ if (simulationJson === null) {
392
+ this.errorMessage = "no simulation JSON file could be found";
393
+
394
+ this.showUserMessage = false;
395
+ } else {
396
+ const simulationUiInfo = JSON.parse(decoder.decode(simulationJson.contents()));
397
+
398
+ this.showUserMessage = false;
399
+
400
+ this.$nextTick(() => {
401
+ this.buildSimulationUi(simulationUiInfo);
402
+ });
403
+ }
404
+ }
405
+ },
373
406
  /**
374
407
  * @public
375
408
  * Run the simulation-based dataset directly on oSPARC. Not all simulation-based datasets can be run directly on
@@ -414,9 +447,9 @@ export default {
414
447
  * @public
415
448
  * Data needed to specify the model output.
416
449
  */
417
- outputData() {
450
+ outputData() {
418
451
  if (this.output === undefined) {
419
- if (this.simulationUiInfo.output.data !== undefined) {
452
+ if (this.simulationUiInfo.output.data !== undefined) {
420
453
  this.output = [];
421
454
 
422
455
  this.simulationUiInfo.output.data.forEach((output) => {
@@ -442,8 +475,8 @@ export default {
442
475
  json_config: {},
443
476
  };
444
477
 
445
- if ( (this.simulationUiInfo.simulation.opencor.endingPoint !== undefined)
446
- && (this.simulationUiInfo.simulation.opencor.pointInterval !== undefined)) {
478
+ if ((this.simulationUiInfo.simulation.opencor.endingPoint !== undefined)
479
+ && (this.simulationUiInfo.simulation.opencor.pointInterval !== undefined)) {
447
480
  request.opencor.json_config.simulation = {
448
481
  "Ending point": this.simulationUiInfo.simulation.opencor.endingPoint,
449
482
  "Point interval": this.simulationUiInfo.simulation.opencor.pointInterval,
@@ -475,7 +508,7 @@ export default {
475
508
  // Convert, if needed, the results to a JSON format that is compatible
476
509
  // with our OpenCOR results.
477
510
 
478
- if (typeof(results) === "string") {
511
+ if (typeof (results) === "string") {
479
512
  const SPACES = /[ \t]+/g;
480
513
  const lines = results.trim().split("\n");
481
514
  const iMax = lines[0].trim().split(SPACES).length;
@@ -564,7 +597,7 @@ export default {
564
597
 
565
598
  let that = this;
566
599
 
567
- setTimeout(function() {
600
+ setTimeout(function () {
568
601
  that.checkSimulation(data);
569
602
  }, 1000);
570
603
  }
@@ -609,7 +642,7 @@ export default {
609
642
  this.checkSimulation(response.data);
610
643
  } else {
611
644
  this.showUserMessage = false;
612
- this.errorMessage = response.description + "ASDASDASD";
645
+ this.errorMessage = response.description;
613
646
  }
614
647
  } else {
615
648
  this.showHttpIssue(xmlhttp);
@@ -620,7 +653,7 @@ export default {
620
653
  });
621
654
  },
622
655
  },
623
- created: function() {
656
+ created: function () {
624
657
  // Try to retrieve the UI information.
625
658
 
626
659
  if (this.id > 0) {
@@ -641,6 +674,8 @@ export default {
641
674
  this.$nextTick(() => {
642
675
  this.buildSimulationUi(JSON.parse(xmlhttp.responseText));
643
676
  });
677
+ } else {
678
+ this.errorMessage = "the simulation dataset could not be retrieved";
644
679
  }
645
680
  }
646
681
  };
@@ -650,8 +685,8 @@ export default {
650
685
  this.userMessage = "Retrieving COMBINE archive from PMR...";
651
686
  this.showUserMessage = true;
652
687
 
653
- // Retrieve the OMEX file, extract the simulation UI JSON file from it and
654
- // then build the simulation UI.
688
+ // Retrieve the COMBINE archive, extract the simulation UI JSON file from
689
+ // it and then build the simulation UI.
655
690
 
656
691
  this.$nextTick(() => {
657
692
  const xmlhttp = new XMLHttpRequest();
@@ -662,32 +697,33 @@ export default {
662
697
  if (xmlhttp.readyState === 4) {
663
698
  if (xmlhttp.status === 200) {
664
699
  libOpenCOR().then((libopencor) => {
665
- this.libopencor = markRaw(libopencor);
666
- this.libopencorSet = true;
667
- this.fileManager = markRaw(this.libopencor.FileManager.instance());
668
-
669
- const fileContents = Uint8Array.from(atob(xmlhttp.response), (c) => c.charCodeAt(0));
670
- const file = this.manageFile(PMR_URL + this.id, fileContents);
671
-
672
- const decoder = new TextDecoder();
673
- const simulationUiInfo = JSON.parse(decoder.decode(file.childFile("simulation.json").contents()));
674
-
675
- this.showUserMessage = false;
676
-
677
- this.$nextTick(() => {
678
- this.buildSimulationUi(simulationUiInfo);
679
- });
700
+ this.extractAndBuildSimulationUi(libopencor, Uint8Array.from(atob(xmlhttp.response), (c) => c.charCodeAt(0)));
680
701
  });
681
702
  } else {
703
+ this.errorMessage = "the COMBINE archive chould not be retrieved";
682
704
  this.showUserMessage = false;
683
705
  }
684
706
  }
685
707
  };
686
- xmlhttp.send(JSON.stringify({path: this.id}));
708
+ xmlhttp.send(JSON.stringify({ path: this.id }));
687
709
  });
710
+ } else if (this.combineArchive !== undefined) {
711
+ // Extract the simulation UI JSON file from the COMBINE archive and build
712
+ // the simulation UI.
713
+
714
+ this.userMessage = "Retrieving COMBINE archive...";
715
+ this.showUserMessage = true;
716
+
717
+ this.$nextTick(() => {
718
+ libOpenCOR().then((libopencor) => {
719
+ this.extractAndBuildSimulationUi(libopencor, this.combineArchive);
720
+ });
721
+ });
722
+ } else {
723
+ this.errorMessage = "an non-simulation dataset was provided";
688
724
  }
689
725
  },
690
- mounted: function() {
726
+ mounted: function () {
691
727
  // Finalise our UI.
692
728
  // Note: we try both here and in the created() function since we have no
693
729
  // idea how long it's going to take to retrieve the simulation UI
@@ -702,7 +738,6 @@ export default {
702
738
 
703
739
  <!-- Add "scoped" attribute to limit CSS to this component only -->
704
740
  <style scoped lang="scss">
705
-
706
741
  .simulation-vuer {
707
742
  --el-color-primary: #8300BF;
708
743
  --el-color-primary-light-7: #DAB3EC;
@@ -710,80 +745,101 @@ export default {
710
745
  --el-color-primary-light-9: #F3E6F9;
711
746
  }
712
747
 
713
- :deep( .el-button:hover) {
748
+ :deep(.el-button:hover) {
714
749
  box-shadow: -3px 2px 4px #00000040;
715
750
  }
716
- :deep( .el-divider) {
751
+
752
+ :deep(.el-divider) {
717
753
  margin: -8px 0 8px 0 !important;
718
754
  width: 210px;
719
755
  }
720
- :deep( .el-loading-spinner) {
756
+
757
+ :deep(.el-loading-spinner) {
721
758
  .path {
722
759
  stroke: #8300BF;
723
760
  }
724
- i, .el-loading-text {
761
+
762
+ i,
763
+ .el-loading-text {
725
764
  color: #8300BF;
726
765
  }
727
766
  }
767
+
728
768
  div.input {
729
769
  border: 1px solid #dcdfe6;
730
770
  padding: 4px;
731
771
  height: 300px;
732
772
  }
773
+
733
774
  div.main {
734
775
  display: grid;
735
776
  --mainLeftWidth: 243px;
736
777
  grid-template-columns: var(--mainLeftWidth) calc(100% - var(--mainLeftWidth));
737
778
  height: 100%;
738
779
  }
780
+
739
781
  div.main-left {
740
782
  border-right: 1px solid #dcdfe6;
741
783
  padding: 12px 20px 12px 12px;
742
784
  height: 100%;
743
785
  overflow: auto;
744
786
  }
787
+
745
788
  div.main-right.x1 {
746
789
  height: 100%;
747
790
  }
791
+
748
792
  div.main-right.x2 {
749
793
  height: 50%;
750
794
  }
795
+
751
796
  div.main-right.x3 {
752
797
  height: 33.333%;
753
798
  }
799
+
754
800
  div.main-right.x4 {
755
801
  height: 25%;
756
802
  }
803
+
757
804
  div.main-right.x5 {
758
805
  height: 20%;
759
806
  }
807
+
760
808
  div.main-right.x6 {
761
809
  height: 16.667%;
762
810
  }
811
+
763
812
  div.main-right.x7 {
764
813
  height: 14.286%;
765
814
  }
815
+
766
816
  div.main-right.x8 {
767
817
  height: 12.5%;
768
818
  }
819
+
769
820
  div.main-right.x9 {
770
821
  height: 11.111%;
771
822
  }
772
- :deep( div.main-right div.controls) {
823
+
824
+ :deep(div.main-right div.controls) {
773
825
  height: 0;
774
826
  }
827
+
775
828
  div.primary-button,
776
829
  div.secondary-button {
777
830
  display: flex;
778
831
  justify-content: flex-end;
779
832
  width: 210px;
780
833
  }
834
+
781
835
  div.primary-button {
782
836
  margin-top: 14px;
783
837
  }
838
+
784
839
  div.secondary-button {
785
840
  margin-top: 8px;
786
841
  }
842
+
787
843
  div.primary-button .el-button,
788
844
  div.secondary-button .el-button,
789
845
  div.primary-button .el-button:hover,
@@ -791,61 +847,75 @@ div.secondary-button .el-button:hover {
791
847
  width: 121px;
792
848
  border-color: #8300bf;
793
849
  }
850
+
794
851
  div.primary-button .el-button,
795
852
  div.primary-button .el-button:hover {
796
853
  background-color: #8300bf;
797
854
  }
855
+
798
856
  div.secondary-button .el-button,
799
857
  div.secondary-button .el-button:hover {
800
858
  background-color: #f9f2fc;
801
859
  color: #8300bf;
802
860
  }
861
+
803
862
  div.scrollbar {
804
863
  overflow-y: scroll;
805
864
  scrollbar-width: thin;
806
865
  }
866
+
807
867
  div.scrollbar::-webkit-scrollbar {
808
868
  width: 8px;
809
869
  right: -8px;
810
870
  background-color: #f5f5f5;
811
871
  }
872
+
812
873
  div.scrollbar::-webkit-scrollbar-thumb {
813
874
  border-radius: 4px;
814
875
  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.06);
815
876
  background-color: #979797;
816
877
  }
878
+
817
879
  div.scrollbar::-webkit-scrollbar-track {
818
880
  border-radius: 10px;
819
881
  background-color: #f5f5f5;
820
882
  }
883
+
821
884
  div.simulation-vuer {
822
885
  height: 100%;
823
886
  }
887
+
824
888
  p.default {
825
889
  font-family: Asap, sans-serif;
826
890
  letter-spacing: 0;
827
891
  margin: 16px 0;
828
892
  text-align: start;
829
893
  }
894
+
830
895
  p.error {
831
896
  margin-left: 16px;
832
897
  }
898
+
833
899
  p.input-parameters {
834
900
  margin-bottom: 8px;
835
901
  }
902
+
836
903
  p.name,
837
904
  p.input-parameters {
838
905
  margin-top: 0;
839
- font-weight: 500 /* Medium */;
906
+ font-weight: bold;
840
907
  }
908
+
841
909
  p.name {
842
910
  line-height: 20px;
843
911
  }
912
+
844
913
  p.note {
845
914
  font-size: 12px;
846
915
  line-height: 16px;
847
916
  }
917
+
848
918
  span.error {
849
- font-weight: 500 /* Medium */;
919
+ font-weight: bold;
850
920
  }
851
921
  </style>
@@ -45,16 +45,16 @@ export default {
45
45
  type: Number,
46
46
  },
47
47
  },
48
- data: function() {
48
+ data: function () {
49
49
  return {
50
50
  isDiscrete: this.possibleValues !== undefined,
51
- labelClasses: "default " + ((this.possibleValues !== undefined)?"discrete":"scalar"),
51
+ labelClasses: "default " + ((this.possibleValues !== undefined) ? "discrete" : "scalar"),
52
52
  visible: true,
53
53
  vModel: this.defaultValue,
54
54
  };
55
55
  },
56
56
  methods: {
57
- updateUi: function() {
57
+ updateUi: function () {
58
58
  updateUi(this.$parent);
59
59
  },
60
60
  },
@@ -63,63 +63,76 @@ export default {
63
63
 
64
64
  <!-- Add "scoped" attribute to limit CSS to this component only -->
65
65
  <style scoped lang="scss">
66
-
67
- :deep( .el-input-number.scalar ){
66
+ :deep(.el-input-number.scalar) {
68
67
  margin-top: -8px;
69
68
  width: 45px;
70
69
  }
71
- :deep( .el-input-number.scalar .el-input ){
70
+
71
+ :deep(.el-input-number.scalar .el-input) {
72
72
  width: 60px;
73
73
  }
74
- :deep( .el-input-number.scalar .el-input__inner:focus ){
74
+
75
+ :deep(.el-input-number.scalar .el-input__inner:focus) {
75
76
  border-color: #8300bf;
76
77
  }
77
- :deep( .el-select.discrete ){
78
+
79
+ :deep(.el-select.discrete) {
78
80
  margin-bottom: 16px;
79
81
  }
80
- :deep( .el-slider ){
82
+
83
+ :deep(.el-slider) {
81
84
  width: 108px;
82
85
  margin-top: -12px;
83
86
  margin-left: 8px;
84
87
  }
85
- :deep( .el-slider__bar ){
88
+
89
+ :deep(.el-slider__bar) {
86
90
  background-color: #8300bf;
87
91
  }
88
- :deep( .el-slider__button ){
92
+
93
+ :deep(.el-slider__button) {
89
94
  border-color: #8300bf;
90
95
  }
96
+
91
97
  .discrete {
92
98
  margin-left: 8px;
93
99
  width: 160px;
94
100
  }
101
+
95
102
  .discrete {
96
- :deep( .el-input__inner ){
103
+ :deep(.el-input__inner) {
97
104
  font-family: Asap, sans-serif;
98
105
  font-size: 16px;
99
106
  }
100
107
  }
101
- .discrete :deep( .el-input__inner:focus),
102
- .discrete :deep( .el-input.is-focus .el-input__inner) {
108
+
109
+ .discrete :deep(.el-input__inner:focus),
110
+ .discrete :deep(.el-input.is-focus .el-input__inner) {
103
111
  border-color: #8300bf;
104
112
  }
113
+
105
114
  .discrete-popper .el-select-dropdown__item {
106
115
  font-family: Asap, sans-serif;
107
116
  }
117
+
108
118
  .discrete-popper .el-select-dropdown__item.is-selected {
109
119
  font-weight: normal;
110
120
  color: #8300bf;
111
121
  }
112
- .scalar :deep( .el-input__inner ){
122
+
123
+ .scalar :deep(.el-input__inner) {
113
124
  text-align: center;
114
125
  }
115
126
 
116
- .scalar :deep(.el-input__wrapper){
127
+ .scalar :deep(.el-input__wrapper) {
117
128
  padding-left: 4px;
118
129
  padding-right: 4px;
119
130
  }
131
+
120
132
  div.simulation-vuer {
121
133
  height: 100%;
122
134
  }
135
+
123
136
  div.sliders-and-fields {
124
137
  display: grid;
125
138
  grid-template-columns: 132px auto;
@@ -127,16 +140,19 @@ div.sliders-and-fields {
127
140
  height: 26px;
128
141
  margin-bottom: 4px;
129
142
  }
143
+
130
144
  p.default {
131
145
  font-family: Asap, sans-serif;
132
146
  letter-spacing: 0;
133
147
  margin: 16px 0;
134
148
  text-align: start;
135
149
  }
150
+
136
151
  p.discrete {
137
152
  margin-top: 0;
138
153
  margin-bottom: 4px;
139
154
  }
155
+
140
156
  p.scalar {
141
157
  grid-column-start: 1;
142
158
  grid-column-end: 3;
@@ -30,7 +30,7 @@ export function updateUi(parent) {
30
30
  });
31
31
 
32
32
  if (parent.libopencor !== undefined) {
33
- parent.userMessage = "Rerunning the model...";
33
+ parent.userMessage = "Running the model...";
34
34
  parent.showUserMessage = true;
35
35
 
36
36
  parent.$nextTick(() => {
@@ -8,7 +8,6 @@
8
8
  import fs from 'fs'
9
9
  import path from 'path'
10
10
  import chokidar from 'chokidar'
11
- // import { parser } from '@vuese/parser'
12
11
  import { parseSource } from 'vue-docgen-api'
13
12
  import { Render } from '@vuese/markdown-render'
14
13