react-instantsearch-nextjs 1.2.13 → 1.3.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.
- package/dist/cjs/InitializePromise.js +42 -8
- package/dist/cjs/InstantSearchNext.js +3 -3
- package/dist/cjs/TriggerSearch.js +4 -18
- package/dist/es/InitializePromise.js +42 -8
- package/dist/es/InstantSearchNext.js +3 -3
- package/dist/es/TriggerSearch.d.ts +1 -3
- package/dist/es/TriggerSearch.js +4 -18
- package/package.json +4 -4
|
@@ -17,10 +17,20 @@ var _navigation = require("next/navigation");
|
|
|
17
17
|
var _react = require("react");
|
|
18
18
|
var _reactinstantsearchcore = require("react-instantsearch-core");
|
|
19
19
|
var _createInsertHTML = require("./createInsertHTML");
|
|
20
|
+
function isWithinIsolatedIndex(index) {
|
|
21
|
+
var current = index;
|
|
22
|
+
while(current){
|
|
23
|
+
if (current._isolated) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
current = current.getParent();
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
20
30
|
function InitializePromise(param) {
|
|
21
31
|
var nonce = param.nonce;
|
|
22
32
|
var search = (0, _reactinstantsearchcore.useInstantSearchContext)();
|
|
23
|
-
var
|
|
33
|
+
var _useRSCContext = (0, _reactinstantsearchcore.useRSCContext)(), waitForResultsRef = _useRSCContext.waitForResultsRef, resolveWaitForResultsRef = _useRSCContext.resolveWaitForResultsRef;
|
|
24
34
|
var insertHTML = (0, _react.useContext)(_navigation.ServerInsertedHTMLContext) || function() {
|
|
25
35
|
throw new Error('Missing ServerInsertedHTMLContext');
|
|
26
36
|
};
|
|
@@ -52,25 +62,46 @@ function InitializePromise(param) {
|
|
|
52
62
|
return new Promise(function(resolve) {
|
|
53
63
|
var searchReceived = false;
|
|
54
64
|
var recommendReceived = false;
|
|
55
|
-
|
|
65
|
+
var settled = false;
|
|
66
|
+
var derivedHelper = search.mainHelper.derivedHelpers[0];
|
|
67
|
+
var settle = function settle() {
|
|
68
|
+
if (settled) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
settled = true;
|
|
72
|
+
if (resolveWaitForResultsRef) {
|
|
73
|
+
resolveWaitForResultsRef.current = null;
|
|
74
|
+
}
|
|
75
|
+
resolve();
|
|
76
|
+
};
|
|
77
|
+
var onResult = function onResult() {
|
|
56
78
|
searchReceived = true;
|
|
57
79
|
if (!search._hasRecommendWidget || recommendReceived) {
|
|
58
|
-
|
|
80
|
+
settle();
|
|
59
81
|
}
|
|
60
|
-
}
|
|
61
|
-
|
|
82
|
+
};
|
|
83
|
+
var onRecommendResult = function onRecommendResult() {
|
|
62
84
|
recommendReceived = true;
|
|
63
85
|
if (!search._hasSearchWidget || searchReceived) {
|
|
64
|
-
|
|
86
|
+
settle();
|
|
65
87
|
}
|
|
66
|
-
}
|
|
88
|
+
};
|
|
89
|
+
if (resolveWaitForResultsRef) {
|
|
90
|
+
resolveWaitForResultsRef.current = function() {
|
|
91
|
+
derivedHelper.removeListener('result', onResult);
|
|
92
|
+
derivedHelper.removeListener('recommend:result', onRecommendResult);
|
|
93
|
+
settle();
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
derivedHelper.once('result', onResult);
|
|
97
|
+
derivedHelper.once('recommend:result', onRecommendResult);
|
|
67
98
|
});
|
|
68
99
|
};
|
|
69
100
|
var injectInitialResults = function injectInitialResults() {
|
|
70
101
|
var options = {
|
|
71
102
|
inserted: false
|
|
72
103
|
};
|
|
73
|
-
var results = (0, _server.getInitialResults)(search.mainIndex, requestParamsList);
|
|
104
|
+
var results = (0, _server.getInitialResults)(search.mainIndex, search._hasSearchWidget ? requestParamsList || [] : []);
|
|
74
105
|
insertHTML((0, _createInsertHTML.createInsertHTML)({
|
|
75
106
|
options: options,
|
|
76
107
|
results: results,
|
|
@@ -81,6 +112,9 @@ function InitializePromise(param) {
|
|
|
81
112
|
waitForResultsRef.current = (0, _reactinstantsearchcore.wrapPromiseWithState)(waitForResults().then(function() {
|
|
82
113
|
var shouldRefetch = false;
|
|
83
114
|
(0, _utils.walkIndex)(search.mainIndex, function(index) {
|
|
115
|
+
if (isWithinIsolatedIndex(index)) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
84
118
|
shouldRefetch = shouldRefetch || index.getWidgets().some(_utils.isTwoPassWidget);
|
|
85
119
|
});
|
|
86
120
|
if (shouldRefetch) {
|
|
@@ -70,13 +70,12 @@ function InstantSearchNext(_0) {
|
|
|
70
70
|
routing: routing
|
|
71
71
|
}), isServer && /*#__PURE__*/ _react.default.createElement(_InitializePromise.InitializePromise, {
|
|
72
72
|
nonce: nonce
|
|
73
|
-
}), children, isServer && /*#__PURE__*/ _react.default.createElement(_TriggerSearch.TriggerSearch,
|
|
74
|
-
nonce: nonce
|
|
75
|
-
})));
|
|
73
|
+
}), children, isServer && /*#__PURE__*/ _react.default.createElement(_TriggerSearch.TriggerSearch, null)));
|
|
76
74
|
}
|
|
77
75
|
function ServerOrHydrationProvider(param) {
|
|
78
76
|
var isServer = param.isServer, children = param.children, instance = param.instance, ignoreMultipleHooksWarning = param.ignoreMultipleHooksWarning;
|
|
79
77
|
var promiseRef = (0, _react.useRef)(null);
|
|
78
|
+
var resolvePromiseRef = (0, _react.useRef)(null);
|
|
80
79
|
var countRef = (0, _react.useRef)(0);
|
|
81
80
|
// Capture once on first render. Side-effect-free read keeps hydration
|
|
82
81
|
// deterministic across StrictMode double-invocation and React 19 / Next.js
|
|
@@ -105,6 +104,7 @@ function ServerOrHydrationProvider(param) {
|
|
|
105
104
|
return /*#__PURE__*/ _react.default.createElement(_reactinstantsearchcore.InstantSearchRSCContext.Provider, {
|
|
106
105
|
value: {
|
|
107
106
|
waitForResultsRef: rscWaitRef,
|
|
107
|
+
resolveWaitForResultsRef: resolvePromiseRef,
|
|
108
108
|
countRef: countRef,
|
|
109
109
|
ignoreMultipleHooksWarning: ignoreMultipleHooksWarning
|
|
110
110
|
}
|
|
@@ -9,18 +9,11 @@ Object.defineProperty(exports, "TriggerSearch", {
|
|
|
9
9
|
return TriggerSearch;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
-
var _navigation = require("next/navigation");
|
|
13
|
-
var _react = require("react");
|
|
14
12
|
var _reactinstantsearchcore = require("react-instantsearch-core");
|
|
15
|
-
|
|
16
|
-
function TriggerSearch(param) {
|
|
17
|
-
var nonce = param.nonce;
|
|
13
|
+
function TriggerSearch() {
|
|
18
14
|
var _waitForResultsRef_current;
|
|
19
15
|
var instantsearch = (0, _reactinstantsearchcore.useInstantSearchContext)();
|
|
20
|
-
var
|
|
21
|
-
var insertHTML = (0, _react.useContext)(_navigation.ServerInsertedHTMLContext) || function() {
|
|
22
|
-
throw new Error('Missing ServerInsertedHTMLContext');
|
|
23
|
-
};
|
|
16
|
+
var _useRSCContext = (0, _reactinstantsearchcore.useRSCContext)(), waitForResultsRef = _useRSCContext.waitForResultsRef, resolveWaitForResultsRef = _useRSCContext.resolveWaitForResultsRef;
|
|
24
17
|
if ((waitForResultsRef === null || waitForResultsRef === void 0 ? void 0 : (_waitForResultsRef_current = waitForResultsRef.current) === null || _waitForResultsRef_current === void 0 ? void 0 : _waitForResultsRef_current.status) === 'pending') {
|
|
25
18
|
var _instantsearch_mainHelper;
|
|
26
19
|
if (instantsearch._hasSearchWidget) {
|
|
@@ -33,16 +26,9 @@ function TriggerSearch(param) {
|
|
|
33
26
|
}
|
|
34
27
|
}
|
|
35
28
|
instantsearch._hasRecommendWidget && ((_instantsearch_mainHelper = instantsearch.mainHelper) === null || _instantsearch_mainHelper === void 0 ? void 0 : _instantsearch_mainHelper.recommend());
|
|
36
|
-
// If there are no widgets, we inject empty initial results instantly
|
|
37
29
|
if (!instantsearch._hasSearchWidget && !instantsearch._hasRecommendWidget) {
|
|
38
|
-
var
|
|
39
|
-
|
|
40
|
-
};
|
|
41
|
-
insertHTML((0, _createInsertHTML.createInsertHTML)({
|
|
42
|
-
options: options,
|
|
43
|
-
results: {},
|
|
44
|
-
nonce: nonce
|
|
45
|
-
}));
|
|
30
|
+
var _resolveWaitForResultsRef_current;
|
|
31
|
+
resolveWaitForResultsRef === null || resolveWaitForResultsRef === void 0 ? void 0 : (_resolveWaitForResultsRef_current = resolveWaitForResultsRef.current) === null || _resolveWaitForResultsRef_current === void 0 ? void 0 : _resolveWaitForResultsRef_current.call(resolveWaitForResultsRef);
|
|
46
32
|
}
|
|
47
33
|
}
|
|
48
34
|
return null;
|
|
@@ -7,10 +7,20 @@ import { useContext } from 'react';
|
|
|
7
7
|
import { useInstantSearchContext, useRSCContext, wrapPromiseWithState } from 'react-instantsearch-core';
|
|
8
8
|
import { createInsertHTML } from './createInsertHTML.js';
|
|
9
9
|
|
|
10
|
+
function isWithinIsolatedIndex(index) {
|
|
11
|
+
var current = index;
|
|
12
|
+
while(current){
|
|
13
|
+
if (current._isolated) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
current = current.getParent();
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
10
20
|
function InitializePromise(param) {
|
|
11
21
|
var nonce = param.nonce;
|
|
12
22
|
var search = useInstantSearchContext();
|
|
13
|
-
var
|
|
23
|
+
var _useRSCContext = useRSCContext(), waitForResultsRef = _useRSCContext.waitForResultsRef, resolveWaitForResultsRef = _useRSCContext.resolveWaitForResultsRef;
|
|
14
24
|
var insertHTML = useContext(ServerInsertedHTMLContext) || function() {
|
|
15
25
|
throw new Error('Missing ServerInsertedHTMLContext');
|
|
16
26
|
};
|
|
@@ -42,25 +52,46 @@ function InitializePromise(param) {
|
|
|
42
52
|
return new Promise(function(resolve) {
|
|
43
53
|
var searchReceived = false;
|
|
44
54
|
var recommendReceived = false;
|
|
45
|
-
|
|
55
|
+
var settled = false;
|
|
56
|
+
var derivedHelper = search.mainHelper.derivedHelpers[0];
|
|
57
|
+
var settle = function settle() {
|
|
58
|
+
if (settled) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
settled = true;
|
|
62
|
+
if (resolveWaitForResultsRef) {
|
|
63
|
+
resolveWaitForResultsRef.current = null;
|
|
64
|
+
}
|
|
65
|
+
resolve();
|
|
66
|
+
};
|
|
67
|
+
var onResult = function onResult() {
|
|
46
68
|
searchReceived = true;
|
|
47
69
|
if (!search._hasRecommendWidget || recommendReceived) {
|
|
48
|
-
|
|
70
|
+
settle();
|
|
49
71
|
}
|
|
50
|
-
}
|
|
51
|
-
|
|
72
|
+
};
|
|
73
|
+
var onRecommendResult = function onRecommendResult() {
|
|
52
74
|
recommendReceived = true;
|
|
53
75
|
if (!search._hasSearchWidget || searchReceived) {
|
|
54
|
-
|
|
76
|
+
settle();
|
|
55
77
|
}
|
|
56
|
-
}
|
|
78
|
+
};
|
|
79
|
+
if (resolveWaitForResultsRef) {
|
|
80
|
+
resolveWaitForResultsRef.current = function() {
|
|
81
|
+
derivedHelper.removeListener('result', onResult);
|
|
82
|
+
derivedHelper.removeListener('recommend:result', onRecommendResult);
|
|
83
|
+
settle();
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
derivedHelper.once('result', onResult);
|
|
87
|
+
derivedHelper.once('recommend:result', onRecommendResult);
|
|
57
88
|
});
|
|
58
89
|
};
|
|
59
90
|
var injectInitialResults = function injectInitialResults() {
|
|
60
91
|
var options = {
|
|
61
92
|
inserted: false
|
|
62
93
|
};
|
|
63
|
-
var results = getInitialResults(search.mainIndex, requestParamsList);
|
|
94
|
+
var results = getInitialResults(search.mainIndex, search._hasSearchWidget ? requestParamsList || [] : []);
|
|
64
95
|
insertHTML(createInsertHTML({
|
|
65
96
|
options: options,
|
|
66
97
|
results: results,
|
|
@@ -71,6 +102,9 @@ function InitializePromise(param) {
|
|
|
71
102
|
waitForResultsRef.current = wrapPromiseWithState(waitForResults().then(function() {
|
|
72
103
|
var shouldRefetch = false;
|
|
73
104
|
walkIndex(search.mainIndex, function(index) {
|
|
105
|
+
if (isWithinIsolatedIndex(index)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
74
108
|
shouldRefetch = shouldRefetch || index.getWidgets().some(isTwoPassWidget);
|
|
75
109
|
});
|
|
76
110
|
if (shouldRefetch) {
|
|
@@ -51,13 +51,12 @@ function InstantSearchNext(_0) {
|
|
|
51
51
|
routing: routing
|
|
52
52
|
}), isServer && /*#__PURE__*/ React.createElement(InitializePromise, {
|
|
53
53
|
nonce: nonce
|
|
54
|
-
}), children, isServer && /*#__PURE__*/ React.createElement(TriggerSearch,
|
|
55
|
-
nonce: nonce
|
|
56
|
-
})));
|
|
54
|
+
}), children, isServer && /*#__PURE__*/ React.createElement(TriggerSearch, null)));
|
|
57
55
|
}
|
|
58
56
|
function ServerOrHydrationProvider(param) {
|
|
59
57
|
var isServer = param.isServer, children = param.children, instance = param.instance, ignoreMultipleHooksWarning = param.ignoreMultipleHooksWarning;
|
|
60
58
|
var promiseRef = useRef(null);
|
|
59
|
+
var resolvePromiseRef = useRef(null);
|
|
61
60
|
var countRef = useRef(0);
|
|
62
61
|
// Capture once on first render. Side-effect-free read keeps hydration
|
|
63
62
|
// deterministic across StrictMode double-invocation and React 19 / Next.js
|
|
@@ -86,6 +85,7 @@ function ServerOrHydrationProvider(param) {
|
|
|
86
85
|
return /*#__PURE__*/ React.createElement(InstantSearchRSCContext.Provider, {
|
|
87
86
|
value: {
|
|
88
87
|
waitForResultsRef: rscWaitRef,
|
|
88
|
+
resolveWaitForResultsRef: resolvePromiseRef,
|
|
89
89
|
countRef: countRef,
|
|
90
90
|
ignoreMultipleHooksWarning: ignoreMultipleHooksWarning
|
|
91
91
|
}
|
package/dist/es/TriggerSearch.js
CHANGED
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
import { ServerInsertedHTMLContext } from 'next/navigation.js';
|
|
2
|
-
import { useContext } from 'react';
|
|
3
1
|
import { useInstantSearchContext, useRSCContext } from 'react-instantsearch-core';
|
|
4
|
-
import { createInsertHTML } from './createInsertHTML.js';
|
|
5
2
|
|
|
6
|
-
function TriggerSearch(
|
|
7
|
-
var nonce = param.nonce;
|
|
3
|
+
function TriggerSearch() {
|
|
8
4
|
var _waitForResultsRef_current;
|
|
9
5
|
var instantsearch = useInstantSearchContext();
|
|
10
|
-
var
|
|
11
|
-
var insertHTML = useContext(ServerInsertedHTMLContext) || function() {
|
|
12
|
-
throw new Error('Missing ServerInsertedHTMLContext');
|
|
13
|
-
};
|
|
6
|
+
var _useRSCContext = useRSCContext(), waitForResultsRef = _useRSCContext.waitForResultsRef, resolveWaitForResultsRef = _useRSCContext.resolveWaitForResultsRef;
|
|
14
7
|
if ((waitForResultsRef === null || waitForResultsRef === void 0 ? void 0 : (_waitForResultsRef_current = waitForResultsRef.current) === null || _waitForResultsRef_current === void 0 ? void 0 : _waitForResultsRef_current.status) === 'pending') {
|
|
15
8
|
var _instantsearch_mainHelper;
|
|
16
9
|
if (instantsearch._hasSearchWidget) {
|
|
@@ -23,16 +16,9 @@ function TriggerSearch(param) {
|
|
|
23
16
|
}
|
|
24
17
|
}
|
|
25
18
|
instantsearch._hasRecommendWidget && ((_instantsearch_mainHelper = instantsearch.mainHelper) === null || _instantsearch_mainHelper === void 0 ? void 0 : _instantsearch_mainHelper.recommend());
|
|
26
|
-
// If there are no widgets, we inject empty initial results instantly
|
|
27
19
|
if (!instantsearch._hasSearchWidget && !instantsearch._hasRecommendWidget) {
|
|
28
|
-
var
|
|
29
|
-
|
|
30
|
-
};
|
|
31
|
-
insertHTML(createInsertHTML({
|
|
32
|
-
options: options,
|
|
33
|
-
results: {},
|
|
34
|
-
nonce: nonce
|
|
35
|
-
}));
|
|
20
|
+
var _resolveWaitForResultsRef_current;
|
|
21
|
+
resolveWaitForResultsRef === null || resolveWaitForResultsRef === void 0 ? void 0 : (_resolveWaitForResultsRef_current = resolveWaitForResultsRef.current) === null || _resolveWaitForResultsRef_current === void 0 ? void 0 : _resolveWaitForResultsRef_current.call(resolveWaitForResultsRef);
|
|
36
22
|
}
|
|
37
23
|
}
|
|
38
24
|
return null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-instantsearch-nextjs",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "React InstantSearch SSR utilities for Next.js",
|
|
5
5
|
"types": "dist/es/index.d.ts",
|
|
6
6
|
"main": "dist/cjs/index.js",
|
|
@@ -52,9 +52,9 @@
|
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@playwright/test": "1.49.1",
|
|
55
|
-
"instantsearch.js": "4.
|
|
55
|
+
"instantsearch.js": "4.107.0",
|
|
56
56
|
"next": "16.0.7",
|
|
57
|
-
"react-instantsearch-core": "7.
|
|
57
|
+
"react-instantsearch-core": "7.40.0",
|
|
58
58
|
"start-server-and-test": "1.15.3",
|
|
59
59
|
"ts-node": "8.4.1"
|
|
60
60
|
},
|
|
@@ -62,5 +62,5 @@
|
|
|
62
62
|
"next": ">= 13.4 < 17",
|
|
63
63
|
"react-instantsearch": ">= 7.1.0 < 8"
|
|
64
64
|
},
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "fb0b778cd3ae013c3497bb2040ef7e9dfcdef6ca"
|
|
66
66
|
}
|