vue-instantsearch 3.6.0 → 3.9.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 (96) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/vue-instantsearch.common.js +1 -1
  3. package/dist/vue-instantsearch.common.js.map +1 -1
  4. package/dist/vue-instantsearch.js +1 -1
  5. package/dist/vue-instantsearch.js.map +1 -1
  6. package/es/package.json.js +1 -1
  7. package/es/src/components/Breadcrumb.vue.js +1 -1
  8. package/es/src/components/Breadcrumb.vue.js.map +1 -1
  9. package/es/src/components/ClearRefinements.vue.js +1 -1
  10. package/es/src/components/ClearRefinements.vue.js.map +1 -1
  11. package/es/src/components/CurrentRefinements.vue.js +1 -1
  12. package/es/src/components/CurrentRefinements.vue.js.map +1 -1
  13. package/es/src/components/DynamicWidgets.js +2 -0
  14. package/es/src/components/DynamicWidgets.js.map +1 -0
  15. package/es/src/components/HierarchicalMenu.vue.js +1 -1
  16. package/es/src/components/HierarchicalMenu.vue.js.map +1 -1
  17. package/es/src/components/Highlighter.vue.js.map +1 -1
  18. package/es/src/components/Hits.vue.js +1 -1
  19. package/es/src/components/Hits.vue.js.map +1 -1
  20. package/es/src/components/HitsPerPage.vue.js +1 -1
  21. package/es/src/components/HitsPerPage.vue.js.map +1 -1
  22. package/es/src/components/InfiniteHits.vue.js +1 -1
  23. package/es/src/components/InfiniteHits.vue.js.map +1 -1
  24. package/es/src/components/InstantSearch.js +1 -1
  25. package/es/src/components/InstantSearch.js.map +1 -1
  26. package/es/src/components/Menu.vue.js +1 -1
  27. package/es/src/components/Menu.vue.js.map +1 -1
  28. package/es/src/components/MenuSelect.vue.js +1 -1
  29. package/es/src/components/MenuSelect.vue.js.map +1 -1
  30. package/es/src/components/NumericMenu.vue.js +1 -1
  31. package/es/src/components/NumericMenu.vue.js.map +1 -1
  32. package/es/src/components/Pagination.vue.js +1 -1
  33. package/es/src/components/Pagination.vue.js.map +1 -1
  34. package/es/src/components/QueryRuleContext.js +1 -1
  35. package/es/src/components/QueryRuleContext.js.map +1 -1
  36. package/es/src/components/QueryRuleCustomData.vue.js +1 -1
  37. package/es/src/components/QueryRuleCustomData.vue.js.map +1 -1
  38. package/es/src/components/RangeInput.vue.js +1 -1
  39. package/es/src/components/RangeInput.vue.js.map +1 -1
  40. package/es/src/components/RatingMenu.vue.js +1 -1
  41. package/es/src/components/RatingMenu.vue.js.map +1 -1
  42. package/es/src/components/RefinementList.vue.js +1 -1
  43. package/es/src/components/RefinementList.vue.js.map +1 -1
  44. package/es/src/components/SortBy.vue.js +1 -1
  45. package/es/src/components/SortBy.vue.js.map +1 -1
  46. package/es/src/components/ToggleRefinement.vue.js +1 -1
  47. package/es/src/components/ToggleRefinement.vue.js.map +1 -1
  48. package/es/src/instantsearch.js +1 -1
  49. package/es/src/mixins/widget.js +1 -1
  50. package/es/src/mixins/widget.js.map +1 -1
  51. package/es/src/util/createInstantSearchComponent.js +1 -1
  52. package/es/src/util/createInstantSearchComponent.js.map +1 -1
  53. package/es/src/util/createServerRootMixin.js +1 -1
  54. package/es/src/util/createServerRootMixin.js.map +1 -1
  55. package/es/src/widgets.js +1 -1
  56. package/package.json +5 -5
  57. package/src/__tests__/index.js +2 -0
  58. package/src/components/Breadcrumb.vue +3 -5
  59. package/src/components/ClearRefinements.vue +3 -7
  60. package/src/components/CurrentRefinements.vue +3 -7
  61. package/src/components/DynamicWidgets.js +87 -0
  62. package/src/components/HierarchicalMenu.vue +8 -11
  63. package/src/components/Highlighter.vue +16 -4
  64. package/src/components/Hits.vue +2 -3
  65. package/src/components/HitsPerPage.vue +1 -4
  66. package/src/components/InfiniteHits.vue +2 -3
  67. package/src/components/InstantSearch.js +11 -7
  68. package/src/components/Menu.vue +5 -8
  69. package/src/components/MenuSelect.vue +2 -3
  70. package/src/components/NumericMenu.vue +2 -3
  71. package/src/components/Pagination.vue +1 -1
  72. package/src/components/QueryRuleContext.js +1 -1
  73. package/src/components/QueryRuleCustomData.vue +1 -1
  74. package/src/components/RangeInput.vue +3 -0
  75. package/src/components/RatingMenu.vue +2 -1
  76. package/src/components/RefinementList.vue +8 -7
  77. package/src/components/SortBy.vue +1 -3
  78. package/src/components/ToggleRefinement.vue +1 -2
  79. package/src/components/__tests__/DynamicWidgets.js +419 -0
  80. package/src/components/__tests__/HierarchicalMenu.js +23 -0
  81. package/src/components/__tests__/Hits.js +22 -1
  82. package/src/components/__tests__/InfiniteHits.js +21 -0
  83. package/src/components/__tests__/InstantSearch-integration.js +155 -1
  84. package/src/components/__tests__/Menu.js +22 -0
  85. package/src/components/__tests__/MenuSelect.js +22 -0
  86. package/src/components/__tests__/NumericMenu.js +22 -0
  87. package/src/components/__tests__/RangeInput.js +22 -0
  88. package/src/components/__tests__/RatingMenu.js +23 -0
  89. package/src/components/__tests__/RefinementList.js +22 -0
  90. package/src/components/__tests__/ToggleRefinement.js +22 -0
  91. package/src/mixins/widget.js +1 -1
  92. package/src/util/__tests__/createServerRootMixin.test.js +229 -83
  93. package/src/util/createInstantSearchComponent.js +16 -0
  94. package/src/util/createServerRootMixin.js +40 -104
  95. package/src/util/testutils/helper.js +2 -2
  96. package/src/widgets.js +1 -0
@@ -0,0 +1,87 @@
1
+ import { createWidgetMixin } from '../mixins/widget';
2
+ import { EXPERIMENTAL_connectDynamicWidgets } from 'instantsearch.js/es/connectors';
3
+ import { createSuitMixin } from '../mixins/suit';
4
+
5
+ function getWidgetAttribute(vnode) {
6
+ const props = vnode.componentOptions && vnode.componentOptions.propsData;
7
+ if (props) {
8
+ if (props.attribute) {
9
+ return props.attribute;
10
+ }
11
+ if (Array.isArray(props.attributes)) {
12
+ return props.attributes[0];
13
+ }
14
+ }
15
+
16
+ const children =
17
+ vnode.componentOptions && vnode.componentOptions.children
18
+ ? vnode.componentOptions.children
19
+ : vnode.children;
20
+
21
+ if (Array.isArray(children)) {
22
+ // return first child with a truthy attribute
23
+ return children.reduce(
24
+ (acc, curr) => acc || getWidgetAttribute(curr),
25
+ undefined
26
+ );
27
+ }
28
+
29
+ return undefined;
30
+ }
31
+
32
+ export default {
33
+ name: 'AisExperimentalDynamicWidgets',
34
+ mixins: [
35
+ createWidgetMixin({ connector: EXPERIMENTAL_connectDynamicWidgets }),
36
+ createSuitMixin({ name: 'DynamicWidgets' }),
37
+ ],
38
+ props: {
39
+ transformItems: {
40
+ type: Function,
41
+ default: undefined,
42
+ },
43
+ },
44
+ render(createElement) {
45
+ const components = new Map();
46
+ (this.$slots.default || []).forEach(vnode => {
47
+ const attribute = getWidgetAttribute(vnode);
48
+ if (attribute) {
49
+ components.set(
50
+ attribute,
51
+ createElement(
52
+ 'div',
53
+ { key: attribute, class: [this.suit('widget')] },
54
+ [vnode]
55
+ )
56
+ );
57
+ }
58
+ });
59
+
60
+ // by default, render everything, but hidden so that the routing doesn't disappear
61
+ if (!this.state) {
62
+ const allComponents = [];
63
+ components.forEach(component => allComponents.push(component));
64
+
65
+ return createElement(
66
+ 'div',
67
+ { attrs: { hidden: true }, class: [this.suit()] },
68
+ allComponents
69
+ );
70
+ }
71
+
72
+ return createElement(
73
+ 'div',
74
+ { class: [this.suit()] },
75
+ this.state.attributesToRender.map(attribute => components.get(attribute))
76
+ );
77
+ },
78
+ computed: {
79
+ widgetParams() {
80
+ return {
81
+ transformItems: this.transformItems,
82
+ // we do not pass "widgets" to the connector, since Vue is in charge of rendering
83
+ widgets: [],
84
+ };
85
+ },
86
+ },
87
+ };
@@ -11,6 +11,7 @@
11
11
  :refine="state.refine"
12
12
  :createURL="state.createURL"
13
13
  :toggle-show-more="state.toggleShowMore"
14
+ :send-event="state.sendEvent"
14
15
  >
15
16
  <hierarchical-menu-list
16
17
  :items="state.items"
@@ -67,11 +68,11 @@ export default {
67
68
  },
68
69
  limit: {
69
70
  type: Number,
70
- default: 10,
71
+ default: undefined,
71
72
  },
72
73
  showMoreLimit: {
73
74
  type: Number,
74
- default: 20,
75
+ default: undefined,
75
76
  },
76
77
  showMore: {
77
78
  type: Boolean,
@@ -79,27 +80,23 @@ export default {
79
80
  },
80
81
  sortBy: {
81
82
  type: [Array, Function],
82
- default() {
83
- return ['name:asc'];
84
- },
83
+ default: undefined,
85
84
  },
86
85
  separator: {
87
86
  type: String,
88
- default: ' > ',
87
+ default: undefined,
89
88
  },
90
89
  rootPath: {
91
90
  type: String,
92
- default: null,
91
+ default: undefined,
93
92
  },
94
93
  showParentLevel: {
95
94
  type: Boolean,
96
- default: true,
95
+ default: undefined,
97
96
  },
98
97
  transformItems: {
99
98
  type: Function,
100
- default(items) {
101
- return items;
102
- },
99
+ default: undefined,
103
100
  },
104
101
  },
105
102
  computed: {
@@ -27,10 +27,22 @@ export default {
27
27
  type: String,
28
28
  default: 'mark',
29
29
  },
30
- suit: { type: Function, required: true },
31
- highlightProperty: { type: String, required: true },
32
- preTag: { type: String, required: true },
33
- postTag: { type: String, required: true },
30
+ suit: {
31
+ type: Function,
32
+ required: true,
33
+ },
34
+ highlightProperty: {
35
+ type: String,
36
+ required: true,
37
+ },
38
+ preTag: {
39
+ type: String,
40
+ required: true,
41
+ },
42
+ postTag: {
43
+ type: String,
44
+ required: true,
45
+ },
34
46
  },
35
47
  data() {
36
48
  return {
@@ -6,6 +6,7 @@
6
6
  <slot
7
7
  :items="items"
8
8
  :insights="state.insights"
9
+ :send-event="state.sendEvent"
9
10
  >
10
11
  <ol :class="suit('list')">
11
12
  <li
@@ -43,9 +44,7 @@ export default {
43
44
  },
44
45
  transformItems: {
45
46
  type: Function,
46
- default(items) {
47
- return items;
48
- },
47
+ default: undefined,
49
48
  },
50
49
  },
51
50
  computed: {
@@ -43,13 +43,10 @@ export default {
43
43
  items: {
44
44
  type: Array,
45
45
  required: true,
46
- default: () => [],
47
46
  },
48
47
  transformItems: {
49
48
  type: Function,
50
- default(items) {
51
- return items;
52
- },
49
+ default: undefined,
53
50
  },
54
51
  },
55
52
  data() {
@@ -26,6 +26,7 @@
26
26
  :refine-next="refineNext"
27
27
  :refine="refineNext"
28
28
  :insights="state.insights"
29
+ :send-event="state.sendEvent"
29
30
  >
30
31
  <ol :class="suit('list')">
31
32
  <li
@@ -81,9 +82,7 @@ export default {
81
82
  },
82
83
  transformItems: {
83
84
  type: Function,
84
- default(items) {
85
- return items;
86
- },
85
+ default: undefined,
87
86
  },
88
87
  cache: {
89
88
  type: Object,
@@ -16,14 +16,14 @@ export default createInstantSearchComponent({
16
16
  },
17
17
  insightsClient: {
18
18
  type: Function,
19
- required: false,
19
+ default: undefined,
20
20
  },
21
21
  indexName: {
22
22
  type: String,
23
23
  required: true,
24
24
  },
25
25
  routing: {
26
- default: null,
26
+ default: undefined,
27
27
  validator(value) {
28
28
  if (
29
29
  typeof value === 'boolean' ||
@@ -39,19 +39,19 @@ export default createInstantSearchComponent({
39
39
  },
40
40
  stalledSearchDelay: {
41
41
  type: Number,
42
- default: 200,
42
+ default: undefined,
43
43
  },
44
44
  searchFunction: {
45
45
  type: Function,
46
- default: null,
46
+ default: undefined,
47
47
  },
48
48
  initialUiState: {
49
49
  type: Object,
50
- required: false,
50
+ default: undefined,
51
51
  },
52
52
  apiKey: {
53
53
  type: String,
54
- default: null,
54
+ default: undefined,
55
55
  validator(value) {
56
56
  if (value) {
57
57
  warn(oldApiWarning);
@@ -61,7 +61,7 @@ export default createInstantSearchComponent({
61
61
  },
62
62
  appId: {
63
63
  type: String,
64
- default: null,
64
+ default: undefined,
65
65
  validator(value) {
66
66
  if (value) {
67
67
  warn(oldApiWarning);
@@ -69,6 +69,10 @@ export default createInstantSearchComponent({
69
69
  return false;
70
70
  },
71
71
  },
72
+ middlewares: {
73
+ type: Array,
74
+ default: null,
75
+ },
72
76
  },
73
77
  data() {
74
78
  return {
@@ -11,6 +11,7 @@
11
11
  :refine="state.refine"
12
12
  :createURL="state.createURL"
13
13
  :toggle-show-more="state.toggleShowMore"
14
+ :send-event="state.sendEvent"
14
15
  >
15
16
  <ul :class="suit('list')">
16
17
  <li
@@ -71,11 +72,11 @@ export default {
71
72
  // },
72
73
  limit: {
73
74
  type: Number,
74
- default: 10,
75
+ default: undefined,
75
76
  },
76
77
  showMoreLimit: {
77
78
  type: Number,
78
- default: 20,
79
+ default: undefined,
79
80
  },
80
81
  showMore: {
81
82
  type: Boolean,
@@ -83,15 +84,11 @@ export default {
83
84
  },
84
85
  sortBy: {
85
86
  type: [Array, Function],
86
- default() {
87
- return ['count:desc', 'name:asc'];
88
- },
87
+ default: undefined,
89
88
  },
90
89
  transformItems: {
91
90
  type: Function,
92
- default(items) {
93
- return items;
94
- },
91
+ default: undefined,
95
92
  },
96
93
  },
97
94
  computed: {
@@ -8,6 +8,7 @@
8
8
  :can-refine="state.canRefine"
9
9
  :refine="refine"
10
10
  :createURL="state.createURL"
11
+ :send-event="state.sendEvent"
11
12
  >
12
13
  <select
13
14
  :class="suit('select')"
@@ -62,9 +63,7 @@ export default {
62
63
  },
63
64
  sortBy: {
64
65
  type: [Array, Function],
65
- default() {
66
- return ['name:asc'];
67
- },
66
+ default: undefined,
68
67
  },
69
68
  transformItems: {
70
69
  type: Function,
@@ -8,6 +8,7 @@
8
8
  :can-refine="canRefine"
9
9
  :refine="state.refine"
10
10
  :createURL="state.createURL"
11
+ :send-event="state.sendEvent"
11
12
  >
12
13
  <ul :class="[suit('list')]">
13
14
  <li
@@ -58,9 +59,7 @@ export default {
58
59
  },
59
60
  transformItems: {
60
61
  type: Function,
61
- default(items) {
62
- return items;
63
- },
62
+ default: undefined,
64
63
  },
65
64
  },
66
65
  computed: {
@@ -182,7 +182,7 @@ export default {
182
182
  props: {
183
183
  padding: {
184
184
  type: Number,
185
- default: 3,
185
+ default: undefined,
186
186
  validator(value) {
187
187
  return value > 0;
188
188
  },
@@ -18,7 +18,7 @@ export default {
18
18
  transformRuleContexts: {
19
19
  type: Function,
20
20
  required: false,
21
- default: ruleContexts => ruleContexts,
21
+ default: undefined,
22
22
  },
23
23
  },
24
24
  computed: {
@@ -36,7 +36,7 @@ export default {
36
36
  transformItems: {
37
37
  type: Function,
38
38
  required: false,
39
- default: items => items,
39
+ default: undefined,
40
40
  },
41
41
  },
42
42
  computed: {
@@ -8,6 +8,7 @@
8
8
  :refine="refine"
9
9
  :can-refine="canRefine"
10
10
  :range="state.range"
11
+ :send-event="state.sendEvent"
11
12
  >
12
13
  <form
13
14
  :class="suit('form')"
@@ -79,11 +80,13 @@ export default {
79
80
  min: {
80
81
  type: Number,
81
82
  required: false,
83
+ // @major: remove this default
82
84
  default: -Infinity,
83
85
  },
84
86
  max: {
85
87
  type: Number,
86
88
  required: false,
89
+ // @major: remove this default
87
90
  default: Infinity,
88
91
  },
89
92
  precision: {
@@ -7,6 +7,7 @@
7
7
  :items="state.items"
8
8
  :refine="state.refine"
9
9
  :createURL="state.createURL"
10
+ :send-event="state.sendEvent"
10
11
  >
11
12
  <svg
12
13
  xmlns="http://www.w3.org/2000/svg"
@@ -98,7 +99,7 @@ export default {
98
99
  },
99
100
  max: {
100
101
  type: Number,
101
- default: 5,
102
+ default: undefined,
102
103
  },
103
104
  },
104
105
  computed: {
@@ -17,6 +17,7 @@
17
17
  :createURL="state.createURL"
18
18
  :is-from-search="state.isFromSearch"
19
19
  :can-refine="state.canRefine"
20
+ :send-event="state.sendEvent"
20
21
  >
21
22
  <div
22
23
  :class="suit('searchBox')"
@@ -121,12 +122,12 @@ export default {
121
122
  },
122
123
  searchable: {
123
124
  type: Boolean,
124
- default: false,
125
+ default: undefined,
125
126
  },
126
127
  searchablePlaceholder: {
127
- default: 'Search here…',
128
128
  type: String,
129
129
  required: false,
130
+ default: 'Search here…',
130
131
  },
131
132
  operator: {
132
133
  default: 'or',
@@ -137,28 +138,28 @@ export default {
137
138
  },
138
139
  limit: {
139
140
  type: Number,
140
- default: 10,
141
141
  required: false,
142
+ default: undefined,
142
143
  },
143
144
  showMoreLimit: {
144
145
  type: Number,
145
- default: 20,
146
146
  required: false,
147
+ default: undefined,
147
148
  },
148
149
  showMore: {
149
150
  type: Boolean,
150
- default: false,
151
151
  required: false,
152
+ default: false,
152
153
  },
153
154
  sortBy: {
154
155
  type: [Array, Function],
155
- default: () => ['isRefined', 'count:desc', 'name:asc'],
156
156
  required: false,
157
+ default: undefined,
157
158
  },
158
159
  transformItems: {
159
160
  type: Function,
160
- default: items => items,
161
161
  required: false,
162
+ default: undefined,
162
163
  },
163
164
  },
164
165
  data() {
@@ -48,9 +48,7 @@ export default {
48
48
  },
49
49
  transformItems: {
50
50
  type: Function,
51
- default(items) {
52
- return items;
53
- },
51
+ default: undefined,
54
52
  },
55
53
  },
56
54
  computed: {
@@ -8,6 +8,7 @@
8
8
  :can-refine="canRefine"
9
9
  :refine="state.refine"
10
10
  :createURL="state.createURL"
11
+ :send-event="state.sendEvent"
11
12
  >
12
13
  <label :class="suit('label')">
13
14
  <input
@@ -62,8 +63,6 @@ export default {
62
63
  off: {
63
64
  type: [String, Number, Boolean, Array],
64
65
  required: false,
65
- // explicit otherwise Vue coerces the default value
66
- // to false because of the `Boolean` prop type
67
66
  default: undefined,
68
67
  },
69
68
  },