vue-instantsearch 4.10.0 → 4.10.2

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 (94) hide show
  1. package/package.json +7 -5
  2. package/src/__tests__/common.test.js +26 -0
  3. package/src/components/Breadcrumb.vue +10 -6
  4. package/src/components/Hits.vue +1 -0
  5. package/src/components/InfiniteHits.vue +1 -0
  6. package/src/components/__tests__/Breadcrumb.js +0 -27
  7. package/src/components/__tests__/__snapshots__/Breadcrumb.js.snap +6 -58
  8. package/src/util/__tests__/createServerRootMixin.test.js +57 -0
  9. package/src/util/createServerRootMixin.js +4 -0
  10. package/vue2/cjs/index.js +1 -1
  11. package/vue2/cjs/index.js.map +1 -1
  12. package/vue2/es/package.json.js +1 -1
  13. package/vue2/es/src/components/Breadcrumb.vue.js +1 -1
  14. package/vue2/es/src/components/Hits.vue.js +1 -1
  15. package/vue2/es/src/components/InfiniteHits.vue.js +1 -1
  16. package/vue2/es/src/util/createServerRootMixin.js +1 -1
  17. package/vue2/es/src/util/createServerRootMixin.js.map +1 -1
  18. package/vue2/umd/index.js +1 -1
  19. package/vue2/umd/index.js.map +1 -1
  20. package/vue3/cjs/index.js +1 -1
  21. package/vue3/cjs/index.js.map +1 -1
  22. package/vue3/es/package.json.js +1 -1
  23. package/vue3/es/src/components/Autocomplete.vue_vue&type=template&id=7ca53d64&lang.js +1 -1
  24. package/vue3/es/src/components/Autocomplete.vue_vue&type=template&id=7ca53d64&lang.js.map +1 -1
  25. package/vue3/es/src/components/Breadcrumb.vue.js +1 -1
  26. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js.map +1 -1
  27. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=136e0623&lang.js +2 -0
  28. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=136e0623&lang.js.map +1 -0
  29. package/vue3/es/src/components/ClearRefinements.vue_vue&type=template&id=1b5799b9&lang.js +1 -1
  30. package/vue3/es/src/components/ClearRefinements.vue_vue&type=template&id=1b5799b9&lang.js.map +1 -1
  31. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=template&id=6256a290&lang.js +1 -1
  32. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=template&id=6256a290&lang.js.map +1 -1
  33. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=3548a9a1&lang.js +1 -1
  34. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=3548a9a1&lang.js.map +1 -1
  35. package/vue3/es/src/components/HierarchicalMenuList.vue_vue&type=template&id=eb2af574&lang.js +1 -1
  36. package/vue3/es/src/components/HierarchicalMenuList.vue_vue&type=template&id=eb2af574&lang.js.map +1 -1
  37. package/vue3/es/src/components/Highlighter.vue_vue&type=template&id=11ec06d9&lang.js +1 -1
  38. package/vue3/es/src/components/Highlighter.vue_vue&type=template&id=11ec06d9&lang.js.map +1 -1
  39. package/vue3/es/src/components/Hits.vue.js +1 -1
  40. package/vue3/es/src/components/Hits.vue_vue&type=script&lang.js.map +1 -1
  41. package/vue3/es/src/components/Hits.vue_vue&type=template&id=d5fcff04&lang.js +2 -0
  42. package/vue3/es/src/components/Hits.vue_vue&type=template&id=d5fcff04&lang.js.map +1 -0
  43. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=654e3b4a&lang.js +1 -1
  44. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=654e3b4a&lang.js.map +1 -1
  45. package/vue3/es/src/components/InfiniteHits.vue.js +1 -1
  46. package/vue3/es/src/components/InfiniteHits.vue_vue&type=script&lang.js.map +1 -1
  47. package/vue3/es/src/components/InfiniteHits.vue_vue&type=template&id=0abcf352&lang.js +2 -0
  48. package/vue3/es/src/components/InfiniteHits.vue_vue&type=template&id=0abcf352&lang.js.map +1 -0
  49. package/vue3/es/src/components/Menu.vue_vue&type=template&id=577979d0&lang.js +1 -1
  50. package/vue3/es/src/components/Menu.vue_vue&type=template&id=577979d0&lang.js.map +1 -1
  51. package/vue3/es/src/components/MenuSelect.vue_vue&type=template&id=12bad393&lang.js +1 -1
  52. package/vue3/es/src/components/MenuSelect.vue_vue&type=template&id=12bad393&lang.js.map +1 -1
  53. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=ada9761c&lang.js +1 -1
  54. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=ada9761c&lang.js.map +1 -1
  55. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=455c122a&lang.js +1 -1
  56. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=455c122a&lang.js.map +1 -1
  57. package/vue3/es/src/components/Panel.vue_vue&type=template&id=766abb5d&lang.js +1 -1
  58. package/vue3/es/src/components/Panel.vue_vue&type=template&id=766abb5d&lang.js.map +1 -1
  59. package/vue3/es/src/components/PoweredBy.vue_vue&type=template&id=85db7eac&lang.js +1 -1
  60. package/vue3/es/src/components/PoweredBy.vue_vue&type=template&id=85db7eac&lang.js.map +1 -1
  61. package/vue3/es/src/components/QueryRuleCustomData.vue_vue&type=template&id=31c98630&lang.js +1 -1
  62. package/vue3/es/src/components/QueryRuleCustomData.vue_vue&type=template&id=31c98630&lang.js.map +1 -1
  63. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=2c7c21d8&lang.js +1 -1
  64. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=2c7c21d8&lang.js.map +1 -1
  65. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=0fb40347&lang.js +1 -1
  66. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=0fb40347&lang.js.map +1 -1
  67. package/vue3/es/src/components/RefinementList.vue_vue&type=template&id=00083417&lang.js +1 -1
  68. package/vue3/es/src/components/RefinementList.vue_vue&type=template&id=00083417&lang.js.map +1 -1
  69. package/vue3/es/src/components/RelevantSort.vue_vue&type=template&id=0d400606&lang.js +1 -1
  70. package/vue3/es/src/components/RelevantSort.vue_vue&type=template&id=0d400606&lang.js.map +1 -1
  71. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=30bd05ae&lang.js +1 -1
  72. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=30bd05ae&lang.js.map +1 -1
  73. package/vue3/es/src/components/SearchInput.vue_vue&type=template&id=00f0f603&lang.js +1 -1
  74. package/vue3/es/src/components/SearchInput.vue_vue&type=template&id=00f0f603&lang.js.map +1 -1
  75. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=6a94a4c1&lang.js +1 -1
  76. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=6a94a4c1&lang.js.map +1 -1
  77. package/vue3/es/src/components/StateResults.vue_vue&type=template&id=2ea5b184&lang.js +1 -1
  78. package/vue3/es/src/components/StateResults.vue_vue&type=template&id=2ea5b184&lang.js.map +1 -1
  79. package/vue3/es/src/components/Stats.vue_vue&type=template&id=05ff9d6a&lang.js +1 -1
  80. package/vue3/es/src/components/Stats.vue_vue&type=template&id=05ff9d6a&lang.js.map +1 -1
  81. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=461db228&lang.js +1 -1
  82. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=461db228&lang.js.map +1 -1
  83. package/vue3/es/src/components/VoiceSearch.vue_vue&type=template&id=1cf17560&lang.js +1 -1
  84. package/vue3/es/src/components/VoiceSearch.vue_vue&type=template&id=1cf17560&lang.js.map +1 -1
  85. package/vue3/es/src/util/createServerRootMixin.js +1 -1
  86. package/vue3/es/src/util/createServerRootMixin.js.map +1 -1
  87. package/vue3/umd/index.js +1 -1
  88. package/vue3/umd/index.js.map +1 -1
  89. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=5374ac81&lang.js +0 -2
  90. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=5374ac81&lang.js.map +0 -1
  91. package/vue3/es/src/components/Hits.vue_vue&type=template&id=19b8dc8f&lang.js +0 -2
  92. package/vue3/es/src/components/Hits.vue_vue&type=template&id=19b8dc8f&lang.js.map +0 -1
  93. package/vue3/es/src/components/InfiniteHits.vue_vue&type=template&id=09224cc0&lang.js +0 -2
  94. package/vue3/es/src/components/InfiniteHits.vue_vue&type=template&id=09224cc0&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.0",
19
+ "version": "4.10.2",
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.0",
38
+ "instantsearch.js": "4.56.2",
39
39
  "mitt": "^2.1.0"
40
40
  },
41
41
  "peerDependencies": {
@@ -55,8 +55,8 @@
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",
@@ -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": "ea054eab1484a3d167db83bc768f6ea134add5f9"
90
+ "gitHead": "aa19955aae2c79b93d5f952832d366e8abff9886"
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';
@@ -298,3 +299,28 @@ createRangeInputTests(async ({ instantSearchOptions, widgetParams }) => {
298
299
 
299
300
  await nextTick();
300
301
  });
302
+
303
+ createInstantSearchTests(({ instantSearchOptions }) => {
304
+ mountApp(
305
+ {
306
+ render: renderCompat((h) =>
307
+ h(AisInstantSearch, { props: instantSearchOptions }, [
308
+ h(GlobalErrorSwallower),
309
+ ])
310
+ ),
311
+ },
312
+ document.body.appendChild(document.createElement('div'))
313
+ );
314
+
315
+ return {
316
+ algoliaAgents: [
317
+ `instantsearch.js (${
318
+ require('../../../instantsearch.js/package.json').version
319
+ })`,
320
+ `Vue InstantSearch (${
321
+ require('../../../vue-instantsearch/package.json').version
322
+ })`,
323
+ `Vue (${require('../util/vue-compat').version})`,
324
+ ],
325
+ };
326
+ });
@@ -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>
@@ -11,6 +11,7 @@
11
11
  :key="item.objectID"
12
12
  :class="suit('item')"
13
13
  @click="state.sendEvent('click:internal', item, 'Hit Clicked')"
14
+ @auxclick="state.sendEvent('click:internal', item, 'Hit Clicked')"
14
15
  >
15
16
  <slot
16
17
  name="item"
@@ -35,6 +35,7 @@
35
35
  :class="suit('item')"
36
36
  :key="item.objectID"
37
37
  @click="state.sendEvent('click:internal', item, 'Hit Clicked')"
38
+ @auxclick="state.sendEvent('click:internal', item, 'Hit Clicked')"
38
39
  >
39
40
  <slot
40
41
  name="item"
@@ -95,33 +95,6 @@ it('accepts a transformItems prop', () => {
95
95
  });
96
96
 
97
97
  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
98
  it('renders correctly with a selected item', () => {
126
99
  __setState({
127
100
  ...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,41 +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>
110
+ Streaming Media Players
147
111
  </li>
148
112
  </ul>
149
113
  </div>
@@ -173,9 +137,7 @@ exports[`default render renders correctly with a selected item 1`] = `
173
137
  >
174
138
  &gt;
175
139
  </span>
176
- <span>
177
- Streaming Media Players
178
- </span>
140
+ Streaming Media Players
179
141
  </li>
180
142
  </ul>
181
143
  </div>
@@ -209,21 +171,7 @@ exports[`default render renders correctly with an URL for the href 1`] = `
209
171
  >
210
172
  &gt;
211
173
  </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>
174
+ Streaming Media Players
227
175
  </li>
228
176
  </ul>
229
177
  </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)