@gitlab/ui 45.0.0 → 46.0.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 (40) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/components/base/alert/alert.js +9 -1
  3. package/dist/utility_classes.css +1 -1
  4. package/dist/utility_classes.css.map +1 -1
  5. package/package.json +2 -2
  6. package/src/components/base/alert/alert.spec.js +13 -14
  7. package/src/components/base/alert/alert.vue +14 -1
  8. package/src/components/base/banner/banner.spec.js +4 -4
  9. package/src/components/base/datepicker/datepicker.spec.js +1 -1
  10. package/src/components/base/daterange_picker/daterange_picker.spec.js +4 -4
  11. package/src/components/base/drawer/drawer.spec.js +2 -2
  12. package/src/components/base/dropdown/dropdown.spec.js +5 -5
  13. package/src/components/base/filtered_search/filtered_search.spec.js +4 -4
  14. package/src/components/base/filtered_search/filtered_search_token.spec.js +9 -9
  15. package/src/components/base/filtered_search/filtered_search_token_segment.spec.js +12 -12
  16. package/src/components/base/form/form_textarea/form_textarea.spec.js +2 -2
  17. package/src/components/base/infinite_scroll/infinite_scroll.spec.js +6 -6
  18. package/src/components/base/label/label.spec.js +5 -5
  19. package/src/components/base/modal/modal.spec.js +1 -1
  20. package/src/components/base/nav/nav.spec.js +1 -1
  21. package/src/components/base/nav/nav_item_dropdown.spec.js +3 -3
  22. package/src/components/base/paginated_list/paginated_list.spec.js +1 -1
  23. package/src/components/base/pagination/pagination.spec.js +2 -2
  24. package/src/components/base/search_box_by_click/search_box_by_click.spec.js +7 -7
  25. package/src/components/base/search_box_by_type/search_box_by_type.spec.js +2 -2
  26. package/src/components/base/sorting/sorting.spec.js +1 -1
  27. package/src/components/base/sorting/sorting_item.spec.js +2 -2
  28. package/src/components/base/tabs/tabs/scrollable_tabs.spec.js +1 -1
  29. package/src/components/base/tabs/tabs/tabs.spec.js +6 -6
  30. package/src/components/base/token/token.spec.js +1 -1
  31. package/src/components/base/token_selector/token_container.spec.js +1 -1
  32. package/src/components/base/token_selector/token_selector.spec.js +4 -4
  33. package/src/components/base/token_selector/token_selector_dropdown.spec.js +1 -1
  34. package/src/components/charts/column/column_chart.spec.js +1 -1
  35. package/src/components/charts/sparkline/sparkline.spec.js +2 -2
  36. package/src/directives/resize_observer/resize_observer.spec.js +5 -5
  37. package/src/scss/utilities.scss +0 -202
  38. package/src/scss/utility-mixins/display.scss +0 -35
  39. package/src/scss/utility-mixins/flex.scss +0 -7
  40. package/src/scss/utility-mixins/spacing.scss +0 -91
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "45.0.0",
3
+ "version": "46.0.0",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -79,7 +79,7 @@
79
79
  "@arkweid/lefthook": "0.7.7",
80
80
  "@babel/core": "^7.19.3",
81
81
  "@babel/preset-env": "^7.19.3",
82
- "@gitlab/eslint-plugin": "18.0.0",
82
+ "@gitlab/eslint-plugin": "18.1.0",
83
83
  "@gitlab/stylelint-config": "4.1.0",
84
84
  "@gitlab/svgs": "3.4.0",
85
85
  "@rollup/plugin-commonjs": "^11.1.0",
@@ -192,22 +192,21 @@ describe('Alert component', () => {
192
192
  });
193
193
  });
194
194
 
195
- describe('aria-live', () => {
196
- it.each([alertVariantOptions.danger, alertVariantOptions.warning])(
197
- 'for %p variant, has aria-live assertive attribute',
198
- (variant) => {
195
+ describe('role and aria-live', () => {
196
+ it.each`
197
+ variant | role | assertiveness
198
+ ${alertVariantOptions.danger} | ${'alert'} | ${'assertive'}
199
+ ${alertVariantOptions.warning} | ${'alert'} | ${'assertive'}
200
+ ${alertVariantOptions.info} | ${'status'} | ${'polite'}
201
+ ${alertVariantOptions.success} | ${'alert'} | ${'polite'}
202
+ ${alertVariantOptions.tip} | ${'status'} | ${'polite'}
203
+ `(
204
+ '$variant variant has role "$role" and aria-live "$assertiveness"',
205
+ ({ variant, role, assertiveness }) => {
199
206
  createComponent({ propsData: { variant } });
200
207
 
201
- expect(wrapper.find('[aria-live=assertive').exists()).toBe(true);
202
- }
203
- );
204
-
205
- it.each([alertVariantOptions.info, alertVariantOptions.success, alertVariantOptions.tip])(
206
- 'for %p variant, has aria-live polite attribute',
207
- (variant) => {
208
- createComponent({ propsData: { variant } });
209
-
210
- expect(wrapper.find('[aria-live=polite]').exists()).toBe(true);
208
+ expect(wrapper.find(`[role="${role}"`).exists()).toBe(true);
209
+ expect(wrapper.find(`[aria-live="${assertiveness}"`).exists()).toBe(true);
211
210
  }
212
211
  );
213
212
  });
@@ -97,6 +97,19 @@ export default {
97
97
 
98
98
  return 'polite';
99
99
  },
100
+ role() {
101
+ if (
102
+ [
103
+ alertVariantOptions.danger,
104
+ alertVariantOptions.warning,
105
+ alertVariantOptions.success,
106
+ ].includes(this.variant)
107
+ ) {
108
+ return 'alert';
109
+ }
110
+
111
+ return 'status';
112
+ },
100
113
  iconName() {
101
114
  return alertVariantIconMap[this.variant];
102
115
  },
@@ -192,7 +205,7 @@ export default {
192
205
  :class="{ 'gl-alert-icon': true, 'gl-alert-icon-no-title': !title }"
193
206
  />
194
207
 
195
- <div class="gl-alert-content" role="alert" :aria-live="ariaLive">
208
+ <div class="gl-alert-content" :role="role" :aria-live="ariaLive">
196
209
  <h2 v-if="title" class="gl-alert-title">{{ title }}</h2>
197
210
 
198
211
  <div class="gl-alert-body">
@@ -40,15 +40,15 @@ describe('banner component', () => {
40
40
  });
41
41
 
42
42
  it('should emit a `close` event after the close button is clicked', () => {
43
- expect(wrapper.emitted('close')).toBeFalsy();
43
+ expect(wrapper.emitted('close')).toBe(undefined);
44
44
  wrapper.find('.gl-banner-close').vm.$emit('click');
45
- expect(wrapper.emitted('close')).toBeTruthy();
45
+ expect(wrapper.emitted('close')).toHaveLength(1);
46
46
  });
47
47
 
48
48
  it('should emit a `primary` event when the primary button is clicked', () => {
49
- expect(wrapper.emitted('primary')).toBeFalsy();
49
+ expect(wrapper.emitted('primary')).toBe(undefined);
50
50
  wrapper.find('[data-testid="gl-banner-primary-button"]').vm.$emit('click');
51
- expect(wrapper.emitted('primary')).toBeTruthy();
51
+ expect(wrapper.emitted('primary')).toHaveLength(1);
52
52
  });
53
53
  });
54
54
 
@@ -180,7 +180,7 @@ describe('datepicker component', () => {
180
180
  });
181
181
 
182
182
  it('emits the `clear` event', () => {
183
- expect(wrapper.emitted('clear')).toBeTruthy();
183
+ expect(wrapper.emitted('clear')).toHaveLength(1);
184
184
  });
185
185
  });
186
186
 
@@ -50,13 +50,13 @@ describe('Daterange Picker', () => {
50
50
  it('emits `start-date-open` event on component when `open` event fires', () => {
51
51
  findStartPicker().vm.$emit('open');
52
52
 
53
- expect(wrapper.emitted('start-picker-open')).toBeTruthy();
53
+ expect(wrapper.emitted('start-picker-open')).toHaveLength(1);
54
54
  });
55
55
 
56
56
  it('emits `start-date-close` event on component when `close` event fires', () => {
57
57
  findStartPicker().vm.$emit('close');
58
58
 
59
- expect(wrapper.emitted('start-picker-close')).toBeTruthy();
59
+ expect(wrapper.emitted('start-picker-close')).toHaveLength(1);
60
60
  });
61
61
 
62
62
  describe('with a date range violation', () => {
@@ -136,13 +136,13 @@ describe('Daterange Picker', () => {
136
136
  it('emits `end-date-open` event on component when `open` event fires', () => {
137
137
  findEndPicker().vm.$emit('open');
138
138
 
139
- expect(wrapper.emitted('end-picker-open')).toBeTruthy();
139
+ expect(wrapper.emitted('end-picker-open')).toHaveLength(1);
140
140
  });
141
141
 
142
142
  it('emits `end-date-close` event on component when `close` event fires', () => {
143
143
  findEndPicker().vm.$emit('close');
144
144
 
145
- expect(wrapper.emitted('end-picker-close')).toBeTruthy();
145
+ expect(wrapper.emitted('end-picker-close')).toHaveLength(1);
146
146
  });
147
147
  });
148
148
  });
@@ -71,7 +71,7 @@ describe('drawer component', () => {
71
71
  const event = new KeyboardEvent('keydown', { keyCode: 27 });
72
72
  document.dispatchEvent(event);
73
73
 
74
- expect(wrapper.emitted().close).toBeFalsy();
74
+ expect(wrapper.emitted('close')).toBe(undefined);
75
75
  });
76
76
 
77
77
  it('does not call onClose when open is false and keyCode is not esc', () => {
@@ -80,7 +80,7 @@ describe('drawer component', () => {
80
80
  const event = new KeyboardEvent('keydown', { keyCode: 37 });
81
81
  document.dispatchEvent(event);
82
82
 
83
- expect(wrapper.emitted().close).toBeFalsy();
83
+ expect(wrapper.emitted('close')).toBe(undefined);
84
84
  });
85
85
  });
86
86
  });
@@ -185,7 +185,7 @@ describe('new dropdown', () => {
185
185
 
186
186
  it('renders the header', () => {
187
187
  buildWrapper({}, slots);
188
- expect(wrapper.find('.gl-new-dropdown-header').exists()).toBeTruthy();
188
+ expect(wrapper.find('.gl-new-dropdown-header').exists()).toBe(true);
189
189
  expect(wrapper.html()).toContain('Header Content');
190
190
  });
191
191
 
@@ -198,12 +198,12 @@ describe('new dropdown', () => {
198
198
  describe('with no header slot exists', () => {
199
199
  it('does not render the header', () => {
200
200
  buildWrapper();
201
- expect(wrapper.find('.gl-new-dropdown-header').exists()).toBeFalsy();
201
+ expect(wrapper.find('.gl-new-dropdown-header').exists()).toBe(false);
202
202
  });
203
203
 
204
204
  it('does render the header if headerText provided', () => {
205
205
  buildWrapper({ headerText: 'Legacy Header Prop Text' });
206
- expect(wrapper.find('.gl-new-dropdown-header').exists()).toBeTruthy();
206
+ expect(wrapper.find('.gl-new-dropdown-header').exists()).toBe(true);
207
207
  expect(wrapper.html()).toContain('Legacy Header Prop Text');
208
208
  });
209
209
  });
@@ -213,7 +213,7 @@ describe('new dropdown', () => {
213
213
 
214
214
  it('renders the footer', () => {
215
215
  buildWrapper({}, slots);
216
- expect(wrapper.find('.gl-new-dropdown-footer').exists()).toBeTruthy();
216
+ expect(wrapper.find('.gl-new-dropdown-footer').exists()).toBe(true);
217
217
  expect(wrapper.html()).toContain('Footer Content');
218
218
  });
219
219
  });
@@ -221,7 +221,7 @@ describe('new dropdown', () => {
221
221
  describe('with no footer slot exists', () => {
222
222
  it('does not render the footer', () => {
223
223
  buildWrapper();
224
- expect(wrapper.find('.gl-new-dropdown-footer').exists()).toBeFalsy();
224
+ expect(wrapper.find('.gl-new-dropdown-footer').exists()).toBe(false);
225
225
  });
226
226
  });
227
227
 
@@ -405,7 +405,7 @@ describe('Filtered search', () => {
405
405
  it('submits entire search when submit is requested', () => {
406
406
  createComponent();
407
407
  wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('submit');
408
- expect(wrapper.emitted().submit).toBeDefined();
408
+ expect(wrapper.emitted('submit')).toBeDefined();
409
409
  });
410
410
  });
411
411
 
@@ -414,8 +414,8 @@ describe('Filtered search', () => {
414
414
  value: ['one'],
415
415
  });
416
416
  wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('submit');
417
- expect(wrapper.emitted().submit).toBeDefined();
418
- expect(wrapper.emitted().submit[0][0]).toStrictEqual(['one']);
417
+ expect(wrapper.emitted('submit')).toBeDefined();
418
+ expect(wrapper.emitted('submit')[0][0]).toStrictEqual(['one']);
419
419
  });
420
420
 
421
421
  it('concatenates strings on submit', () => {
@@ -423,7 +423,7 @@ describe('Filtered search', () => {
423
423
  value: ['one', 'two', { type: 'faketoken', value: { data: 'smth' } }, 'four', 'five'],
424
424
  });
425
425
  wrapper.findComponent(GlFilteredSearchTerm).vm.$emit('submit');
426
- expect(wrapper.emitted().submit).toBeDefined();
426
+ expect(wrapper.emitted('submit')).toBeDefined();
427
427
  expect(wrapper.emitted().submit[0][0].map(stripId)).toStrictEqual([
428
428
  'one two',
429
429
  { type: 'faketoken', value: { data: 'smth' } },
@@ -65,7 +65,7 @@ describe('Filtered search token', () => {
65
65
  createComponent();
66
66
  findOperatorSegment().vm.$emit('activate');
67
67
 
68
- expect(wrapper.emitted().activate).toHaveLength(1);
68
+ expect(wrapper.emitted('activate')).toHaveLength(1);
69
69
  });
70
70
 
71
71
  it('activates operator segment if value is empty', () => {
@@ -82,7 +82,7 @@ describe('Filtered search token', () => {
82
82
  });
83
83
 
84
84
  expect(findDataSegment().props().active).toBe(true);
85
- expect(wrapper.emitted().input[0][0]).toStrictEqual({ data: '', operator: '=' });
85
+ expect(wrapper.emitted('input')[0][0]).toStrictEqual({ data: '', operator: '=' });
86
86
  });
87
87
 
88
88
  it('activates data segment if value is not empty', () => {
@@ -122,7 +122,7 @@ describe('Filtered search token', () => {
122
122
 
123
123
  findOperatorSegment().vm.$emit('backspace');
124
124
 
125
- expect(wrapper.emitted().replace).toHaveLength(1);
125
+ expect(wrapper.emitted('replace')).toHaveLength(1);
126
126
  });
127
127
 
128
128
  it('ignores backspace when value is not empty and backspace is pressed', () => {
@@ -130,7 +130,7 @@ describe('Filtered search token', () => {
130
130
 
131
131
  findOperatorSegment().vm.$emit('backspace');
132
132
 
133
- expect(wrapper.emitted().replace).toBeUndefined();
133
+ expect(wrapper.emitted('replace')).toBeUndefined();
134
134
  });
135
135
 
136
136
  it('jumps to data segment when operator segment is completed', () => {
@@ -150,7 +150,7 @@ describe('Filtered search token', () => {
150
150
  createComponent({ active: true, value: { operator: '=', data: 'something' } });
151
151
  selector().vm.$emit('deactivate');
152
152
 
153
- expect(wrapper.emitted().deactivate).toHaveLength(1);
153
+ expect(wrapper.emitted('deactivate')).toHaveLength(1);
154
154
  });
155
155
 
156
156
  it('emits destroy when deactivated and value is empty', async () => {
@@ -159,7 +159,7 @@ describe('Filtered search token', () => {
159
159
  await nextTick();
160
160
  await wrapper.setProps({ active: false });
161
161
 
162
- expect(wrapper.emitted().destroy).toHaveLength(1);
162
+ expect(wrapper.emitted('destroy')).toHaveLength(1);
163
163
  });
164
164
 
165
165
  it('activates operator segment when backspace is pressed in data segmented', async () => {
@@ -191,7 +191,7 @@ describe('Filtered search token', () => {
191
191
 
192
192
  findTitleSegment().vm.$emit('complete', availableTokens[1].title);
193
193
 
194
- expect(wrapper.emitted().replace).toHaveLength(1);
194
+ expect(wrapper.emitted('replace')).toHaveLength(1);
195
195
  expect(wrapper.emitted().replace[0][0].value).toStrictEqual(originalValue);
196
196
  });
197
197
 
@@ -205,7 +205,7 @@ describe('Filtered search token', () => {
205
205
 
206
206
  findTitleSegment().vm.$emit('complete', availableTokens[2].title);
207
207
 
208
- expect(wrapper.emitted().replace).toHaveLength(1);
208
+ expect(wrapper.emitted('replace')).toHaveLength(1);
209
209
  expect(wrapper.emitted().replace[0][0].value).toStrictEqual({ data: '' });
210
210
  });
211
211
 
@@ -236,7 +236,7 @@ describe('Filtered search token', () => {
236
236
 
237
237
  expect(preventDefaultSpy).toHaveBeenCalled();
238
238
  expect(stopPropagationSpy).toHaveBeenCalled();
239
- expect(wrapper.emitted().destroy).toHaveLength(1);
239
+ expect(wrapper.emitted('destroy')).toHaveLength(1);
240
240
  });
241
241
 
242
242
  it('jumps to data segment and applies selection if no match is available for key and data is empty', async () => {
@@ -74,7 +74,7 @@ describe('Filtered search token segment', () => {
74
74
 
75
75
  wrapper.trigger('mousedown.left');
76
76
 
77
- expect(wrapper.emitted().activate).toHaveLength(1);
77
+ expect(wrapper.emitted('activate')).toHaveLength(1);
78
78
  });
79
79
 
80
80
  it('does not emit activate when view-only is true', () => {
@@ -82,7 +82,7 @@ describe('Filtered search token segment', () => {
82
82
 
83
83
  wrapper.trigger('mousedown.left');
84
84
 
85
- expect(wrapper.emitted().activate).toBeUndefined();
85
+ expect(wrapper.emitted('activate')).toBeUndefined();
86
86
  });
87
87
 
88
88
  it('ignores mousedown if active', () => {
@@ -90,7 +90,7 @@ describe('Filtered search token segment', () => {
90
90
 
91
91
  wrapper.trigger('mousedown');
92
92
 
93
- expect(wrapper.emitted().mousedown).toBeUndefined();
93
+ expect(wrapper.emitted('mousedown')).toBeUndefined();
94
94
  });
95
95
 
96
96
  it('selects next suggestion if down arrow is pressed', () => {
@@ -111,7 +111,7 @@ describe('Filtered search token segment', () => {
111
111
  createComponent({ active: true, value: false });
112
112
  wrapper.find('input').trigger('keydown', { key: 'Enter' });
113
113
 
114
- expect(wrapper.emitted().submit).toHaveLength(1);
114
+ expect(wrapper.emitted('submit')).toHaveLength(1);
115
115
  });
116
116
 
117
117
  it('emits complete if Escape is pressed', () => {
@@ -126,14 +126,14 @@ describe('Filtered search token segment', () => {
126
126
  createComponent({ active: true, value: '' });
127
127
  wrapper.find('input').trigger('keydown', { key: 'Backspace' });
128
128
 
129
- expect(wrapper.emitted().backspace).toHaveLength(1);
129
+ expect(wrapper.emitted('backspace')).toHaveLength(1);
130
130
  });
131
131
 
132
132
  it('does not emit backspace event if value is not empty and Backspace is pressed', () => {
133
133
  createComponent({ active: true, value: 'something' });
134
134
  wrapper.find('input').trigger('keydown', { key: 'Backspace' });
135
135
 
136
- expect(wrapper.emitted().backspace).toBeUndefined();
136
+ expect(wrapper.emitted('backspace')).toBeUndefined();
137
137
  });
138
138
 
139
139
  it('invokes custom input handler if provided', () => {
@@ -160,7 +160,7 @@ describe('Filtered search token segment', () => {
160
160
 
161
161
  wrapper.find('input').trigger('blur');
162
162
 
163
- expect(wrapper.emitted().deactivate).toHaveLength(1);
163
+ expect(wrapper.emitted('deactivate')).toHaveLength(1);
164
164
  expect(wrapper.emitted('complete')).toBeUndefined();
165
165
  });
166
166
 
@@ -189,8 +189,8 @@ describe('Filtered search token segment', () => {
189
189
 
190
190
  wrapper.vm.applySuggestion(token);
191
191
 
192
- expect(wrapper.emitted().input[0][0]).toBe(token);
193
- expect(wrapper.emitted().complete[0][0]).toBe(token);
192
+ expect(wrapper.emitted('input')[0][0]).toBe(token);
193
+ expect(wrapper.emitted('complete')[0][0]).toBe(token);
194
194
  });
195
195
 
196
196
  it('emits wrapped token when spaces are present', () => {
@@ -201,9 +201,9 @@ describe('Filtered search token segment', () => {
201
201
 
202
202
  wrapper.vm.applySuggestion(token);
203
203
 
204
- expect(wrapper.emitted().input[0][0]).toBe(formattedToken);
205
- expect(wrapper.emitted().select[0][0]).toBe(formattedToken);
206
- expect(wrapper.emitted().complete[0][0]).toBe(formattedToken);
204
+ expect(wrapper.emitted('input')[0][0]).toBe(formattedToken);
205
+ expect(wrapper.emitted('select')[0][0]).toBe(formattedToken);
206
+ expect(wrapper.emitted('complete')[0][0]).toBe(formattedToken);
207
207
  });
208
208
 
209
209
  it('selects suggestion on press Enter', () => {
@@ -106,7 +106,7 @@ describe('GlFormTextArea', () => {
106
106
  metaKey: true,
107
107
  });
108
108
 
109
- expect(wrapper.emitted().submit).toBe(undefined);
109
+ expect(wrapper.emitted('submit')).toBe(undefined);
110
110
  });
111
111
 
112
112
  it('should emit submit when cmd+enter is pressed', async () => {
@@ -116,7 +116,7 @@ describe('GlFormTextArea', () => {
116
116
  metaKey: true,
117
117
  });
118
118
 
119
- expect(wrapper.emitted().submit).toEqual([[]]);
119
+ expect(wrapper.emitted('submit')).toEqual([[]]);
120
120
  });
121
121
  });
122
122
  });
@@ -63,18 +63,18 @@ describe('Infinite Scroll component', () => {
63
63
  createComponent();
64
64
 
65
65
  return wrapper.vm.$nextTick(() => {
66
- expect(wrapper.emitted('bottomReached')).toBeFalsy();
67
- expect(wrapper.emitted('topReached')).toBeFalsy();
66
+ expect(wrapper.emitted('bottomReached')).toBe(undefined);
67
+ expect(wrapper.emitted('topReached')).toBe(undefined);
68
68
  });
69
69
  });
70
70
 
71
71
  it('emits bottomReached when scrolled to the bottom', () => {
72
72
  createComponent();
73
73
 
74
- expect(wrapper.emitted('bottomReached')).toBeFalsy();
74
+ expect(wrapper.emitted('bottomReached')).toBe(undefined);
75
75
 
76
76
  mockScrollTo({ top: INITIAL_HEIGHT - 0.5 });
77
- expect(wrapper.emitted('bottomReached')).toBeTruthy();
77
+ expect(wrapper.emitted('bottomReached')).toHaveLength(1);
78
78
  });
79
79
 
80
80
  it('emits topReached when scrolled to the top', () => {
@@ -82,10 +82,10 @@ describe('Infinite Scroll component', () => {
82
82
 
83
83
  createComponent();
84
84
 
85
- expect(wrapper.emitted('topReached')).toBeFalsy();
85
+ expect(wrapper.emitted('topReached')).toBe(undefined);
86
86
 
87
87
  mockScrollTo({ top: 0 });
88
- expect(wrapper.emitted('topReached')).toBeTruthy();
88
+ expect(wrapper.emitted('topReached')).toHaveLength(1);
89
89
  });
90
90
 
91
91
  it('scrolls to the bottom when `topReached` is defined', () => {
@@ -54,7 +54,7 @@ describe('Label component', () => {
54
54
  createComponent({ ...defaultProps, title: 'scoped::label' });
55
55
 
56
56
  expect(findTitle().text()).toEqual('scoped::label');
57
- expect(findSubTitle().exists()).toBeFalsy();
57
+ expect(findSubTitle().exists()).toBe(false);
58
58
  });
59
59
 
60
60
  it('renders a black label', () => {
@@ -127,7 +127,7 @@ describe('Label component', () => {
127
127
  createComponent(props, { mountFn: mount });
128
128
 
129
129
  findCloseButton().trigger('click');
130
- expect(wrapper.emitted().close).toBeTruthy();
130
+ expect(wrapper.emitted('close')).toHaveLength(1);
131
131
  });
132
132
 
133
133
  it('does not emit close when "x" is clicked when disabled', () => {
@@ -136,7 +136,7 @@ describe('Label component', () => {
136
136
  createComponent(props, { mountFn: mount });
137
137
 
138
138
  findCloseButton().trigger('click');
139
- expect(wrapper.emitted().close).toBeFalsy();
139
+ expect(wrapper.emitted('close')).toBe(undefined);
140
140
  });
141
141
  });
142
142
 
@@ -226,7 +226,7 @@ describe('Label component', () => {
226
226
  createComponent(props, { mountFn: mount });
227
227
 
228
228
  findCloseButton().trigger('click');
229
- expect(wrapper.emitted().close).toBeTruthy();
229
+ expect(wrapper.emitted('close')).toHaveLength(1);
230
230
  });
231
231
 
232
232
  it('does not emit close when "x" is clicked when disabled', () => {
@@ -235,7 +235,7 @@ describe('Label component', () => {
235
235
  createComponent(props, { mountFn: mount });
236
236
 
237
237
  findCloseButton().trigger('click');
238
- expect(wrapper.emitted().close).toBeFalsy();
238
+ expect(wrapper.emitted('close')).toBe(undefined);
239
239
  });
240
240
  });
241
241
 
@@ -260,6 +260,6 @@ describe('Modal component', () => {
260
260
 
261
261
  findModal().vm.$emit('change');
262
262
 
263
- expect(wrapper.emitted().change).toHaveLength(1);
263
+ expect(wrapper.emitted('change')).toHaveLength(1);
264
264
  });
265
265
  });
@@ -13,7 +13,7 @@ describe('GlNav', () => {
13
13
  },
14
14
  });
15
15
 
16
- expect(wrapper.findAllComponents(GlNavItem).exists()).toBeTruthy();
16
+ expect(wrapper.findAllComponents(GlNavItem).exists()).toBe(true);
17
17
  });
18
18
  });
19
19
  });
@@ -36,8 +36,8 @@ describe('GlNavItemDropdown', () => {
36
36
 
37
37
  const glIcon = wrapper.findComponent(GlIcon);
38
38
 
39
- expect(glIcon.exists()).toBeTruthy();
40
- expect(glIcon.classes('dropdown-chevron')).toBeTruthy();
39
+ expect(glIcon.exists()).toBe(true);
40
+ expect(glIcon.classes('dropdown-chevron')).toBe(true);
41
41
  });
42
42
 
43
43
  it('renders custom template', () => {
@@ -50,7 +50,7 @@ describe('GlNavItemDropdown', () => {
50
50
 
51
51
  const buttonContentSlot = wrapper.find('.foo');
52
52
 
53
- expect(buttonContentSlot.exists()).toBeTruthy();
53
+ expect(buttonContentSlot.exists()).toBe(true);
54
54
  expect(buttonContentSlot.text()).toBe('Custom button-content');
55
55
  });
56
56
  });
@@ -161,7 +161,7 @@ describe('Paginated List', () => {
161
161
  it('has search enabled by default', () => {
162
162
  createComponent();
163
163
 
164
- expect(wrapper.findComponent(GlSearchBoxByType).exists()).toBeTruthy();
164
+ expect(wrapper.findComponent(GlSearchBoxByType).exists()).toBe(true);
165
165
  });
166
166
 
167
167
  it('has search disabled when filterable prop set to false', () => {
@@ -63,7 +63,7 @@ describe('pagination component', () => {
63
63
  });
64
64
  await wrapper.vm.$nextTick();
65
65
 
66
- expect(wrapper.html()).toBeFalsy();
66
+ expect(wrapper.html()).toBe('');
67
67
  });
68
68
 
69
69
  it('supports slots customization', () => {
@@ -114,7 +114,7 @@ describe('pagination component', () => {
114
114
  const nextButton = buttons.at(buttons.length - 1);
115
115
  nextButton.trigger('click');
116
116
 
117
- expect(wrapper.emitted('input')).toBeTruthy();
117
+ expect(wrapper.emitted('input')).toHaveLength(1);
118
118
  expect(wrapper.emitted('input')[0]).toEqual([2]);
119
119
  });
120
120
 
@@ -33,7 +33,7 @@ describe('search box by click component', () => {
33
33
  wrapper.findComponent({ ref: 'input' }).vm.$emit('input', 'new value');
34
34
 
35
35
  await wrapper.vm.$nextTick();
36
- expect(wrapper.emitted().input).toEqual([['new value']]);
36
+ expect(wrapper.emitted('input')).toEqual([['new value']]);
37
37
  });
38
38
 
39
39
  it('does not emit an input event when input is updated to the same value', async () => {
@@ -41,7 +41,7 @@ describe('search box by click component', () => {
41
41
 
42
42
  await wrapper.setProps({ value: 'another value' });
43
43
 
44
- expect(wrapper.emitted().input).toBe(undefined);
44
+ expect(wrapper.emitted('input')).toBe(undefined);
45
45
  });
46
46
 
47
47
  it('does not displays history dropdown by default', () => {
@@ -70,7 +70,7 @@ describe('search box by click component', () => {
70
70
  findClearIcon().vm.$emit('click');
71
71
 
72
72
  await wrapper.vm.$nextTick();
73
- expect(wrapper.emitted().input).toEqual([['']]);
73
+ expect(wrapper.emitted('input')).toEqual([['']]);
74
74
  });
75
75
 
76
76
  it('emits clear event when clicked', async () => {
@@ -78,7 +78,7 @@ describe('search box by click component', () => {
78
78
  findClearIcon().vm.$emit('click');
79
79
  await wrapper.vm.$nextTick();
80
80
 
81
- expect(wrapper.emitted().clear).toHaveLength(1);
81
+ expect(wrapper.emitted('clear')).toHaveLength(1);
82
82
  });
83
83
  });
84
84
 
@@ -109,7 +109,7 @@ describe('search box by click component', () => {
109
109
  wrapper.findComponent(GlDropdownItem).vm.$emit('click');
110
110
 
111
111
  await wrapper.vm.$nextTick();
112
- expect(wrapper.emitted().input[0]).toEqual(['one']);
112
+ expect(wrapper.emitted('input')[0]).toEqual(['one']);
113
113
  expect(wrapper.emitted()['history-item-selected'][0]).toEqual(['one']);
114
114
  });
115
115
  });
@@ -149,7 +149,7 @@ describe('search box by click component', () => {
149
149
  wrapper.findComponent(GlFormInput).vm.$emit('keydown', { type: 'key', keyCode: 13 });
150
150
 
151
151
  await wrapper.vm.$nextTick();
152
- expect(wrapper.emitted().submit[0]).toEqual(['some-input']);
152
+ expect(wrapper.emitted('submit')[0]).toEqual(['some-input']);
153
153
  });
154
154
 
155
155
  it('emits submit event when search button is pressed', async () => {
@@ -157,7 +157,7 @@ describe('search box by click component', () => {
157
157
  findSearchButton().vm.$emit('click');
158
158
 
159
159
  await wrapper.vm.$nextTick();
160
- expect(wrapper.emitted().submit[0]).toEqual(['some-input']);
160
+ expect(wrapper.emitted('submit')[0]).toEqual(['some-input']);
161
161
  });
162
162
 
163
163
  it('adds `searchButtonAttributes` prop to search button', () => {
@@ -40,7 +40,7 @@ describe('search box by type component', () => {
40
40
  it('emits empty value when clicked', () => {
41
41
  findClearIcon().vm.$emit('click', { stopPropagation: jest.fn() });
42
42
 
43
- expect(wrapper.emitted().input).toEqual([['']]);
43
+ expect(wrapper.emitted('input')).toEqual([['']]);
44
44
  });
45
45
  });
46
46
 
@@ -59,7 +59,7 @@ describe('search box by type component', () => {
59
59
  it(`emits ${modelEvent} event when input value changes`, () => {
60
60
  findInput().setValue(newValue);
61
61
 
62
- expect(wrapper.emitted().input).toEqual([[newValue]]);
62
+ expect(wrapper.emitted('input')).toEqual([[newValue]]);
63
63
  });
64
64
  });
65
65