react-instantsearch-nextjs 1.2.12 → 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.
@@ -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 waitForResultsRef = (0, _reactinstantsearchcore.useRSCContext)().waitForResultsRef;
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
- search.mainHelper.derivedHelpers[0].once('result', function() {
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
- resolve();
80
+ settle();
59
81
  }
60
- });
61
- search.mainHelper.derivedHelpers[0].once('recommend:result', function() {
82
+ };
83
+ var onRecommendResult = function onRecommendResult() {
62
84
  recommendReceived = true;
63
85
  if (!search._hasSearchWidget || searchReceived) {
64
- resolve();
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
- var _createInsertHTML = require("./createInsertHTML");
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 waitForResultsRef = (0, _reactinstantsearchcore.useRSCContext)().waitForResultsRef;
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 options = {
39
- inserted: false
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 waitForResultsRef = useRSCContext().waitForResultsRef;
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
- search.mainHelper.derivedHelpers[0].once('result', function() {
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
- resolve();
70
+ settle();
49
71
  }
50
- });
51
- search.mainHelper.derivedHelpers[0].once('recommend:result', function() {
72
+ };
73
+ var onRecommendResult = function onRecommendResult() {
52
74
  recommendReceived = true;
53
75
  if (!search._hasSearchWidget || searchReceived) {
54
- resolve();
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
  }
@@ -1,3 +1 @@
1
- export declare function TriggerSearch({ nonce }: {
2
- nonce?: string;
3
- }): null;
1
+ export declare function TriggerSearch(): null;
@@ -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(param) {
7
- var nonce = param.nonce;
3
+ function TriggerSearch() {
8
4
  var _waitForResultsRef_current;
9
5
  var instantsearch = useInstantSearchContext();
10
- var waitForResultsRef = useRSCContext().waitForResultsRef;
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 options = {
29
- inserted: false
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.2.12",
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.105.0",
55
+ "instantsearch.js": "4.107.0",
56
56
  "next": "16.0.7",
57
- "react-instantsearch-core": "7.39.0",
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": "934a48eaf77e7c6b3e7c2e018daa1f95b9f246e7"
65
+ "gitHead": "fb0b778cd3ae013c3497bb2040ef7e9dfcdef6ca"
66
66
  }