vue-instantsearch 4.3.3 → 4.4.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 (199) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/package.json +5 -5
  3. package/src/__tests__/index.js +133 -26
  4. package/src/components/Autocomplete.vue +8 -1
  5. package/src/components/Breadcrumb.vue +8 -1
  6. package/src/components/ClearRefinements.vue +8 -1
  7. package/src/components/Configure.js +8 -1
  8. package/src/components/ConfigureRelatedItems.js +8 -1
  9. package/src/components/CurrentRefinements.vue +8 -1
  10. package/src/components/DynamicWidgets.js +8 -1
  11. package/src/components/HierarchicalMenu.vue +8 -1
  12. package/src/components/Hits.vue +8 -1
  13. package/src/components/HitsPerPage.vue +8 -1
  14. package/src/components/Index.js +6 -1
  15. package/src/components/InfiniteHits.vue +8 -1
  16. package/src/components/Menu.vue +6 -1
  17. package/src/components/MenuSelect.vue +6 -1
  18. package/src/components/NumericMenu.vue +8 -1
  19. package/src/components/Pagination.vue +9 -1
  20. package/src/components/QueryRuleContext.js +8 -3
  21. package/src/components/QueryRuleCustomData.vue +8 -3
  22. package/src/components/RangeInput.vue +8 -1
  23. package/src/components/RatingMenu.vue +8 -1
  24. package/src/components/RefinementList.vue +8 -1
  25. package/src/components/RelevantSort.vue +8 -1
  26. package/src/components/SearchBox.vue +26 -1
  27. package/src/components/SearchInput.vue +3 -0
  28. package/src/components/SortBy.vue +6 -1
  29. package/src/components/StateResults.vue +8 -1
  30. package/src/components/Stats.vue +6 -1
  31. package/src/components/ToggleRefinement.vue +8 -1
  32. package/src/components/VoiceSearch.vue +18 -1
  33. package/src/components/__tests__/SearchBox.js +15 -0
  34. package/src/components/__tests__/__snapshots__/Pagination.js.snap +21 -21
  35. package/src/mixins/__tests__/widget.test.js +102 -0
  36. package/src/mixins/widget.js +13 -3
  37. package/src/util/__tests__/createServerRootMixin.test.js +3 -2
  38. package/src/util/createServerRootMixin.js +1 -1
  39. package/vue2/cjs/index.js +1 -1
  40. package/vue2/cjs/index.js.map +1 -1
  41. package/vue2/es/package.json.js +1 -1
  42. package/vue2/es/src/components/Autocomplete.vue.js +1 -1
  43. package/vue2/es/src/components/Autocomplete.vue.js.map +1 -1
  44. package/vue2/es/src/components/Breadcrumb.vue.js +1 -1
  45. package/vue2/es/src/components/Breadcrumb.vue.js.map +1 -1
  46. package/vue2/es/src/components/ClearRefinements.vue.js +1 -1
  47. package/vue2/es/src/components/ClearRefinements.vue.js.map +1 -1
  48. package/vue2/es/src/components/Configure.js +1 -1
  49. package/vue2/es/src/components/Configure.js.map +1 -1
  50. package/vue2/es/src/components/ConfigureRelatedItems.js +1 -1
  51. package/vue2/es/src/components/ConfigureRelatedItems.js.map +1 -1
  52. package/vue2/es/src/components/CurrentRefinements.vue.js +1 -1
  53. package/vue2/es/src/components/CurrentRefinements.vue.js.map +1 -1
  54. package/vue2/es/src/components/DynamicWidgets.js +1 -1
  55. package/vue2/es/src/components/DynamicWidgets.js.map +1 -1
  56. package/vue2/es/src/components/HierarchicalMenu.vue.js +1 -1
  57. package/vue2/es/src/components/HierarchicalMenu.vue.js.map +1 -1
  58. package/vue2/es/src/components/Hits.vue.js +1 -1
  59. package/vue2/es/src/components/Hits.vue.js.map +1 -1
  60. package/vue2/es/src/components/HitsPerPage.vue.js +1 -1
  61. package/vue2/es/src/components/HitsPerPage.vue.js.map +1 -1
  62. package/vue2/es/src/components/Index.js +1 -1
  63. package/vue2/es/src/components/Index.js.map +1 -1
  64. package/vue2/es/src/components/InfiniteHits.vue.js +1 -1
  65. package/vue2/es/src/components/InfiniteHits.vue.js.map +1 -1
  66. package/vue2/es/src/components/Menu.vue.js +1 -1
  67. package/vue2/es/src/components/Menu.vue.js.map +1 -1
  68. package/vue2/es/src/components/MenuSelect.vue.js +1 -1
  69. package/vue2/es/src/components/MenuSelect.vue.js.map +1 -1
  70. package/vue2/es/src/components/NumericMenu.vue.js +1 -1
  71. package/vue2/es/src/components/NumericMenu.vue.js.map +1 -1
  72. package/vue2/es/src/components/Pagination.vue.js +1 -1
  73. package/vue2/es/src/components/Pagination.vue.js.map +1 -1
  74. package/vue2/es/src/components/QueryRuleContext.js +1 -1
  75. package/vue2/es/src/components/QueryRuleContext.js.map +1 -1
  76. package/vue2/es/src/components/QueryRuleCustomData.vue.js +1 -1
  77. package/vue2/es/src/components/QueryRuleCustomData.vue.js.map +1 -1
  78. package/vue2/es/src/components/RangeInput.vue.js +1 -1
  79. package/vue2/es/src/components/RangeInput.vue.js.map +1 -1
  80. package/vue2/es/src/components/RatingMenu.vue.js +1 -1
  81. package/vue2/es/src/components/RatingMenu.vue.js.map +1 -1
  82. package/vue2/es/src/components/RefinementList.vue.js +1 -1
  83. package/vue2/es/src/components/RefinementList.vue.js.map +1 -1
  84. package/vue2/es/src/components/RelevantSort.vue.js +1 -1
  85. package/vue2/es/src/components/RelevantSort.vue.js.map +1 -1
  86. package/vue2/es/src/components/SearchBox.vue.js +1 -1
  87. package/vue2/es/src/components/SearchBox.vue.js.map +1 -1
  88. package/vue2/es/src/components/SearchInput.vue.js +1 -1
  89. package/vue2/es/src/components/SearchInput.vue.js.map +1 -1
  90. package/vue2/es/src/components/SortBy.vue.js +1 -1
  91. package/vue2/es/src/components/SortBy.vue.js.map +1 -1
  92. package/vue2/es/src/components/StateResults.vue.js +1 -1
  93. package/vue2/es/src/components/StateResults.vue.js.map +1 -1
  94. package/vue2/es/src/components/Stats.vue.js +1 -1
  95. package/vue2/es/src/components/Stats.vue.js.map +1 -1
  96. package/vue2/es/src/components/ToggleRefinement.vue.js +1 -1
  97. package/vue2/es/src/components/ToggleRefinement.vue.js.map +1 -1
  98. package/vue2/es/src/components/VoiceSearch.vue.js +1 -1
  99. package/vue2/es/src/components/VoiceSearch.vue.js.map +1 -1
  100. package/vue2/es/src/mixins/widget.js +1 -1
  101. package/vue2/es/src/mixins/widget.js.map +1 -1
  102. package/vue2/es/src/util/createInstantSearchComponent.js +1 -1
  103. package/vue2/es/src/util/createServerRootMixin.js.map +1 -1
  104. package/vue2/umd/index.js +1 -1
  105. package/vue2/umd/index.js.map +1 -1
  106. package/vue3/cjs/index.js +1 -1
  107. package/vue3/cjs/index.js.map +1 -1
  108. package/vue3/es/package.json.js +1 -1
  109. package/vue3/es/src/components/Autocomplete.vue_vue&type=script&lang.js +1 -1
  110. package/vue3/es/src/components/Autocomplete.vue_vue&type=script&lang.js.map +1 -1
  111. package/vue3/es/src/components/Autocomplete.vue_vue&type=template&id=e7c95fd0&lang.js.map +1 -1
  112. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js +1 -1
  113. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js.map +1 -1
  114. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=6f46de9a&lang.js.map +1 -1
  115. package/vue3/es/src/components/ClearRefinements.vue_vue&type=script&lang.js +1 -1
  116. package/vue3/es/src/components/ClearRefinements.vue_vue&type=script&lang.js.map +1 -1
  117. package/vue3/es/src/components/ClearRefinements.vue_vue&type=template&id=410a3aaa&lang.js.map +1 -1
  118. package/vue3/es/src/components/Configure.js +1 -1
  119. package/vue3/es/src/components/Configure.js.map +1 -1
  120. package/vue3/es/src/components/ConfigureRelatedItems.js +1 -1
  121. package/vue3/es/src/components/ConfigureRelatedItems.js.map +1 -1
  122. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=script&lang.js +1 -1
  123. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=script&lang.js.map +1 -1
  124. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=template&id=4f1917ff&lang.js.map +1 -1
  125. package/vue3/es/src/components/DynamicWidgets.js +1 -1
  126. package/vue3/es/src/components/DynamicWidgets.js.map +1 -1
  127. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=script&lang.js +1 -1
  128. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=script&lang.js.map +1 -1
  129. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=4361a0b8&lang.js.map +1 -1
  130. package/vue3/es/src/components/Hits.vue_vue&type=script&lang.js +1 -1
  131. package/vue3/es/src/components/Hits.vue_vue&type=script&lang.js.map +1 -1
  132. package/vue3/es/src/components/Hits.vue_vue&type=template&id=ef242920&lang.js.map +1 -1
  133. package/vue3/es/src/components/HitsPerPage.vue_vue&type=script&lang.js +1 -1
  134. package/vue3/es/src/components/HitsPerPage.vue_vue&type=script&lang.js.map +1 -1
  135. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=74f3ac28&lang.js.map +1 -1
  136. package/vue3/es/src/components/Index.js +1 -1
  137. package/vue3/es/src/components/Index.js.map +1 -1
  138. package/vue3/es/src/components/InfiniteHits.vue_vue&type=script&lang.js +1 -1
  139. package/vue3/es/src/components/InfiniteHits.vue_vue&type=script&lang.js.map +1 -1
  140. package/vue3/es/src/components/InfiniteHits.vue_vue&type=template&id=dcfb64b8&lang.js.map +1 -1
  141. package/vue3/es/src/components/Menu.vue_vue&type=script&lang.js +1 -1
  142. package/vue3/es/src/components/Menu.vue_vue&type=script&lang.js.map +1 -1
  143. package/vue3/es/src/components/Menu.vue_vue&type=template&id=9bcc0be2&lang.js.map +1 -1
  144. package/vue3/es/src/components/MenuSelect.vue_vue&type=script&lang.js +1 -1
  145. package/vue3/es/src/components/MenuSelect.vue_vue&type=script&lang.js.map +1 -1
  146. package/vue3/es/src/components/MenuSelect.vue_vue&type=template&id=694477eb&lang.js.map +1 -1
  147. package/vue3/es/src/components/NumericMenu.vue_vue&type=script&lang.js +1 -1
  148. package/vue3/es/src/components/NumericMenu.vue_vue&type=script&lang.js.map +1 -1
  149. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=160fae0c&lang.js.map +1 -1
  150. package/vue3/es/src/components/Pagination.vue_vue&type=script&lang.js +1 -1
  151. package/vue3/es/src/components/Pagination.vue_vue&type=script&lang.js.map +1 -1
  152. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=849a166c&lang.js +1 -1
  153. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=849a166c&lang.js.map +1 -1
  154. package/vue3/es/src/components/QueryRuleContext.js +1 -1
  155. package/vue3/es/src/components/QueryRuleContext.js.map +1 -1
  156. package/vue3/es/src/components/QueryRuleCustomData.vue_vue&type=script&lang.js +1 -1
  157. package/vue3/es/src/components/QueryRuleCustomData.vue_vue&type=script&lang.js.map +1 -1
  158. package/vue3/es/src/components/QueryRuleCustomData.vue_vue&type=template&id=e4da0782&lang.js.map +1 -1
  159. package/vue3/es/src/components/RangeInput.vue_vue&type=script&lang.js +1 -1
  160. package/vue3/es/src/components/RangeInput.vue_vue&type=script&lang.js.map +1 -1
  161. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=1e17783d&lang.js.map +1 -1
  162. package/vue3/es/src/components/RatingMenu.vue_vue&type=script&lang.js +1 -1
  163. package/vue3/es/src/components/RatingMenu.vue_vue&type=script&lang.js.map +1 -1
  164. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=9254de68&lang.js.map +1 -1
  165. package/vue3/es/src/components/RefinementList.vue_vue&type=script&lang.js +1 -1
  166. package/vue3/es/src/components/RefinementList.vue_vue&type=script&lang.js.map +1 -1
  167. package/vue3/es/src/components/RefinementList.vue_vue&type=template&id=28927239&lang.js.map +1 -1
  168. package/vue3/es/src/components/RelevantSort.vue_vue&type=script&lang.js +1 -1
  169. package/vue3/es/src/components/RelevantSort.vue_vue&type=script&lang.js.map +1 -1
  170. package/vue3/es/src/components/RelevantSort.vue_vue&type=template&id=257b248b&lang.js.map +1 -1
  171. package/vue3/es/src/components/SearchBox.vue_vue&type=script&lang.js +1 -1
  172. package/vue3/es/src/components/SearchBox.vue_vue&type=script&lang.js.map +1 -1
  173. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=27029d83&lang.js +1 -1
  174. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=27029d83&lang.js.map +1 -1
  175. package/vue3/es/src/components/SearchInput.vue_vue&type=script&lang.js +1 -1
  176. package/vue3/es/src/components/SearchInput.vue_vue&type=script&lang.js.map +1 -1
  177. package/vue3/es/src/components/SearchInput.vue_vue&type=template&id=2eed8ffc&lang.js.map +1 -1
  178. package/vue3/es/src/components/SortBy.vue_vue&type=script&lang.js +1 -1
  179. package/vue3/es/src/components/SortBy.vue_vue&type=script&lang.js.map +1 -1
  180. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=b69b3b76&lang.js.map +1 -1
  181. package/vue3/es/src/components/StateResults.vue_vue&type=script&lang.js +1 -1
  182. package/vue3/es/src/components/StateResults.vue_vue&type=script&lang.js.map +1 -1
  183. package/vue3/es/src/components/StateResults.vue_vue&type=template&id=5992f3d5&lang.js.map +1 -1
  184. package/vue3/es/src/components/Stats.vue_vue&type=script&lang.js +1 -1
  185. package/vue3/es/src/components/Stats.vue_vue&type=script&lang.js.map +1 -1
  186. package/vue3/es/src/components/Stats.vue_vue&type=template&id=7337491f&lang.js.map +1 -1
  187. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=script&lang.js +1 -1
  188. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=script&lang.js.map +1 -1
  189. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=14e4586f&lang.js.map +1 -1
  190. package/vue3/es/src/components/VoiceSearch.vue_vue&type=script&lang.js +1 -1
  191. package/vue3/es/src/components/VoiceSearch.vue_vue&type=script&lang.js.map +1 -1
  192. package/vue3/es/src/components/VoiceSearch.vue_vue&type=template&id=24b0f67a&lang.js.map +1 -1
  193. package/vue3/es/src/mixins/widget.js +1 -1
  194. package/vue3/es/src/mixins/widget.js.map +1 -1
  195. package/vue3/es/src/util/createInstantSearchComponent.js +1 -1
  196. package/vue3/es/src/util/createServerRootMixin.js +1 -1
  197. package/vue3/es/src/util/createServerRootMixin.js.map +1 -1
  198. package/vue3/umd/index.js +1 -1
  199. package/vue3/umd/index.js.map +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,39 @@
1
+ ## [4.4.2](https://github.com/algolia/vue-instantsearch/compare/v4.4.1...v4.4.2) (2022-07-25)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **SearchBox:** forward missing prop queryHook ([#1136](https://github.com/algolia/vue-instantsearch/issues/1136)) ([7f8754d](https://github.com/algolia/vue-instantsearch/commit/7f8754dad73542c976b5218bda9a2db0c21c36a1))
7
+ * **VoiceSearch:** forward missing props language and additionalQueryParameters ([#1136](https://github.com/algolia/vue-instantsearch/issues/1136)) ([7f8754d](https://github.com/algolia/vue-instantsearch/commit/7f8754dad73542c976b5218bda9a2db0c21c36a1)), closes [#1135](https://github.com/algolia/vue-instantsearch/issues/1135)
8
+
9
+
10
+
11
+ ## [4.4.1](https://github.com/algolia/vue-instantsearch/compare/v4.4.0...v4.4.1) (2022-07-19)
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * **searchbox:** prevent concurrent query updates from state while input is focused ([#1133](https://github.com/algolia/vue-instantsearch/issues/1133)) ([c468c0a](https://github.com/algolia/vue-instantsearch/commit/c468c0aee633358f3fb64e41d7aa73b14b344fd2))
17
+
18
+
19
+
20
+ # [4.4.0](https://github.com/algolia/vue-instantsearch/compare/v4.3.3...v4.4.0) (2022-06-28)
21
+
22
+
23
+ ### Bug Fixes
24
+
25
+ * **ais-hierarchical-menu:** show full hierarchical parent values ([#1126](https://github.com/algolia/vue-instantsearch/issues/1126)) ([51aadf0](https://github.com/algolia/vue-instantsearch/commit/51aadf076e7116637c2046ff903279cafc5222c7))
26
+ * **pagination:** add page class for "page" item ([#1129](https://github.com/algolia/vue-instantsearch/issues/1129)) ([afacf8b](https://github.com/algolia/vue-instantsearch/commit/afacf8b3a9b8f3c99a15c9a31d2524f66142c67f))
27
+ * **ssr:** allow component without mixins to be extended ([#1127](https://github.com/algolia/vue-instantsearch/issues/1127)) ([3b8b887](https://github.com/algolia/vue-instantsearch/commit/3b8b887e918b8f59d92c73b6c57bd6836a99b771))
28
+
29
+
30
+ ### Features
31
+
32
+ * **core:** update instantsearch ([69a3aa8](https://github.com/algolia/vue-instantsearch/commit/69a3aa805a3e8f309d4a058c6c2a5c4534eed7ef))
33
+ * **widgets:** pass $$widgetType ([#1121](https://github.com/algolia/vue-instantsearch/issues/1121)) ([7696acc](https://github.com/algolia/vue-instantsearch/commit/7696acc8a30c40c682f3b7df2e82803c388a377f))
34
+
35
+
36
+
1
37
  ## [4.3.3](https://github.com/algolia/vue-instantsearch/compare/v4.3.2...v4.3.3) (2022-02-10)
2
38
 
3
39
 
package/package.json CHANGED
@@ -16,7 +16,7 @@
16
16
  "autocomplete"
17
17
  ],
18
18
  "license": "MIT",
19
- "version": "4.3.3",
19
+ "version": "4.4.2",
20
20
  "files": [
21
21
  "vue2",
22
22
  "vue3",
@@ -46,7 +46,7 @@
46
46
  "release": "shipjs prepare"
47
47
  },
48
48
  "dependencies": {
49
- "instantsearch.js": "^4.37.2",
49
+ "instantsearch.js": "^4.43.0",
50
50
  "mitt": "^2.1.0"
51
51
  },
52
52
  "peerDependencies": {
@@ -81,7 +81,7 @@
81
81
  "@wdio/spec-reporter": "^5.11.7",
82
82
  "@wdio/static-server-service": "^5.11.0",
83
83
  "algoliasearch": "4.0.1",
84
- "algoliasearch-helper": "3.7.0",
84
+ "algoliasearch-helper": "3.10.0",
85
85
  "babel-eslint": "10.0.1",
86
86
  "babel-jest": "23.6.0",
87
87
  "babel-preset-es2015": "6.24.1",
@@ -133,11 +133,11 @@
133
133
  "bundlesize": [
134
134
  {
135
135
  "path": "./vue2/umd/index.js",
136
- "maxSize": "56.00 kB"
136
+ "maxSize": "56.50 kB"
137
137
  },
138
138
  {
139
139
  "path": "./vue3/umd/index.js",
140
- "maxSize": "57.00 kB"
140
+ "maxSize": "57.75 kB"
141
141
  },
142
142
  {
143
143
  "path": "./vue2/cjs/index.js",
@@ -1,9 +1,24 @@
1
- import { isVue3, Vue2, createApp } from '../util/vue-compat';
1
+ import {
2
+ isVue3,
3
+ isVue2,
4
+ Vue2,
5
+ createApp,
6
+ renderCompat,
7
+ } from '../util/vue-compat';
2
8
  import InstantSearch from '../instantsearch';
9
+ import { AisInstantSearch } from '../widgets';
3
10
 
4
11
  const renderlessComponents = ['AisExperimentalConfigureRelatedItems'];
12
+ const nonWidgetComponents = [
13
+ 'AisInstantSearch',
14
+ 'AisInstantSearchSsr',
15
+ 'AisHighlight',
16
+ 'AisSnippet',
17
+ 'AisPanel',
18
+ 'AisPoweredBy',
19
+ ];
5
20
 
6
- it('should have `name` the same as the suit class name everywhere', () => {
21
+ function getAllComponents() {
7
22
  let calls;
8
23
  if (isVue3) {
9
24
  const app = createApp();
@@ -16,37 +31,129 @@ it('should have `name` the same as the suit class name everywhere', () => {
16
31
  calls = Vue2.component.mock.calls;
17
32
  }
18
33
 
19
- const allInstalledComponents = calls.filter(
20
- ([installedName]) => !renderlessComponents.includes(installedName)
21
- );
22
- const components = allInstalledComponents.map(
23
- ([installedName, { name, mixins }]) => {
24
- let suitClass = `Error! ${name} is missing the suit classes`;
25
-
26
- try {
27
- suitClass = mixins
28
- .find(mixin => mixin.methods && mixin.methods.suit)
29
- .methods.suit();
30
- } catch (e) {
31
- /* no suit class, so will fail the assertions */
34
+ return calls.map(([installedName, call]) => {
35
+ const { name, mixins } = call;
36
+ let suitClass = `Error! ${name} is missing the suit classes`;
37
+ let widget = `Error! ${name} is missing the widget`;
38
+
39
+ try {
40
+ suitClass = mixins
41
+ .find(mixin => mixin.methods && mixin.methods.suit)
42
+ .methods.suit();
43
+ } catch (e) {
44
+ /* no suit class, so will fail the assertions */
45
+ }
46
+
47
+ try {
48
+ if (nonWidgetComponents.includes(name)) {
49
+ throw new Error('not a widget');
32
50
  }
33
51
 
34
- return {
35
- installedName,
36
- name,
37
- suitClass,
52
+ const props = {};
53
+ if (name === 'AisHierarchicalMenu' || name === 'AisBreadcrumb') {
54
+ props.attributes = ['attr'];
55
+ } else if (name === 'AisExperimentalConfigureRelatedItems') {
56
+ props.hit = {};
57
+ props.matchingPatterns = {};
58
+ } else if (name === 'AisToggleRefinement') {
59
+ props.attribute = 'attr';
60
+ props.label = 'label';
61
+ props.value = 'value';
62
+ } else if (name === 'AisSortBy') {
63
+ props.items = [];
64
+ } else if (name === 'AisNumericMenu') {
65
+ props.items = [{ label: 'start', start: 1 }];
66
+ props.attribute = 'attr';
67
+ } else if (name === 'AisHitsPerPage') {
68
+ props.items = [{ default: true, label: 'ten', value: 10 }];
69
+ } else if (name === 'AisQueryRuleContext') {
70
+ props.trackedFilters = {};
71
+ } else if (name === 'AisIndex') {
72
+ props.indexName = 'indexName';
73
+ } else {
74
+ props.attribute = 'attr';
75
+ }
76
+
77
+ const Component = {
78
+ render: renderCompat(h =>
79
+ h(
80
+ AisInstantSearch,
81
+ {
82
+ props: {
83
+ indexName: 'instant_search',
84
+ searchClient: {
85
+ search() {
86
+ return new Promise({ results: [] });
87
+ },
88
+ },
89
+ },
90
+ },
91
+ [
92
+ h(call, {
93
+ props,
94
+ ref: 'widgetComponent',
95
+ }),
96
+ ]
97
+ )
98
+ ),
38
99
  };
100
+
101
+ let vm;
102
+ if (isVue2) {
103
+ vm = new Vue2(Component).$mount();
104
+ } else if (isVue3) {
105
+ vm = createApp(Component).mount(document.createElement('div'));
106
+ }
107
+ widget = vm.$refs.widgetComponent.widget;
108
+ } catch (e) {
109
+ /* no widget, so will fail the assertions */
110
+ }
111
+
112
+ return {
113
+ installedName,
114
+ name,
115
+ suitClass,
116
+ widget,
117
+ };
118
+ });
119
+ }
120
+
121
+ const components = getAllComponents();
122
+
123
+ describe('DOM component', () => {
124
+ test.each(
125
+ components.filter(
126
+ ({ name }) => renderlessComponents.includes(name) === false
127
+ )
128
+ )(
129
+ '$name should have the same `name` as suit class',
130
+ ({ name, installedName, suitClass }) => {
131
+ expect(installedName).toBe(name);
132
+ if (name === 'AisInstantSearchSsr') {
133
+ expect(suitClass).toBe(`ais-InstantSearch`);
134
+ } else if (name === 'AisExperimentalDynamicWidgets') {
135
+ expect(suitClass).toBe(`ais-DynamicWidgets`);
136
+ } else {
137
+ expect(suitClass).toBe(`ais-${name.substr(3)}`);
138
+ }
39
139
  }
40
140
  );
141
+ });
41
142
 
42
- components.forEach(({ name, installedName, suitClass }) => {
43
- expect(installedName).toBe(name);
44
- if (name === 'AisInstantSearchSsr') {
45
- expect(suitClass).toBe(`ais-InstantSearch`);
46
- } else if (name === 'AisExperimentalDynamicWidgets') {
47
- expect(suitClass).toBe(`ais-DynamicWidgets`);
143
+ describe('installed widget', () => {
144
+ test.each(
145
+ components.filter(
146
+ ({ name }) => nonWidgetComponents.includes(name) === false
147
+ )
148
+ )('sets widgetType $name', ({ name, widget }) => {
149
+ if (name === 'AisExperimentalDynamicWidgets') {
150
+ expect(widget.$$widgetType).toBe('ais.dynamicWidgets');
151
+ } else if (name === 'AisExperimentalConfigureRelatedItems') {
152
+ expect(widget.$$widgetType).toBe('ais.configureRelatedItems');
48
153
  } else {
49
- expect(suitClass).toBe(`ais-${name.substr(3)}`);
154
+ expect(widget.$$widgetType).toBe(
155
+ `ais.${name[3].toLowerCase()}${name.substr(4)}`
156
+ );
50
157
  }
51
158
  });
52
159
  });
@@ -28,7 +28,14 @@ import { createSuitMixin } from '../mixins/suit';
28
28
  export default {
29
29
  name: 'AisAutocomplete',
30
30
  mixins: [
31
- createWidgetMixin({ connector: connectAutocomplete }),
31
+ createWidgetMixin(
32
+ {
33
+ connector: connectAutocomplete,
34
+ },
35
+ {
36
+ $$widgetType: 'ais.autocomplete',
37
+ }
38
+ ),
32
39
  createSuitMixin({ name: 'Autocomplete' }),
33
40
  ],
34
41
  props: {
@@ -56,7 +56,14 @@ import { createWidgetMixin } from '../mixins/widget';
56
56
  export default {
57
57
  name: 'AisBreadcrumb',
58
58
  mixins: [
59
- createWidgetMixin({ connector: connectBreadcrumb }),
59
+ createWidgetMixin(
60
+ {
61
+ connector: connectBreadcrumb,
62
+ },
63
+ {
64
+ $$widgetType: 'ais.breadcrumb',
65
+ }
66
+ ),
60
67
  createPanelConsumerMixin({
61
68
  mapStateToCanRefine: state => Boolean(state.canRefine),
62
69
  }),
@@ -29,7 +29,14 @@ import { createWidgetMixin } from '../mixins/widget';
29
29
  export default {
30
30
  name: 'AisClearRefinements',
31
31
  mixins: [
32
- createWidgetMixin({ connector: connectClearRefinements }),
32
+ createWidgetMixin(
33
+ {
34
+ connector: connectClearRefinements,
35
+ },
36
+ {
37
+ $$widgetType: 'ais.clearRefinements',
38
+ }
39
+ ),
33
40
  createPanelConsumerMixin({
34
41
  mapStateToCanRefine: state => Boolean(state.hasRefinements),
35
42
  }),
@@ -8,7 +8,14 @@ export default {
8
8
  name: 'AisConfigure',
9
9
  mixins: [
10
10
  createSuitMixin({ name: 'Configure' }),
11
- createWidgetMixin({ connector: connectConfigure }),
11
+ createWidgetMixin(
12
+ {
13
+ connector: connectConfigure,
14
+ },
15
+ {
16
+ $$widgetType: 'ais.configure',
17
+ }
18
+ ),
12
19
  ],
13
20
  computed: {
14
21
  widgetParams() {
@@ -5,7 +5,14 @@ export default {
5
5
  inheritAttrs: false,
6
6
  name: 'AisExperimentalConfigureRelatedItems',
7
7
  mixins: [
8
- createWidgetMixin({ connector: EXPERIMENTAL_connectConfigureRelatedItems }),
8
+ createWidgetMixin(
9
+ {
10
+ connector: EXPERIMENTAL_connectConfigureRelatedItems,
11
+ },
12
+ {
13
+ $$widgetType: 'ais.configureRelatedItems',
14
+ }
15
+ ),
9
16
  ],
10
17
  props: {
11
18
  hit: {
@@ -63,7 +63,14 @@ export default {
63
63
  name: 'AisCurrentRefinements',
64
64
  mixins: [
65
65
  createSuitMixin({ name: 'CurrentRefinements' }),
66
- createWidgetMixin({ connector: connectCurrentRefinements }),
66
+ createWidgetMixin(
67
+ {
68
+ connector: connectCurrentRefinements,
69
+ },
70
+ {
71
+ $$widgetType: 'ais.currentRefinements',
72
+ }
73
+ ),
67
74
  createPanelConsumerMixin({
68
75
  mapStateToCanRefine: state =>
69
76
  Boolean(state.items) && state.items.length > 0,
@@ -42,7 +42,14 @@ function getWidgetAttribute(vnode) {
42
42
  export default {
43
43
  name: 'AisDynamicWidgets',
44
44
  mixins: [
45
- createWidgetMixin({ connector: connectDynamicWidgets }),
45
+ createWidgetMixin(
46
+ {
47
+ connector: connectDynamicWidgets,
48
+ },
49
+ {
50
+ $$widgetType: 'ais.dynamicWidgets',
51
+ }
52
+ ),
46
53
  createSuitMixin({ name: 'DynamicWidgets' }),
47
54
  ],
48
55
  props: {
@@ -53,7 +53,14 @@ export default {
53
53
  name: 'AisHierarchicalMenu',
54
54
  mixins: [
55
55
  createSuitMixin({ name: 'HierarchicalMenu' }),
56
- createWidgetMixin({ connector: connectHierarchicalMenu }),
56
+ createWidgetMixin(
57
+ {
58
+ connector: connectHierarchicalMenu,
59
+ },
60
+ {
61
+ $$widgetType: 'ais.hierarchicalMenu',
62
+ }
63
+ ),
57
64
  createPanelConsumerMixin({
58
65
  mapStateToCanRefine,
59
66
  }),
@@ -34,7 +34,14 @@ import { createSuitMixin } from '../mixins/suit';
34
34
  export default {
35
35
  name: 'AisHits',
36
36
  mixins: [
37
- createWidgetMixin({ connector: connectHitsWithInsights }),
37
+ createWidgetMixin(
38
+ {
39
+ connector: connectHitsWithInsights,
40
+ },
41
+ {
42
+ $$widgetType: 'ais.hits',
43
+ }
44
+ ),
38
45
  createSuitMixin({ name: 'Hits' }),
39
46
  ],
40
47
  props: {
@@ -34,7 +34,14 @@ export default {
34
34
  name: 'AisHitsPerPage',
35
35
  mixins: [
36
36
  createSuitMixin({ name: 'HitsPerPage' }),
37
- createWidgetMixin({ connector: connectHitsPerPage }),
37
+ createWidgetMixin(
38
+ {
39
+ connector: connectHitsPerPage,
40
+ },
41
+ {
42
+ $$widgetType: 'ais.hitsPerPage',
43
+ }
44
+ ),
38
45
  createPanelConsumerMixin({
39
46
  mapStateToCanRefine: state => state.hasNoResults === false,
40
47
  }),
@@ -10,7 +10,12 @@ export default {
10
10
  name: 'AisIndex',
11
11
  mixins: [
12
12
  createSuitMixin({ name: 'Index' }),
13
- createWidgetMixin({ connector: connectIndex }),
13
+ createWidgetMixin(
14
+ { connector: connectIndex },
15
+ {
16
+ $$widgetType: 'ais.index',
17
+ }
18
+ ),
14
19
  ],
15
20
  provide() {
16
21
  return {
@@ -68,7 +68,14 @@ import { createSuitMixin } from '../mixins/suit';
68
68
  export default {
69
69
  name: 'AisInfiniteHits',
70
70
  mixins: [
71
- createWidgetMixin({ connector: connectInfiniteHitsWithInsights }),
71
+ createWidgetMixin(
72
+ {
73
+ connector: connectInfiniteHitsWithInsights,
74
+ },
75
+ {
76
+ $$widgetType: 'ais.infiniteHits',
77
+ }
78
+ ),
72
79
  createSuitMixin({ name: 'InfiniteHits' }),
73
80
  ],
74
81
  props: {
@@ -55,7 +55,12 @@ export default {
55
55
  name: 'AisMenu',
56
56
  mixins: [
57
57
  createSuitMixin({ name: 'Menu' }),
58
- createWidgetMixin({ connector: connectMenu }),
58
+ createWidgetMixin(
59
+ { connector: connectMenu },
60
+ {
61
+ $$widgetType: 'ais.menu',
62
+ }
63
+ ),
59
64
  createPanelConsumerMixin({
60
65
  mapStateToCanRefine: state => Boolean(state.canRefine),
61
66
  }),
@@ -47,7 +47,12 @@ export default {
47
47
  name: 'AisMenuSelect',
48
48
  mixins: [
49
49
  createSuitMixin({ name: 'MenuSelect' }),
50
- createWidgetMixin({ connector: connectMenu }),
50
+ createWidgetMixin(
51
+ { connector: connectMenu },
52
+ {
53
+ $$widgetType: 'ais.menuSelect',
54
+ }
55
+ ),
51
56
  createPanelConsumerMixin({
52
57
  mapStateToCanRefine: state => Boolean(state.canRefine),
53
58
  }),
@@ -42,7 +42,14 @@ import { createSuitMixin } from '../mixins/suit';
42
42
  export default {
43
43
  name: 'AisNumericMenu',
44
44
  mixins: [
45
- createWidgetMixin({ connector: connectNumericMenu }),
45
+ createWidgetMixin(
46
+ {
47
+ connector: connectNumericMenu,
48
+ },
49
+ {
50
+ $$widgetType: 'ais.numericMenu',
51
+ }
52
+ ),
46
53
  createSuitMixin({ name: 'NumericMenu' }),
47
54
  createPanelConsumerMixin({
48
55
  mapStateToCanRefine: state => state.hasNoResults === false,
@@ -78,6 +78,7 @@
78
78
  <li
79
79
  :class="{
80
80
  [suit('item')]: true,
81
+ [suit('item', 'page')]: true,
81
82
  [suit('item', 'selected')]: state.currentRefinement === page
82
83
  }"
83
84
  v-for="page in state.pages"
@@ -174,7 +175,14 @@ export default {
174
175
  name: 'AisPagination',
175
176
  mixins: [
176
177
  createSuitMixin({ name: 'Pagination' }),
177
- createWidgetMixin({ connector: connectPagination }),
178
+ createWidgetMixin(
179
+ {
180
+ connector: connectPagination,
181
+ },
182
+ {
183
+ $$widgetType: 'ais.pagination',
184
+ }
185
+ ),
178
186
  createPanelConsumerMixin({
179
187
  mapStateToCanRefine: state => state.nbPages > 1,
180
188
  }),
@@ -6,9 +6,14 @@ export default {
6
6
  name: 'AisQueryRuleContext',
7
7
  mixins: [
8
8
  createSuitMixin({ name: 'QueryRuleContext' }),
9
- createWidgetMixin({
10
- connector: connectQueryRules,
11
- }),
9
+ createWidgetMixin(
10
+ {
11
+ connector: connectQueryRules,
12
+ },
13
+ {
14
+ $$widgetType: 'ais.queryRuleContext',
15
+ }
16
+ ),
12
17
  ],
13
18
  props: {
14
19
  trackedFilters: {
@@ -28,9 +28,14 @@ export default {
28
28
  name: 'AisQueryRuleCustomData',
29
29
  mixins: [
30
30
  createSuitMixin({ name: 'QueryRuleCustomData' }),
31
- createWidgetMixin({
32
- connector: connectQueryRules,
33
- }),
31
+ createWidgetMixin(
32
+ {
33
+ connector: connectQueryRules,
34
+ },
35
+ {
36
+ $$widgetType: 'ais.queryRuleCustomData',
37
+ }
38
+ ),
34
39
  ],
35
40
  props: {
36
41
  transformItems: {
@@ -67,7 +67,14 @@ export default {
67
67
  name: 'AisRangeInput',
68
68
  mixins: [
69
69
  createSuitMixin({ name: 'RangeInput' }),
70
- createWidgetMixin({ connector: connectRange }),
70
+ createWidgetMixin(
71
+ {
72
+ connector: connectRange,
73
+ },
74
+ {
75
+ $$widgetType: 'ais.rangeInput',
76
+ }
77
+ ),
71
78
  createPanelConsumerMixin({
72
79
  mapStateToCanRefine,
73
80
  }),
@@ -87,7 +87,14 @@ export default {
87
87
  name: 'AisRatingMenu',
88
88
  mixins: [
89
89
  createSuitMixin({ name: 'RatingMenu' }),
90
- createWidgetMixin({ connector: connectRatingMenu }),
90
+ createWidgetMixin(
91
+ {
92
+ connector: connectRatingMenu,
93
+ },
94
+ {
95
+ $$widgetType: 'ais.ratingMenu',
96
+ }
97
+ ),
91
98
  createPanelConsumerMixin({
92
99
  mapStateToCanRefine: state => state.hasNoResults === false,
93
100
  }),
@@ -110,7 +110,14 @@ export default {
110
110
  components: { SearchInput, AisHighlight },
111
111
  mixins: [
112
112
  createSuitMixin({ name: 'RefinementList' }),
113
- createWidgetMixin({ connector: connectRefinementList }),
113
+ createWidgetMixin(
114
+ {
115
+ connector: connectRefinementList,
116
+ },
117
+ {
118
+ $$widgetType: 'ais.refinementList',
119
+ }
120
+ ),
114
121
  createPanelConsumerMixin({
115
122
  mapStateToCanRefine: state => Boolean(state.canRefine),
116
123
  }),
@@ -36,7 +36,14 @@ export default {
36
36
  name: 'AisRelevantSort',
37
37
  mixins: [
38
38
  createSuitMixin({ name: 'RelevantSort' }),
39
- createWidgetMixin({ connector: connectRelevantSort }),
39
+ createWidgetMixin(
40
+ {
41
+ connector: connectRelevantSort,
42
+ },
43
+ {
44
+ $$widgetType: 'ais.relevantSort',
45
+ }
46
+ ),
40
47
  ],
41
48
  methods: {
42
49
  refine() {