vue-instantsearch 4.10.1 → 4.10.3

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 (82) hide show
  1. package/package.json +8 -6
  2. package/src/__tests__/common.test.js +29 -0
  3. package/src/components/Breadcrumb.vue +10 -6
  4. package/src/components/__tests__/Breadcrumb.js +0 -104
  5. package/src/components/__tests__/__snapshots__/Breadcrumb.js.snap +5 -87
  6. package/src/util/__tests__/createServerRootMixin.test.js +57 -0
  7. package/src/util/createServerRootMixin.js +4 -0
  8. package/vue2/cjs/index.js +1 -1
  9. package/vue2/cjs/index.js.map +1 -1
  10. package/vue2/es/package.json.js +1 -1
  11. package/vue2/es/src/components/Breadcrumb.vue.js +1 -1
  12. package/vue2/es/src/util/createServerRootMixin.js +1 -1
  13. package/vue2/es/src/util/createServerRootMixin.js.map +1 -1
  14. package/vue2/umd/index.js +1 -1
  15. package/vue2/umd/index.js.map +1 -1
  16. package/vue3/cjs/index.js +1 -1
  17. package/vue3/cjs/index.js.map +1 -1
  18. package/vue3/es/package.json.js +1 -1
  19. package/vue3/es/src/components/Autocomplete.vue_vue&type=template&id=7ca53d64&lang.js +1 -1
  20. package/vue3/es/src/components/Autocomplete.vue_vue&type=template&id=7ca53d64&lang.js.map +1 -1
  21. package/vue3/es/src/components/Breadcrumb.vue.js +1 -1
  22. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js.map +1 -1
  23. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=136e0623&lang.js +2 -0
  24. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=136e0623&lang.js.map +1 -0
  25. package/vue3/es/src/components/ClearRefinements.vue_vue&type=template&id=1b5799b9&lang.js +1 -1
  26. package/vue3/es/src/components/ClearRefinements.vue_vue&type=template&id=1b5799b9&lang.js.map +1 -1
  27. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=template&id=6256a290&lang.js +1 -1
  28. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=template&id=6256a290&lang.js.map +1 -1
  29. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=3548a9a1&lang.js +1 -1
  30. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=3548a9a1&lang.js.map +1 -1
  31. package/vue3/es/src/components/HierarchicalMenuList.vue_vue&type=template&id=eb2af574&lang.js +1 -1
  32. package/vue3/es/src/components/HierarchicalMenuList.vue_vue&type=template&id=eb2af574&lang.js.map +1 -1
  33. package/vue3/es/src/components/Highlighter.vue_vue&type=template&id=11ec06d9&lang.js +1 -1
  34. package/vue3/es/src/components/Highlighter.vue_vue&type=template&id=11ec06d9&lang.js.map +1 -1
  35. package/vue3/es/src/components/Hits.vue_vue&type=template&id=d5fcff04&lang.js +1 -1
  36. package/vue3/es/src/components/Hits.vue_vue&type=template&id=d5fcff04&lang.js.map +1 -1
  37. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=654e3b4a&lang.js +1 -1
  38. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=654e3b4a&lang.js.map +1 -1
  39. package/vue3/es/src/components/InfiniteHits.vue_vue&type=template&id=0abcf352&lang.js +1 -1
  40. package/vue3/es/src/components/InfiniteHits.vue_vue&type=template&id=0abcf352&lang.js.map +1 -1
  41. package/vue3/es/src/components/Menu.vue_vue&type=template&id=577979d0&lang.js +1 -1
  42. package/vue3/es/src/components/Menu.vue_vue&type=template&id=577979d0&lang.js.map +1 -1
  43. package/vue3/es/src/components/MenuSelect.vue_vue&type=template&id=12bad393&lang.js +1 -1
  44. package/vue3/es/src/components/MenuSelect.vue_vue&type=template&id=12bad393&lang.js.map +1 -1
  45. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=ada9761c&lang.js +1 -1
  46. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=ada9761c&lang.js.map +1 -1
  47. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=455c122a&lang.js +1 -1
  48. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=455c122a&lang.js.map +1 -1
  49. package/vue3/es/src/components/Panel.vue_vue&type=template&id=766abb5d&lang.js +1 -1
  50. package/vue3/es/src/components/Panel.vue_vue&type=template&id=766abb5d&lang.js.map +1 -1
  51. package/vue3/es/src/components/PoweredBy.vue_vue&type=template&id=85db7eac&lang.js +1 -1
  52. package/vue3/es/src/components/PoweredBy.vue_vue&type=template&id=85db7eac&lang.js.map +1 -1
  53. package/vue3/es/src/components/QueryRuleCustomData.vue_vue&type=template&id=31c98630&lang.js +1 -1
  54. package/vue3/es/src/components/QueryRuleCustomData.vue_vue&type=template&id=31c98630&lang.js.map +1 -1
  55. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=2c7c21d8&lang.js +1 -1
  56. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=2c7c21d8&lang.js.map +1 -1
  57. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=0fb40347&lang.js +1 -1
  58. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=0fb40347&lang.js.map +1 -1
  59. package/vue3/es/src/components/RefinementList.vue_vue&type=template&id=00083417&lang.js +1 -1
  60. package/vue3/es/src/components/RefinementList.vue_vue&type=template&id=00083417&lang.js.map +1 -1
  61. package/vue3/es/src/components/RelevantSort.vue_vue&type=template&id=0d400606&lang.js +1 -1
  62. package/vue3/es/src/components/RelevantSort.vue_vue&type=template&id=0d400606&lang.js.map +1 -1
  63. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=30bd05ae&lang.js +1 -1
  64. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=30bd05ae&lang.js.map +1 -1
  65. package/vue3/es/src/components/SearchInput.vue_vue&type=template&id=00f0f603&lang.js +1 -1
  66. package/vue3/es/src/components/SearchInput.vue_vue&type=template&id=00f0f603&lang.js.map +1 -1
  67. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=6a94a4c1&lang.js +1 -1
  68. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=6a94a4c1&lang.js.map +1 -1
  69. package/vue3/es/src/components/StateResults.vue_vue&type=template&id=2ea5b184&lang.js +1 -1
  70. package/vue3/es/src/components/StateResults.vue_vue&type=template&id=2ea5b184&lang.js.map +1 -1
  71. package/vue3/es/src/components/Stats.vue_vue&type=template&id=05ff9d6a&lang.js +1 -1
  72. package/vue3/es/src/components/Stats.vue_vue&type=template&id=05ff9d6a&lang.js.map +1 -1
  73. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=461db228&lang.js +1 -1
  74. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=461db228&lang.js.map +1 -1
  75. package/vue3/es/src/components/VoiceSearch.vue_vue&type=template&id=1cf17560&lang.js +1 -1
  76. package/vue3/es/src/components/VoiceSearch.vue_vue&type=template&id=1cf17560&lang.js.map +1 -1
  77. package/vue3/es/src/util/createServerRootMixin.js +1 -1
  78. package/vue3/es/src/util/createServerRootMixin.js.map +1 -1
  79. package/vue3/umd/index.js +1 -1
  80. package/vue3/umd/index.js.map +1 -1
  81. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=5374ac81&lang.js +0 -2
  82. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=5374ac81&lang.js.map +0 -1
package/package.json CHANGED
@@ -16,7 +16,7 @@
16
16
  "autocomplete"
17
17
  ],
18
18
  "license": "MIT",
19
- "version": "4.10.1",
19
+ "version": "4.10.3",
20
20
  "files": [
21
21
  "vue2",
22
22
  "vue3",
@@ -35,7 +35,7 @@
35
35
  "test:exports:vue3": "node ./test/module/vue3/is-es-module.mjs && node ./test/module/vue3/is-cjs-module.cjs"
36
36
  },
37
37
  "dependencies": {
38
- "instantsearch.js": "4.56.1",
38
+ "instantsearch.js": "4.56.3",
39
39
  "mitt": "^2.1.0"
40
40
  },
41
41
  "peerDependencies": {
@@ -55,12 +55,12 @@
55
55
  "devDependencies": {
56
56
  "@babel/core": "7.15.5",
57
57
  "@storybook/vue": "5.3.9",
58
- "@vue/compiler-sfc": "3.1.2",
59
- "@vue/server-renderer": "3.1.2",
58
+ "@vue/compiler-sfc": "3.2.47",
59
+ "@vue/server-renderer": "3.2.47",
60
60
  "@vue/test-utils": "1.3.0",
61
61
  "@vue/test-utils2": "npm:@vue/test-utils@2.0.0-rc.11",
62
62
  "algoliasearch": "4.14.3",
63
- "algoliasearch-helper": "3.13.0",
63
+ "algoliasearch-helper": "3.13.2",
64
64
  "instantsearch.css": "8.0.0",
65
65
  "rollup": "1.32.1",
66
66
  "rollup-plugin-babel": "4.4.0",
@@ -75,6 +75,8 @@
75
75
  "rollup-plugin-vue3": "npm:rollup-plugin-vue@6.0.0",
76
76
  "vue": "2.7.14",
77
77
  "vue-autosuggest": "1.8.1",
78
+ "vue-i18n": "8.24.4",
79
+ "vue-i18n-vue3": "npm:vue-i18n@^9.2.2",
78
80
  "vue-loader": "14.2.2",
79
81
  "vue-router": "3.4.3",
80
82
  "vue-router4": "npm:vue-router@4.0.0",
@@ -85,5 +87,5 @@
85
87
  "vuex": "3.5.1",
86
88
  "vuex4": "npm:vuex@4.0.0"
87
89
  },
88
- "gitHead": "f224d502edb8cf119213cb9cd6e557dc03180521"
90
+ "gitHead": "f550379829306217e021fd9c538ec4ebd0153b19"
89
91
  }
@@ -10,6 +10,7 @@ import {
10
10
  createInfiniteHitsTests,
11
11
  createHitsTests,
12
12
  createRangeInputTests,
13
+ createInstantSearchTests,
13
14
  } from '@instantsearch/tests';
14
15
 
15
16
  import { nextTick, mountApp } from '../../test/utils';
@@ -77,8 +78,11 @@ createHierarchicalMenuTests(async ({ instantSearchOptions, widgetParams }) => {
77
78
  });
78
79
 
79
80
  createBreadcrumbTests(async ({ instantSearchOptions, widgetParams }) => {
81
+ // The passed `transformItems` prop is meant to apply only to the breadcrumb,
82
+ // not the hierarchical menu
80
83
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
81
84
  const { transformItems, ...hierarchicalWidgetParams } = widgetParams;
85
+
82
86
  mountApp(
83
87
  {
84
88
  render: renderCompat((h) =>
@@ -298,3 +302,28 @@ createRangeInputTests(async ({ instantSearchOptions, widgetParams }) => {
298
302
 
299
303
  await nextTick();
300
304
  });
305
+
306
+ createInstantSearchTests(({ instantSearchOptions }) => {
307
+ mountApp(
308
+ {
309
+ render: renderCompat((h) =>
310
+ h(AisInstantSearch, { props: instantSearchOptions }, [
311
+ h(GlobalErrorSwallower),
312
+ ])
313
+ ),
314
+ },
315
+ document.body.appendChild(document.createElement('div'))
316
+ );
317
+
318
+ return {
319
+ algoliaAgents: [
320
+ `instantsearch.js (${
321
+ require('../../../instantsearch.js/package.json').version
322
+ })`,
323
+ `Vue InstantSearch (${
324
+ require('../../../vue-instantsearch/package.json').version
325
+ })`,
326
+ `Vue (${require('../util/vue-compat').version})`,
327
+ ],
328
+ };
329
+ });
@@ -24,9 +24,14 @@
24
24
  >
25
25
  <slot name="rootLabel">Home</slot>
26
26
  </a>
27
- <span v-else>
27
+ <a
28
+ v-else
29
+ :href="state.createURL(null)"
30
+ :class="suit('link')"
31
+ @click.prevent="state.refine(null)"
32
+ >
28
33
  <slot name="rootLabel">Home</slot>
29
- </span>
34
+ </a>
30
35
  </li>
31
36
  <li
32
37
  v-for="(item, index) in state.items"
@@ -34,16 +39,15 @@
34
39
  :class="[suit('item'), isLastItem(index) && suit('item', 'selected')]"
35
40
  >
36
41
  <span :class="suit('separator')" aria-hidden="true">
37
- <slot name="separator">></slot>
38
- </span>
39
- <a
42
+ <slot name="separator">></slot> </span
43
+ ><a
40
44
  v-if="!isLastItem(index)"
41
45
  :href="state.createURL(item.value)"
42
46
  :class="suit('link')"
43
47
  @click.prevent="state.refine(item.value)"
44
48
  >{{ item.label }}</a
45
49
  >
46
- <span v-else>{{ item.label }}</span>
50
+ <template v-else>{{ item.label }}</template>
47
51
  </li>
48
52
  </ul>
49
53
  </slot>
@@ -32,111 +32,7 @@ const defaultProps = {
32
32
  attributes: ['categories.lvl0', 'categories.lvl1'],
33
33
  };
34
34
 
35
- it('accepts an attribute prop', () => {
36
- __setState({
37
- ...defaultState,
38
- });
39
-
40
- const wrapper = mount(Breadcrumb, {
41
- propsData: defaultProps,
42
- });
43
-
44
- expect(wrapper.vm.widgetParams.attributes).toEqual([
45
- 'categories.lvl0',
46
- 'categories.lvl1',
47
- ]);
48
- });
49
-
50
- it('accepts a separator prop', () => {
51
- __setState({
52
- ...defaultState,
53
- });
54
-
55
- const wrapper = mount(Breadcrumb, {
56
- propsData: {
57
- ...defaultProps,
58
- separator: ' ~ ',
59
- },
60
- });
61
-
62
- expect(wrapper.vm.widgetParams.separator).toBe(' ~ ');
63
- });
64
-
65
- it('accepts a rootPath prop', () => {
66
- __setState({
67
- ...defaultState,
68
- });
69
-
70
- const wrapper = mount(Breadcrumb, {
71
- propsData: {
72
- ...defaultProps,
73
- rootPath: 'TV & Home Theater',
74
- },
75
- });
76
-
77
- expect(wrapper.vm.widgetParams.rootPath).toBe('TV & Home Theater');
78
- });
79
-
80
- it('accepts a transformItems prop', () => {
81
- __setState({
82
- ...defaultState,
83
- });
84
-
85
- const transformItems = () => {};
86
-
87
- const wrapper = mount(Breadcrumb, {
88
- propsData: {
89
- ...defaultProps,
90
- transformItems,
91
- },
92
- });
93
-
94
- expect(wrapper.vm.widgetParams.transformItems).toBe(transformItems);
95
- });
96
-
97
35
  describe('default render', () => {
98
- it('renders correctly', () => {
99
- __setState({ ...defaultState });
100
-
101
- const wrapper = mount(Breadcrumb, {
102
- propsData: defaultProps,
103
- });
104
-
105
- expect(wrapper.html()).toMatchSnapshot();
106
- });
107
-
108
- it('renders correctly without refinement', () => {
109
- __setState({
110
- ...defaultState,
111
- items: [],
112
- canRefine: false,
113
- });
114
-
115
- const wrapper = mount(Breadcrumb, {
116
- propsData: defaultProps,
117
- });
118
-
119
- const selected = wrapper.find('.ais-Breadcrumb-item--selected');
120
-
121
- expect(selected.text()).toContain('Home');
122
- expect(wrapper.html()).toMatchSnapshot();
123
- });
124
-
125
- it('renders correctly with a selected item', () => {
126
- __setState({
127
- ...defaultState,
128
- });
129
-
130
- const wrapper = mount(Breadcrumb, {
131
- propsData: defaultProps,
132
- });
133
-
134
- const selected = wrapper.find('.ais-Breadcrumb-item--selected');
135
-
136
- expect(selected.text()).toContain('Streaming Media Players');
137
- expect(wrapper.html()).toMatchSnapshot();
138
- });
139
-
140
36
  it('renders correctly with an URL for the href', () => {
141
37
  __setState({
142
38
  ...defaultState,
@@ -65,9 +65,7 @@ exports[`custom rootLabel render renders correctly 1`] = `
65
65
  >
66
66
  &gt;
67
67
  </span>
68
- <span>
69
- Streaming Media Players
70
- </span>
68
+ Streaming Media Players
71
69
  </li>
72
70
  </ul>
73
71
  </div>
@@ -77,9 +75,9 @@ exports[`custom rootLabel render renders correctly without refinement 1`] = `
77
75
  <div class="ais-Breadcrumb ais-Breadcrumb--noRefinement">
78
76
  <ul class="ais-Breadcrumb-list">
79
77
  <li class="ais-Breadcrumb-item ais-Breadcrumb-item--selected">
80
- <span>
78
+ <a class="ais-Breadcrumb-link">
81
79
  Home page
82
- </span>
80
+ </a>
83
81
  </li>
84
82
  </ul>
85
83
  </div>
@@ -109,73 +107,7 @@ exports[`custom separator render renders correctly 1`] = `
109
107
  >
110
108
  ~~
111
109
  </span>
112
- <span>
113
- Streaming Media Players
114
- </span>
115
- </li>
116
- </ul>
117
- </div>
118
- `;
119
-
120
- exports[`default render renders correctly 1`] = `
121
- <div class="ais-Breadcrumb">
122
- <ul class="ais-Breadcrumb-list">
123
- <li class="ais-Breadcrumb-item">
124
- <a class="ais-Breadcrumb-link">
125
- Home
126
- </a>
127
- </li>
128
- <li class="ais-Breadcrumb-item">
129
- <span aria-hidden="true"
130
- class="ais-Breadcrumb-separator"
131
- >
132
- &gt;
133
- </span>
134
- <a class="ais-Breadcrumb-link">
135
- TV &amp; Home Theater
136
- </a>
137
- </li>
138
- <li class="ais-Breadcrumb-item ais-Breadcrumb-item--selected">
139
- <span aria-hidden="true"
140
- class="ais-Breadcrumb-separator"
141
- >
142
- &gt;
143
- </span>
144
- <span>
145
- Streaming Media Players
146
- </span>
147
- </li>
148
- </ul>
149
- </div>
150
- `;
151
-
152
- exports[`default render renders correctly with a selected item 1`] = `
153
- <div class="ais-Breadcrumb">
154
- <ul class="ais-Breadcrumb-list">
155
- <li class="ais-Breadcrumb-item">
156
- <a class="ais-Breadcrumb-link">
157
- Home
158
- </a>
159
- </li>
160
- <li class="ais-Breadcrumb-item">
161
- <span aria-hidden="true"
162
- class="ais-Breadcrumb-separator"
163
- >
164
- &gt;
165
- </span>
166
- <a class="ais-Breadcrumb-link">
167
- TV &amp; Home Theater
168
- </a>
169
- </li>
170
- <li class="ais-Breadcrumb-item ais-Breadcrumb-item--selected">
171
- <span aria-hidden="true"
172
- class="ais-Breadcrumb-separator"
173
- >
174
- &gt;
175
- </span>
176
- <span>
177
- Streaming Media Players
178
- </span>
110
+ Streaming Media Players
179
111
  </li>
180
112
  </ul>
181
113
  </div>
@@ -209,21 +141,7 @@ exports[`default render renders correctly with an URL for the href 1`] = `
209
141
  >
210
142
  &gt;
211
143
  </span>
212
- <span>
213
- Streaming Media Players
214
- </span>
215
- </li>
216
- </ul>
217
- </div>
218
- `;
219
-
220
- exports[`default render renders correctly without refinement 1`] = `
221
- <div class="ais-Breadcrumb ais-Breadcrumb--noRefinement">
222
- <ul class="ais-Breadcrumb-list">
223
- <li class="ais-Breadcrumb-item ais-Breadcrumb-item--selected">
224
- <span>
225
- Home
226
- </span>
144
+ Streaming Media Players
227
145
  </li>
228
146
  </ul>
229
147
  </div>
@@ -21,6 +21,8 @@ import {
21
21
  SearchParameters,
22
22
  SearchResults,
23
23
  } from 'algoliasearch-helper';
24
+ import { createI18n } from 'vue-i18n-vue3';
25
+ import VueI18n from 'vue-i18n';
24
26
 
25
27
  jest.unmock('instantsearch.js/es');
26
28
 
@@ -489,6 +491,61 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/instantsear
489
491
  await renderToString(wrapper);
490
492
  });
491
493
 
494
+ it('forwards i18n', async () => {
495
+ const searchClient = createFakeClient();
496
+
497
+ if (isVue2) {
498
+ Vue2.use(VueI18n);
499
+ }
500
+
501
+ const i18n = isVue3 ? createI18n() : new VueI18n();
502
+
503
+ // there are two renders of App, each with an assertion
504
+ expect.assertions(2);
505
+
506
+ const App = {
507
+ mixins: [
508
+ forceIsServerMixin,
509
+ createServerRootMixin({
510
+ searchClient,
511
+ indexName: 'hello',
512
+ }),
513
+ ],
514
+ data() {
515
+ expect(this.$i18n).toBe(isVue3 ? i18n.global : i18n);
516
+ return {};
517
+ },
518
+ render: renderCompat((h) =>
519
+ h(InstantSearchSsr, {}, [
520
+ h(Configure, {
521
+ attrs: {
522
+ hitsPerPage: 100,
523
+ },
524
+ }),
525
+ h(SearchBox),
526
+ ])
527
+ ),
528
+ serverPrefetch() {
529
+ return this.instantsearch.findResultsState({
530
+ component: this,
531
+ renderToString,
532
+ });
533
+ },
534
+ };
535
+
536
+ const wrapper = createSSRApp({
537
+ mixins: [forceIsServerMixin],
538
+ ...(isVue2 ? { i18n } : {}),
539
+ render: renderCompat((h) => h(App)),
540
+ });
541
+
542
+ if (isVue3) {
543
+ wrapper.use(i18n);
544
+ }
545
+
546
+ await renderToString(wrapper);
547
+ });
548
+
492
549
  if (isVue2) {
493
550
  it('forwards props', async () => {
494
551
  const searchClient = createFakeClient();
@@ -26,10 +26,14 @@ function defaultCloneComponent(componentInstance, { mixins = [] } = {}) {
26
26
  if (componentInstance.$store) {
27
27
  app.use(componentInstance.$store);
28
28
  }
29
+ if (componentInstance.$i18n) {
30
+ app.use(componentInstance.$i18n);
31
+ }
29
32
  } else {
30
33
  // copy over global Vue APIs
31
34
  options.router = componentInstance.$router;
32
35
  options.store = componentInstance.$store;
36
+ options.i18n = componentInstance.$i18n;
33
37
 
34
38
  const Extended = componentInstance.$vnode
35
39
  ? componentInstance.$vnode.componentOptions.Ctor.extend(options)