@rancher/shell 0.3.28 → 0.3.29

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 (33) hide show
  1. package/.DS_Store +0 -0
  2. package/assets/translations/en-us.yaml +15 -1
  3. package/chart/monitoring/grafana/index.vue +2 -2
  4. package/components/AsyncButton.vue +9 -0
  5. package/components/SortableTable/THead.vue +7 -9
  6. package/components/SortableTable/index.vue +1 -2
  7. package/components/fleet/FleetStatus.vue +3 -3
  8. package/components/fleet/FleetSummary.vue +32 -27
  9. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  10. package/edit/workload/index.vue +2 -1
  11. package/machine-config/__tests__/vmwarevsphere.test.ts +72 -0
  12. package/machine-config/vmwarevsphere.vue +68 -13
  13. package/package.json +2 -1
  14. package/rancher-components/BadgeState/BadgeState.vue +5 -1
  15. package/rancher-components/Banner/Banner.test.ts +51 -1
  16. package/rancher-components/Banner/Banner.vue +134 -53
  17. package/rancher-components/Card/Card.test.ts +37 -0
  18. package/rancher-components/Card/Card.vue +24 -7
  19. package/rancher-components/Form/Checkbox/Checkbox.test.ts +20 -29
  20. package/rancher-components/Form/Checkbox/Checkbox.vue +45 -20
  21. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +2 -8
  22. package/rancher-components/Form/LabeledInput/LabeledInput.vue +22 -10
  23. package/rancher-components/Form/Radio/RadioButton.test.ts +31 -0
  24. package/rancher-components/Form/Radio/RadioButton.vue +30 -13
  25. package/rancher-components/Form/Radio/RadioGroup.vue +26 -7
  26. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -6
  27. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +25 -38
  28. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +23 -11
  29. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +19 -5
  30. package/rancher-components/StringList/StringList.test.ts +453 -49
  31. package/rancher-components/StringList/StringList.vue +92 -58
  32. package/types/shell/index.d.ts +9 -9
  33. package/yarn-error.log +200 -0
@@ -30,9 +30,9 @@ const CLASS = {
30
30
  * Manage a list of strings
31
31
  */
32
32
  export default Vue.extend({
33
- components: { LabeledInput },
34
33
 
35
- name: 'StringList',
34
+ name: 'StringList',
35
+ components: { LabeledInput },
36
36
 
37
37
  props: {
38
38
  /**
@@ -85,11 +85,11 @@ export default Vue.extend({
85
85
  },
86
86
  data() {
87
87
  return {
88
- value: null as string | null,
89
- selected: null as string | null,
90
- isEditItem: null as string | null,
91
- isCreateItem: false,
92
- errors: { duplicate: false } as Record<Error, boolean>
88
+ value: null as string | null,
89
+ selected: null as string | null,
90
+ editedItem: null as string | null,
91
+ isCreateItem: false,
92
+ errors: { duplicate: false } as Record<Error, boolean>
93
93
  };
94
94
  },
95
95
 
@@ -100,8 +100,8 @@ export default Vue.extend({
100
100
  */
101
101
  errorMessagesArray(): string[] {
102
102
  return (Object.keys(this.errors) as Error[])
103
- .filter(f => !!(this.errors)[f])
104
- .map(k => this.errorMessages[k]);
103
+ .filter((f) => this.errors[f] && this.errorMessages[f])
104
+ .map((k) => this.errorMessages[k]);
105
105
  },
106
106
  },
107
107
 
@@ -113,23 +113,35 @@ export default Vue.extend({
113
113
  this.toggleEditMode(false);
114
114
  this.toggleCreateMode(false);
115
115
  },
116
+ value(val) {
117
+ this.$emit('type:item', val);
118
+ },
119
+ errors: {
120
+ handler(val) {
121
+ this.$emit('errors', val);
122
+ },
123
+ deep: true
124
+ }
116
125
  },
117
126
 
118
127
  methods: {
119
128
  onChange(value: string) {
120
129
  this.value = value;
121
- /**
122
- * Remove duplicate error when a new value is typed
123
- */
130
+
131
+ const items = [
132
+ ...this.items,
133
+ this.value
134
+ ];
135
+
124
136
  this.toggleError(
125
137
  'duplicate',
126
- false,
127
- this.isCreateItem ? INPUT.create : INPUT.edit,
138
+ hasDuplicatedStrings(items, this.caseSensitive),
139
+ this.isCreateItem ? INPUT.create : INPUT.edit
128
140
  );
129
141
  },
130
142
 
131
143
  onSelect(item: string) {
132
- if (this.isCreateItem || this.isEditItem === item) {
144
+ if (this.readonly || this.isCreateItem || this.editedItem === item) {
133
145
  return;
134
146
  }
135
147
  this.selected = item;
@@ -160,7 +172,7 @@ export default Vue.extend({
160
172
  },
161
173
 
162
174
  onClickEmptyBody() {
163
- if (!this.isCreateItem && !this.isEditItem) {
175
+ if (!this.isCreateItem && !this.editedItem) {
164
176
  this.toggleCreateMode(true);
165
177
  }
166
178
  },
@@ -176,38 +188,43 @@ export default Vue.extend({
176
188
 
177
189
  return;
178
190
  }
179
- if (this.isEditItem) {
191
+ if (this.editedItem) {
192
+ this.deleteAndSelectNext(this.editedItem);
180
193
  this.toggleEditMode(false);
181
194
 
182
195
  return;
183
196
  }
184
197
  if (this.selected) {
185
- const index = findStringIndex(this.items, this.selected, false);
198
+ this.deleteAndSelectNext(this.selected);
199
+ }
200
+ },
186
201
 
187
- if (index !== -1) {
188
- /**
189
- * Select the next item in the list when an item is to be deleted.
190
- */
191
- const item = (this.items[index + 1] || this.items[index - 1]);
202
+ deleteAndSelectNext(currItem: string) {
203
+ const index = findStringIndex(this.items, currItem, false);
204
+
205
+ if (index !== -1) {
206
+ /**
207
+ * Select the next item in the list.
208
+ */
209
+ const item = (this.items[index + 1] || this.items[index - 1]);
192
210
 
193
- this.onSelect(item);
194
- this.setFocus(item);
211
+ this.onSelect(item);
212
+ this.setFocus(item);
195
213
 
196
- this.deleteItem(this.items[index]);
197
- }
214
+ this.deleteItem(this.items[index]);
198
215
  }
199
216
  },
200
217
 
201
218
  setFocus(refId: string) {
202
- this.$nextTick(() => this.getElemByRef(refId)?.focus());
219
+ this.$nextTick(() => (this.getElemByRef(refId) as Vue & HTMLElement)?.focus());
203
220
  },
204
221
 
205
222
  /**
206
223
  * Move scrollbar when the selected item is over the top or bottom side of the box
207
224
  */
208
225
  moveScrollbar(arrow: Arrow, value?: number) {
209
- const box = this.getElemByRef(BOX);
210
- const item = this.getElemByRef(this.selected || '');
226
+ const box = this.getElemByRef(BOX) as HTMLElement;
227
+ const item = this.getElemByRef(this.selected || '') as HTMLElement;
211
228
 
212
229
  if (box && item && item.className.includes(CLASS.item)) {
213
230
  const boxRect = box.getClientRects()[0];
@@ -229,13 +246,14 @@ export default Vue.extend({
229
246
  */
230
247
  toggleError(type: Error, val: boolean, refId?: string) {
231
248
  this.errors[type] = val;
249
+
232
250
  if (refId) {
233
251
  this.toggleErrorClass(refId, val);
234
252
  }
235
253
  },
236
254
 
237
255
  toggleErrorClass(refId: string, val: boolean) {
238
- const input = this.getElemByRef(refId)?.$el;
256
+ const input = (this.getElemByRef(refId) as Vue)?.$el;
239
257
 
240
258
  if (input) {
241
259
  if (val) {
@@ -250,7 +268,11 @@ export default Vue.extend({
250
268
  * Show/Hide the input line to create new item
251
269
  */
252
270
  toggleCreateMode(show: boolean) {
271
+ if (this.readonly) {
272
+ return;
273
+ }
253
274
  if (show) {
275
+ this.toggleEditMode(false);
254
276
  this.value = '';
255
277
 
256
278
  this.isCreateItem = true;
@@ -268,31 +290,34 @@ export default Vue.extend({
268
290
  * Show/Hide the in-line editing to edit an existing item
269
291
  */
270
292
  toggleEditMode(show: boolean, item?: string) {
293
+ if (this.readonly) {
294
+ return;
295
+ }
271
296
  if (show) {
272
297
  this.toggleCreateMode(false);
273
- this.value = this.isEditItem;
298
+ this.value = this.editedItem;
274
299
 
275
- this.isEditItem = item || '';
300
+ this.editedItem = item || '';
276
301
  this.setFocus(INPUT.edit);
277
302
  } else {
278
303
  this.value = null;
279
304
  this.toggleError('duplicate', false);
280
305
  this.onSelectLeave();
281
306
 
282
- this.isEditItem = null;
307
+ this.editedItem = null;
283
308
  }
284
309
  },
285
310
 
286
311
  getElemByRef(id: string) {
287
312
  const ref = this.$refs[id];
288
313
 
289
- return (Array.isArray(ref) ? ref[0] : ref) as any;
314
+ return Array.isArray(ref) ? ref[0] : ref;
290
315
  },
291
316
 
292
317
  /**
293
318
  * Create a new item and insert in the items list
294
319
  */
295
- saveItem() {
320
+ saveItem(closeInput = true) {
296
321
  const value = this.value?.trim();
297
322
 
298
323
  if (value) {
@@ -301,21 +326,20 @@ export default Vue.extend({
301
326
  value,
302
327
  ];
303
328
 
304
- if (hasDuplicatedStrings(items, this.caseSensitive)) {
305
- this.toggleError('duplicate', true, INPUT.create);
306
-
307
- return;
329
+ if (!hasDuplicatedStrings(items, this.caseSensitive)) {
330
+ this.updateItems(items);
308
331
  }
332
+ }
309
333
 
310
- this.updateItems(items);
334
+ if (closeInput) {
335
+ this.toggleCreateMode(false);
311
336
  }
312
- this.toggleCreateMode(false);
313
337
  },
314
338
 
315
339
  /**
316
340
  * Update an existing item in the items list
317
341
  */
318
- updateItem(item: string) {
342
+ updateItem(item: string, closeInput = true) {
319
343
  const value = this.value?.trim();
320
344
 
321
345
  if (value) {
@@ -326,22 +350,21 @@ export default Vue.extend({
326
350
  items[index] = value;
327
351
  }
328
352
 
329
- if (hasDuplicatedStrings(items, this.caseSensitive)) {
330
- this.toggleError('duplicate', true, INPUT.edit);
331
-
332
- return;
353
+ if (!hasDuplicatedStrings(items, this.caseSensitive)) {
354
+ this.updateItems(items);
333
355
  }
356
+ }
334
357
 
335
- this.updateItems(items);
358
+ if (closeInput) {
359
+ this.toggleEditMode(false);
336
360
  }
337
- this.toggleEditMode(false);
338
361
  },
339
362
 
340
363
  /**
341
364
  * Remove an item from items list
342
365
  */
343
366
  deleteItem(item?: string) {
344
- const items = this.items.filter(f => f !== item);
367
+ const items = this.items.filter((f) => f !== item);
345
368
 
346
369
  this.updateItems(items);
347
370
  },
@@ -387,19 +410,20 @@ export default Vue.extend({
387
410
  @blur="onSelectLeave(item)"
388
411
  >
389
412
  <span
390
- v-if="!isEditItem || isEditItem !== item"
413
+ v-if="!editedItem || editedItem !== item"
391
414
  class="label static"
392
415
  >
393
416
  {{ item }}
394
417
  </span>
395
418
  <LabeledInput
396
- v-if="isEditItem && isEditItem === item"
419
+ v-if="editedItem && editedItem === item"
397
420
  ref="item-edit"
421
+ :data-testid="`item-edit-${item}`"
398
422
  class="edit-input static"
399
423
  :value="value != null ? value : item"
400
424
  @input="onChange($event)"
401
- @blur.prevent="toggleEditMode(false)"
402
- @keydown.native.enter="updateItem(item)"
425
+ @blur.prevent="updateItem(item)"
426
+ @keydown.native.enter="updateItem(item, !errors.duplicate)"
403
427
  />
404
428
  </div>
405
429
  <div
@@ -408,12 +432,14 @@ export default Vue.extend({
408
432
  >
409
433
  <LabeledInput
410
434
  ref="item-create"
435
+ data-testid="item-create"
411
436
  class="create-input static"
412
437
  type="text"
413
438
  :value="value"
414
439
  :placeholder="placeholder"
415
440
  @input="onChange($event)"
416
- @keydown.native.enter="saveItem"
441
+ @blur.prevent="saveItem"
442
+ @keydown.native.enter="saveItem(!errors.duplicate)"
417
443
  />
418
444
  </div>
419
445
  </div>
@@ -427,25 +453,32 @@ export default Vue.extend({
427
453
  class="action-buttons"
428
454
  >
429
455
  <button
456
+ data-testid="button-remove"
430
457
  class="btn btn-sm role-tertiary remove-button"
431
- :disabled="!selected && !isCreateItem && !isEditItem"
458
+ :disabled="!selected && !isCreateItem && !editedItem"
432
459
  @mousedown.prevent="onClickMinusButton"
433
460
  >
434
461
  <span class="icon icon-minus icon-sm" />
435
462
  </button>
436
463
  <button
464
+ data-testid="button-add"
437
465
  class="btn btn-sm role-tertiary add-button"
438
- :disabled="isCreateItem"
466
+ :disabled="isCreateItem || editedItem"
439
467
  @click.prevent="onClickPlusButton"
440
468
  >
441
469
  <span class="icon icon-plus icon-sm" />
442
470
  </button>
443
471
  </div>
444
472
  <div class="messages">
445
- <i v-if="errorMessagesArray.length > 0" class="icon icon-warning icon-lg" />
473
+ <i
474
+ v-if="errorMessagesArray.length > 0"
475
+ data-testid="i-warning-icon"
476
+ class="icon icon-warning icon-lg"
477
+ />
446
478
  <span
447
479
  v-for="(msg, idx) in errorMessagesArray"
448
480
  :key="idx"
481
+ :data-testid="`span-error-message-${msg}`"
449
482
  class="error"
450
483
  >
451
484
  {{ idx > 0 ? '; ' : '' }}
@@ -499,6 +532,7 @@ export default Vue.extend({
499
532
  width: auto;
500
533
  user-select: none;
501
534
  overflow: hidden;
535
+ white-space: no-wrap;
502
536
  text-overflow: ellipsis;
503
537
  padding-top: 1px;
504
538
  }
@@ -3621,35 +3621,35 @@ export namespace KEY {
3621
3621
  }
3622
3622
  }
3623
3623
 
3624
- // @shell/utils/poller
3624
+ // @shell/utils/poller-sequential
3625
3625
 
3626
- declare module '@shell/utils/poller' {
3627
- export default class Poller {
3626
+ declare module '@shell/utils/poller-sequential' {
3627
+ export default class PollerSequential {
3628
3628
  constructor(fn: any, pollRateMs: any, maxRetries?: number);
3629
3629
  fn: any;
3630
3630
  pollRateMs: any;
3631
3631
  maxRetries: number;
3632
- intervalId: any;
3632
+ timeoutId: any;
3633
3633
  tryCount: number;
3634
3634
  start(): void;
3635
3635
  stop(): void;
3636
+ _poll(): void;
3636
3637
  _intervalMethod(): Promise<void>;
3637
3638
  }
3638
3639
  }
3639
3640
 
3640
- // @shell/utils/poller-sequential
3641
+ // @shell/utils/poller
3641
3642
 
3642
- declare module '@shell/utils/poller-sequential' {
3643
- export default class PollerSequential {
3643
+ declare module '@shell/utils/poller' {
3644
+ export default class Poller {
3644
3645
  constructor(fn: any, pollRateMs: any, maxRetries?: number);
3645
3646
  fn: any;
3646
3647
  pollRateMs: any;
3647
3648
  maxRetries: number;
3648
- timeoutId: any;
3649
+ intervalId: any;
3649
3650
  tryCount: number;
3650
3651
  start(): void;
3651
3652
  stop(): void;
3652
- _poll(): void;
3653
3653
  _intervalMethod(): Promise<void>;
3654
3654
  }
3655
3655
  }
package/yarn-error.log ADDED
@@ -0,0 +1,200 @@
1
+ Arguments:
2
+ /Users/aalves/.nvm/versions/node/v16.19.1/bin/node /Users/aalves/.nvm/versions/node/v16.19.1/bin/yarn publish . --new-version 0.3.22 --no-git-tag-version --access public
3
+
4
+ PATH:
5
+ /Users/aalves/.rd/bin:/Users/aalves/.nvm/versions/node/v16.19.1/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/aalves/.rd/bin:/Users/aalves/.nvm/versions/node/v16.19.1/bin:/opt/homebrew/bin:/opt/homebrew/sbin
6
+
7
+ Yarn version:
8
+ 1.22.19
9
+
10
+ Node version:
11
+ 16.19.1
12
+
13
+ Platform:
14
+ darwin arm64
15
+
16
+ Trace:
17
+ Error: https://registry.yarnpkg.com/-/user/org.couchdb.user:aalves08: failed to authenticate: Could not authenticate aalves08: bad password
18
+ at Request.params.callback [as _callback] (/Users/aalves/.nvm/versions/node/v16.19.1/lib/node_modules/yarn/lib/cli.js:66145:18)
19
+ at Request.self.callback (/Users/aalves/.nvm/versions/node/v16.19.1/lib/node_modules/yarn/lib/cli.js:140890:22)
20
+ at Request.emit (node:events:513:28)
21
+ at Request.<anonymous> (/Users/aalves/.nvm/versions/node/v16.19.1/lib/node_modules/yarn/lib/cli.js:141862:10)
22
+ at Request.emit (node:events:513:28)
23
+ at IncomingMessage.<anonymous> (/Users/aalves/.nvm/versions/node/v16.19.1/lib/node_modules/yarn/lib/cli.js:141784:12)
24
+ at Object.onceWrapper (node:events:627:28)
25
+ at IncomingMessage.emit (node:events:525:35)
26
+ at endReadableNT (node:internal/streams/readable:1358:12)
27
+ at processTicksAndRejections (node:internal/process/task_queues:83:21)
28
+
29
+ npm manifest:
30
+ {
31
+ "name": "@rancher/shell",
32
+ "version": "0.3.22",
33
+ "description": "Rancher Dashboard Shell",
34
+ "repository": "https://github.com/rancherlabs/dashboard",
35
+ "license": "Apache-2.0",
36
+ "author": "SUSE",
37
+ "private": false,
38
+ "engines": {
39
+ "node": ">=12"
40
+ },
41
+ "files": [
42
+ "**/*"
43
+ ],
44
+ "scripts": {
45
+ "clean": "./scripts/clean",
46
+ "lint": "./node_modules/.bin/eslint --max-warnings 0 --ext .ts,.js,.vue .",
47
+ "test": "./node_modules/.bin/nyc ava --serial --verbose",
48
+ "dev": "./node_modules/.bin/vue-cli-service dev",
49
+ "docker-dev": "docker run --rm --name dashboard-dev -p 8005:8005 -e API=$API -v $(pwd):/src -v dashboard_node:/src/node_modules rancher/dashboard:dev",
50
+ "build": "./node_modules/.bin/vue-cli-service build",
51
+ "analyze": "./node_modules/.bin/vue-cli-service build --report",
52
+ "start": "./node_modules/.bin/vue-cli-service start",
53
+ "cy:run": "cypress run",
54
+ "cy:open": "cypress open",
55
+ "e2e:pre": "NODE_ENV=dev yarn build",
56
+ "e2e:run": "NODE_ENV=dev START_SERVER_AND_TEST_INSECURE=1 start-server-and-test start https://localhost:8005/ cy:run",
57
+ "e2e:dev": "start-server-and-test dev https://localhost:8005 cy:open"
58
+ },
59
+ "dependencies": {
60
+ "@aws-sdk/client-ec2": "3.1.0",
61
+ "@aws-sdk/client-eks": "3.1.0",
62
+ "@aws-sdk/client-kms": "3.8.1",
63
+ "@babel/plugin-proposal-optional-chaining": "7.14.5",
64
+ "@babel/plugin-proposal-private-property-in-object": "7.14.5",
65
+ "@babel/preset-typescript": "7.16.7",
66
+ "@innologica/vue-dropdown-menu": "0.1.3",
67
+ "@novnc/novnc": "1.2.0",
68
+ "@nuxt/types": "2.14.6",
69
+ "@nuxt/typescript-build": "2.1.0",
70
+ "@nuxtjs/axios": "5.12.0",
71
+ "@nuxtjs/eslint-config-typescript": "6.0.1",
72
+ "@nuxtjs/webpack-profile": "0.1.0",
73
+ "@popperjs/core": "2.4.4",
74
+ "@types/node": "16.4.3",
75
+ "@typescript-eslint/eslint-plugin": "4.33.0",
76
+ "@typescript-eslint/parser": "4.33.0",
77
+ "@vue/cli-plugin-babel": "4.5.18",
78
+ "@vue/cli-plugin-typescript": "4.5.18",
79
+ "@vue/cli-service": "4.5.18",
80
+ "@vue/test-utils": "1.2.1",
81
+ "@vue/vue2-jest": "27.0.0",
82
+ "add": "2.0.6",
83
+ "ansi_up": "5.0.0",
84
+ "babel-eslint": "10.1.0",
85
+ "babel-plugin-module-resolver": "4.0.0",
86
+ "babel-preset-vue": "2.0.2",
87
+ "browser-env": "3.3.0",
88
+ "cookie": "0.5.0",
89
+ "cookie-universal-nuxt": "2.1.4",
90
+ "core-js": "3.21.1",
91
+ "cron-validator": "1.2.0",
92
+ "cronstrue": "1.95.0",
93
+ "cross-env": "6.0.3",
94
+ "css-loader": "6.7.3",
95
+ "csv-loader": "3.0.3",
96
+ "cypress": "10.3.1",
97
+ "d3": "7.3.0",
98
+ "d3-selection": "1.4.1",
99
+ "dagre-d3": "0.6.4",
100
+ "dayjs": "1.8.29",
101
+ "diff2html": "3.4.24",
102
+ "dompurify": "2.4.5",
103
+ "eslint": "7.32.0",
104
+ "eslint-config-standard": "16.0.3",
105
+ "eslint-import-resolver-node": "0.3.4",
106
+ "eslint-module-utils": "2.6.1",
107
+ "eslint-plugin-cypress": "2.12.1",
108
+ "eslint-plugin-import": "2.23.4",
109
+ "eslint-plugin-jest": "24.4.0",
110
+ "eslint-plugin-n": "15.2.0",
111
+ "eslint-plugin-vue": "9.10.0",
112
+ "event-target-shim": "5.0.1",
113
+ "express": "4.17.1",
114
+ "file-saver": "2.0.2",
115
+ "frontmatter-markdown-loader": "3.7.0",
116
+ "identicon.js": "2.3.3",
117
+ "intl-messageformat": "7.8.4",
118
+ "is-url": "1.2.4",
119
+ "jest": "27.5.1",
120
+ "jest-serializer-vue": "2.0.2",
121
+ "jexl": "2.2.2",
122
+ "jquery": "3.5.1",
123
+ "js-cookie": "2.2.1",
124
+ "js-yaml": "4.1.0",
125
+ "js-yaml-loader": "1.2.2",
126
+ "jsdiff": "1.1.1",
127
+ "jsdom-global": "3.0.2",
128
+ "jsonpath-plus": "6.0.1",
129
+ "jsrsasign": "10.5.25",
130
+ "jszip": "3.8.0",
131
+ "lodash": "4.17.21",
132
+ "marked": "4.0.17",
133
+ "nodemon": "2.0.22",
134
+ "nuxt": "2.15.8",
135
+ "nyc": "15.1.0",
136
+ "papaparse": "5.3.0",
137
+ "portal-vue": "2.1.7",
138
+ "rancher-icons": "rancher/icons#v2.0.16",
139
+ "require-extension-hooks": "0.3.3",
140
+ "require-extension-hooks-babel": "1.0.0",
141
+ "require-extension-hooks-vue": "3.0.0",
142
+ "sass": "1.51.0",
143
+ "sass-loader": "10.2.1",
144
+ "serve-static": "1.14.1",
145
+ "set-cookie-parser": "2.4.6",
146
+ "shell-quote": "1.7.3",
147
+ "sinon": "8.1.1",
148
+ "start-server-and-test": "1.13.1",
149
+ "style-loader": "1.2.1",
150
+ "ts-node": "8.10.2",
151
+ "typescript": "4.1.6",
152
+ "url-parse": "1.5.10",
153
+ "v-tooltip": "2.0.3",
154
+ "vue": "2.7.14",
155
+ "vue-clipboard2": "0.3.1",
156
+ "vue-codemirror": "4.0.6",
157
+ "vue-js-modal": "1.3.35",
158
+ "vue-resize": "0.4.5",
159
+ "vue-select": "3.18.3",
160
+ "vue-server-renderer": "2.7.14",
161
+ "vue-shortkey": "3.1.7",
162
+ "vue-template-compiler": "2.7.14",
163
+ "vue-virtual-scroll-list": "^2.3.4",
164
+ "vue2-transitions": "0.3.0",
165
+ "vuedraggable": "2.24.3",
166
+ "vuex": "3.6.2",
167
+ "webpack-bundle-analyzer": "4.5.0",
168
+ "webpack-virtual-modules": "0.4.3",
169
+ "xterm": "5.0.0",
170
+ "xterm-addon-fit": "0.6.0",
171
+ "xterm-addon-search": "0.10.0",
172
+ "xterm-addon-web-links": "0.7.0",
173
+ "xterm-addon-webgl": "0.13.0",
174
+ "worker-loader": "3.0.8",
175
+ "yarn": "1.22.18"
176
+ },
177
+ "resolutions": {
178
+ "ejs": "^3.1.7",
179
+ "json5": ">=2.2.2",
180
+ "d3-color": ">=3.1.0",
181
+ "glob-parent": ">=5.1.2",
182
+ "node-forge": ">=1.3.0",
183
+ "qs": ">=6.7.3",
184
+ "nth-check": ">=2.0.1",
185
+ "follow-redirects": ">=1.14.7",
186
+ "merge": ">=2.1.1"
187
+ },
188
+ "nyc": {
189
+ "extension": [
190
+ ".js",
191
+ ".vue"
192
+ ]
193
+ }
194
+ }
195
+
196
+ yarn manifest:
197
+ No manifest
198
+
199
+ Lockfile:
200
+ No lockfile