@coveo/headless 3.29.2-pre.ee24f8bd85 → 3.29.2-pre.ee94bc7801

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 (117) hide show
  1. package/dist/cjs/case-assist/headless.cjs +1 -1
  2. package/dist/cjs/commerce/headless.cjs +1 -1
  3. package/dist/cjs/headless.cjs +1 -1
  4. package/dist/cjs/insight/headless.cjs +1 -1
  5. package/dist/cjs/recommendation/headless.cjs +1 -1
  6. package/dist/cjs/ssr/headless.cjs +1 -1
  7. package/dist/cjs/ssr-commerce/headless.cjs +1 -1
  8. package/dist/cjs/ssr-commerce/node.cjs.stats.json +1 -1
  9. package/dist/cjs/ssr-commerce-next/headless.cjs +1 -1
  10. package/dist/cjs/ssr-commerce-next/node.cjs.stats.json +1 -1
  11. package/dist/cjs/ssr-next/headless.cjs +1 -1
  12. package/dist/definitions/ssr-commerce-next.index.d.ts +3 -3
  13. package/dist/definitions/ssr-commerce.index.d.ts +1 -1
  14. package/dist/definitions/ssr-next/commerce/controller-utils.d.ts +7 -5
  15. package/dist/definitions/ssr-next/commerce/controllers/recommendations/headless-recommendations.ssr.d.ts +8 -4
  16. package/dist/definitions/ssr-next/commerce/engine/commerce-engine.ssr.d.ts +1 -2
  17. package/dist/definitions/ssr-next/commerce/factories/build-factory.d.ts +5 -7
  18. package/dist/definitions/ssr-next/commerce/factories/hydrated-state-factory.d.ts +5 -3
  19. package/dist/definitions/ssr-next/commerce/factories/recommendation-hydrated-state-factory.d.ts +4 -3
  20. package/dist/definitions/ssr-next/commerce/factories/recommendation-static-state-factory.d.ts +12 -3
  21. package/dist/definitions/ssr-next/commerce/factories/static-state-factory.d.ts +7 -3
  22. package/dist/definitions/ssr-next/commerce/types/build.d.ts +55 -10
  23. package/dist/definitions/ssr-next/commerce/types/controller-definitions.d.ts +7 -122
  24. package/dist/definitions/ssr-next/commerce/types/controller-inference.d.ts +5 -10
  25. package/dist/definitions/ssr-next/commerce/types/engine.d.ts +12 -16
  26. package/dist/definitions/ssr-next/commerce/types/fetch-static-state.d.ts +2 -2
  27. package/dist/definitions/ssr-next/commerce/types/hydrate-static-state.d.ts +4 -4
  28. package/dist/definitions/ssr-next/commerce/utils/controller-wiring.d.ts +4 -7
  29. package/dist/definitions/ssr-next/commerce/utils/engine-wiring.d.ts +1 -2
  30. package/dist/definitions/ssr-next/commerce/utils/recommendation-filter.d.ts +15 -2
  31. package/dist/definitions/ssr-next/common/types/controller-inference.d.ts +6 -0
  32. package/dist/definitions/ssr-next/common/types/controllers.d.ts +0 -24
  33. package/dist/definitions/ssr-next/common/types/engine.d.ts +2 -44
  34. package/dist/definitions/ssr-next/common/types/utilities.d.ts +0 -3
  35. package/dist/definitions/ssr-next/{common → search}/controller-utils.d.ts +3 -3
  36. package/dist/definitions/ssr-next/search/controllers/breadcrumb-manager/headless-breadcrumb-manager.ssr.d.ts +1 -1
  37. package/dist/definitions/ssr-next/search/controllers/context/headless-context.ssr.d.ts +1 -1
  38. package/dist/definitions/ssr-next/search/controllers/dictionary-field-context/headless-dictionary-field-context.ssr.d.ts +1 -1
  39. package/dist/definitions/ssr-next/search/controllers/did-you-mean/headless-did-you-mean.ssr.d.ts +1 -1
  40. package/dist/definitions/ssr-next/search/controllers/facet-manager/headless-facet-manager.ssr.d.ts +1 -1
  41. package/dist/definitions/ssr-next/search/controllers/facets/automatic-facet-generator/headless-automatic-facet-generator.ssr.d.ts +1 -1
  42. package/dist/definitions/ssr-next/search/controllers/facets/category-facet/headless-category-facet.ssr.d.ts +1 -1
  43. package/dist/definitions/ssr-next/search/controllers/facets/facet/headless-facet.ssr.d.ts +1 -1
  44. package/dist/definitions/ssr-next/search/controllers/facets/range-facet/date-facet/headless-date-facet.ssr.d.ts +1 -1
  45. package/dist/definitions/ssr-next/search/controllers/facets/range-facet/date-facet/headless-date-filter.ssr.d.ts +1 -1
  46. package/dist/definitions/ssr-next/search/controllers/facets/range-facet/numeric-facet/headless-numeric-facet.ssr.d.ts +1 -1
  47. package/dist/definitions/ssr-next/search/controllers/facets/range-facet/numeric-facet/headless-numeric-filter.ssr.d.ts +1 -1
  48. package/dist/definitions/ssr-next/search/controllers/field-suggestions/category-facet/headless-category-field-suggestions.ssr.d.ts +1 -1
  49. package/dist/definitions/ssr-next/search/controllers/field-suggestions/facet/headless-field-suggestions.ssr.d.ts +1 -1
  50. package/dist/definitions/ssr-next/search/controllers/folded-result-list/headless-folded-result-list.ssr.d.ts +1 -1
  51. package/dist/definitions/ssr-next/search/controllers/history-manager/headless-history-manager.ssr.d.ts +1 -1
  52. package/dist/definitions/ssr-next/search/controllers/instant-results/instant-results.ssr.d.ts +1 -1
  53. package/dist/definitions/ssr-next/search/controllers/pager/headless-pager.ssr.d.ts +1 -1
  54. package/dist/definitions/ssr-next/search/controllers/query-error/headless-query-error.ssr.d.ts +1 -1
  55. package/dist/definitions/ssr-next/search/controllers/query-summary/headless-query-summary.ssr.d.ts +1 -1
  56. package/dist/definitions/ssr-next/search/controllers/quickview/headless-quickview.ssr.d.ts +1 -1
  57. package/dist/definitions/ssr-next/search/controllers/recent-queries-list/headless-recent-queries-list.ssr.d.ts +1 -1
  58. package/dist/definitions/ssr-next/search/controllers/recent-results-list/headless-recent-results-list.ssr.d.ts +1 -1
  59. package/dist/definitions/ssr-next/search/controllers/relevance-inspector/headless-relevance-inspector.ssr.d.ts +1 -1
  60. package/dist/definitions/ssr-next/search/controllers/result-list/headless-result-list.ssr.d.ts +1 -1
  61. package/dist/definitions/ssr-next/search/controllers/results-per-page/headless-results-per-page.ssr.d.ts +1 -1
  62. package/dist/definitions/ssr-next/search/controllers/search-box/headless-search-box.ssr.d.ts +1 -1
  63. package/dist/definitions/ssr-next/search/controllers/search-parameter-manager/headless-search-parameter-manager.ssr.d.ts +1 -1
  64. package/dist/definitions/ssr-next/search/controllers/search-status/headless-search-status.ssr.d.ts +1 -1
  65. package/dist/definitions/ssr-next/search/controllers/smart-snippet/headless-smart-snippet.ssr.d.ts +1 -1
  66. package/dist/definitions/ssr-next/search/controllers/smart-snippet-questions-list/headless-smart-snippet-questions-list.ssr.d.ts +1 -1
  67. package/dist/definitions/ssr-next/search/controllers/sort/headless-sort.ssr.d.ts +1 -1
  68. package/dist/definitions/ssr-next/search/controllers/standalone-search-box/headless-standalone-search-box.ssr.d.ts +1 -1
  69. package/dist/definitions/ssr-next/search/controllers/static-filter/headless-static-filter.ssr.d.ts +1 -1
  70. package/dist/definitions/ssr-next/search/controllers/tab/headless-tab.ssr.d.ts +1 -1
  71. package/dist/definitions/ssr-next/search/controllers/tab-manager/headless-tab-manager.ssr.d.ts +1 -1
  72. package/dist/definitions/ssr-next/search/controllers/triggers/headless-execute-trigger.ssr.d.ts +1 -1
  73. package/dist/definitions/ssr-next/search/controllers/triggers/headless-notify-trigger.ssr.d.ts +1 -1
  74. package/dist/definitions/ssr-next/search/controllers/triggers/headless-query-trigger.ssr.d.ts +1 -1
  75. package/dist/definitions/ssr-next/search/controllers/triggers/headless-redirection-trigger.ssr.d.ts +1 -1
  76. package/dist/definitions/ssr-next/search/controllers/url-manager/headless-url-manager.ssr.d.ts +1 -1
  77. package/dist/definitions/ssr-next/search/engine/search-engine.ssr.d.ts +6 -13
  78. package/dist/definitions/ssr-next/search/types/build.d.ts +12 -0
  79. package/dist/definitions/ssr-next/search/types/controller-definition.d.ts +28 -0
  80. package/dist/definitions/ssr-next/{common/types/inference.d.ts → search/types/controller-inference.d.ts} +3 -6
  81. package/dist/definitions/ssr-next/search/types/engine.d.ts +52 -0
  82. package/dist/definitions/ssr-next/{common → search}/types/fetch-static-state.d.ts +5 -4
  83. package/dist/definitions/ssr-next/{common → search}/types/hydrate-static-state.d.ts +5 -6
  84. package/dist/definitions/ssr-next.index.d.ts +6 -4
  85. package/dist/definitions/test/mock-ssr-controller-definitions.d.ts +13 -1
  86. package/dist/esm/ssr-next/commerce/controllers/breadcrumb-manager/headless-core-breadcrumb-manager.ssr.js +1 -1
  87. package/dist/esm/ssr-next/commerce/controllers/generator/headless-commerce-facet-generator.ssr.js +1 -1
  88. package/dist/esm/ssr-next/commerce/controllers/pagination/headless-core-commerce-pagination.ssr.js +1 -1
  89. package/dist/esm/ssr-next/commerce/controllers/parameter-manager/headless-core-parameter-manager.ssr.js +1 -1
  90. package/dist/esm/ssr-next/commerce/controllers/recommendations/headless-recommendations.ssr.js +1 -1
  91. package/dist/esm/ssr-next/commerce/controllers/sort/headless-core-commerce-sort.ssr.js +1 -1
  92. package/dist/esm/ssr-next/commerce/controllers/summary/headless-core-summary.ssr.js +1 -1
  93. package/dist/esm/ssr-next/commerce/factories/build-factory.js +11 -11
  94. package/dist/esm/ssr-next/commerce/factories/hydrated-state-factory.js +0 -3
  95. package/dist/esm/ssr-next/commerce/factories/recommendation-hydrated-state-factory.js +2 -5
  96. package/dist/esm/ssr-next/commerce/factories/recommendation-static-state-factory.js +3 -12
  97. package/dist/esm/ssr-next/commerce/factories/static-state-factory.js +1 -1
  98. package/dist/esm/ssr-next/commerce/utils/controller-wiring.js +32 -15
  99. package/dist/esm/ssr-next/commerce/utils/recommendation-filter.js +27 -8
  100. package/dist/esm/ssr-next/{common → search}/controller-utils.js +2 -2
  101. package/dist/esm/ssr-next/search/engine/search-engine.ssr.js +1 -1
  102. package/dist/esm/ssr-next/search/types/engine.js +1 -0
  103. package/dist/esm/ssr-next/search/types/fetch-static-state.js +1 -0
  104. package/dist/esm/ssr-next/search/types/hydrate-static-state.js +1 -0
  105. package/dist/esm/test/mock-ssr-controller-definitions.js +15 -0
  106. package/dist/esm/utils/version.js +1 -1
  107. package/dist/quantic/case-assist/headless.js +1 -1
  108. package/dist/quantic/commerce/headless.js +1 -1
  109. package/dist/quantic/headless.js +1 -1
  110. package/dist/quantic/insight/headless.js +1 -1
  111. package/dist/quantic/recommendation/headless.js +1 -1
  112. package/package.json +1 -1
  113. package/dist/definitions/ssr-next/common/types/build.d.ts +0 -12
  114. /package/dist/esm/ssr-next/common/types/{build.js → controller-inference.js} +0 -0
  115. /package/dist/esm/ssr-next/{common/types/fetch-static-state.js → search/types/build.js} +0 -0
  116. /package/dist/esm/ssr-next/{common/types/hydrate-static-state.js → search/types/controller-definition.js} +0 -0
  117. /package/dist/esm/ssr-next/{common/types/inference.js → search/types/controller-inference.js} +0 -0
@@ -1,10 +1,10 @@
1
1
  import type { NavigatorContextProvider } from '../../../app/navigator-context-provider.js';
2
- import { type SearchEngine, type SearchEngineOptions } from '../../../app/search-engine/search-engine.js';
2
+ import { type SearchEngine } from '../../../app/search-engine/search-engine.js';
3
3
  import type { Controller } from '../../../controllers/controller/headless-controller.js';
4
4
  import type { LegacySearchAction } from '../../../features/analytics/analytics-utils.js';
5
- import type { ControllerDefinitionsMap } from '../../common/types/controllers.js';
6
- import type { EngineDefinition, EngineDefinitionOptions } from '../../common/types/engine.js';
7
- import type { InferControllerPropsMapFromDefinitions, InferControllerStaticStateMapFromDefinitions } from '../../common/types/inference.js';
5
+ import type { ControllerDefinitionsMap } from '../types/controller-definition.js';
6
+ import type { InferControllerPropsMapFromDefinitions, InferControllerStaticStateMapFromDefinitions } from '../types/controller-inference.js';
7
+ import type { SearchEngineDefinitionOptions } from '../types/engine.js';
8
8
  /**
9
9
  * The SSR search engine.
10
10
  *
@@ -16,14 +16,7 @@ export interface SSRSearchEngine extends SearchEngine {
16
16
  */
17
17
  waitForSearchCompletedAction(): Promise<SearchCompletedAction>;
18
18
  }
19
- /**
20
- * The options to create a search engine definition in SSR.
21
- *
22
- * @group Engine
23
- */
24
- export type SearchEngineDefinitionOptions<TControllers extends ControllerDefinitionsMap<SSRSearchEngine, Controller>> = EngineDefinitionOptions<SearchEngineOptions, TControllers>;
25
19
  export type SearchCompletedAction = ReturnType<LegacySearchAction['fulfilled' | 'rejected']>;
26
- export type SearchEngineDefinition<TControllers extends ControllerDefinitionsMap<SSRSearchEngine, Controller>> = EngineDefinition<SSRSearchEngine, TControllers>;
27
20
  /**
28
21
  * Initializes a Search engine definition in SSR with given controllers definitions and search engine config.
29
22
  *
@@ -34,7 +27,7 @@ export type SearchEngineDefinition<TControllers extends ControllerDefinitionsMap
34
27
  * @group Engine
35
28
  */
36
29
  export declare function defineSearchEngine<TControllerDefinitions extends ControllerDefinitionsMap<SearchEngine, Controller>>(options: SearchEngineDefinitionOptions<TControllerDefinitions>): {
37
- fetchStaticState: import("../../common/types/fetch-static-state.js").FetchStaticState<import("redux").AnyAction, InferControllerStaticStateMapFromDefinitions<TControllerDefinitions>, InferControllerPropsMapFromDefinitions<TControllerDefinitions>>;
38
- hydrateStaticState: import("../../common/types/hydrate-static-state.js").HydrateStaticState<SSRSearchEngine, import("../../common/types/inference.js").InferControllersMapFromDefinition<TControllerDefinitions>, import("redux").AnyAction, InferControllerPropsMapFromDefinitions<TControllerDefinitions>>;
30
+ fetchStaticState: import("../types/fetch-static-state.js").FetchStaticState<import("redux").AnyAction, InferControllerStaticStateMapFromDefinitions<TControllerDefinitions>, InferControllerPropsMapFromDefinitions<TControllerDefinitions>>;
31
+ hydrateStaticState: import("../types/hydrate-static-state.js").HydrateStaticState<SSRSearchEngine, import("../types/controller-inference.js").InferControllersMapFromDefinition<TControllerDefinitions>, import("redux").AnyAction, InferControllerPropsMapFromDefinitions<TControllerDefinitions>>;
39
32
  setNavigatorContextProvider: (navigatorContextProvider: NavigatorContextProvider) => void;
40
33
  };
@@ -0,0 +1,12 @@
1
+ import type { CoreEngine, CoreEngineNext } from '../../../app/engine.js';
2
+ import type { ControllersMap, ControllersPropsMap } from '../../common/types/controllers.js';
3
+ import type { OptionsExtender, OptionsTuple } from '../../common/types/utilities.js';
4
+ import type { SearchEngineDefinitionBuildResult, SearchEngineDefinitionControllersPropsOption } from './engine.js';
5
+ interface BuildOptions<TEngineOptions> {
6
+ extend?: OptionsExtender<TEngineOptions>;
7
+ }
8
+ /**
9
+ * @internal
10
+ */
11
+ export type Build<TEngine extends CoreEngine | CoreEngineNext, TEngineOptions, TControllersMap extends ControllersMap, TControllersProps extends ControllersPropsMap> = (...params: OptionsTuple<BuildOptions<TEngineOptions> & SearchEngineDefinitionControllersPropsOption<TControllersProps>>) => Promise<SearchEngineDefinitionBuildResult<TEngine, TControllersMap>>;
12
+ export {};
@@ -0,0 +1,28 @@
1
+ import type { CoreEngine, CoreEngineNext } from '../../../app/engine.js';
2
+ import type { Controller } from '../../../controllers/controller/headless-controller.js';
3
+ import type { InferControllerStaticStateFromController, InferControllerStaticStateMapFromControllers } from '../../common/types/controller-inference.js';
4
+ import type { InferHydratedState, InferStaticState } from '../../common/types/engine.js';
5
+ export type { InferStaticState, InferHydratedState, InferControllerStaticStateFromController, InferControllerStaticStateMapFromControllers, };
6
+ export interface ControllerDefinitionWithoutProps<TEngine extends CoreEngine | CoreEngineNext, TController extends Controller> {
7
+ /**
8
+ * Creates an instance of the given controller.
9
+ *
10
+ * @param engine - The search engine.
11
+ * @returns The controller.
12
+ */
13
+ build(engine: TEngine): TController;
14
+ }
15
+ export interface ControllerDefinitionWithProps<TEngine extends CoreEngine | CoreEngineNext, TController extends Controller, TProps> {
16
+ /**
17
+ * Creates an instance of the given controller.
18
+ *
19
+ * @param engine - The search engine.
20
+ * @param props - The controller properties.
21
+ * @returns The controller.
22
+ */
23
+ buildWithProps(engine: TEngine, props?: TProps): TController;
24
+ }
25
+ export type ControllerDefinition<TEngine extends CoreEngine | CoreEngineNext, TController extends Controller> = ControllerDefinitionWithoutProps<TEngine, TController> | ControllerDefinitionWithProps<TEngine, TController, unknown>;
26
+ export interface ControllerDefinitionsMap<TEngine extends CoreEngine | CoreEngineNext, TController extends Controller> {
27
+ [customName: string]: ControllerDefinition<TEngine, TController>;
28
+ }
@@ -1,7 +1,8 @@
1
1
  import type { CoreEngine, CoreEngineNext } from '../../../app/engine.js';
2
2
  import type { Controller } from '../../../controllers/controller/headless-controller.js';
3
- import type { ControllerDefinition, ControllerDefinitionsMap, ControllerDefinitionWithoutProps, ControllerDefinitionWithProps, ControllerStaticState, ControllersMap } from './controllers.js';
4
- import type { HasKeys } from './utilities.js';
3
+ import type { InferControllerStaticStateFromController } from '../../common/types/controller-inference.js';
4
+ import type { HasKeys } from '../../common/types/utilities.js';
5
+ import type { ControllerDefinition, ControllerDefinitionsMap, ControllerDefinitionWithoutProps, ControllerDefinitionWithProps } from './controller-definition.js';
5
6
  type InferControllerPropsFromDefinition<TController extends ControllerDefinition<CoreEngine | CoreEngineNext, Controller>> = TController extends ControllerDefinitionWithProps<CoreEngine | CoreEngineNext, Controller, infer Props> ? Props : TController extends ControllerDefinitionWithoutProps<CoreEngine | CoreEngineNext, Controller> ? {} : unknown;
6
7
  export type InferControllerPropsMapFromDefinitions<TControllers extends ControllerDefinitionsMap<CoreEngine | CoreEngineNext, Controller>> = {
7
8
  [K in keyof TControllers as HasKeys<InferControllerPropsFromDefinition<TControllers[K]>> extends false ? never : K]: InferControllerPropsFromDefinition<TControllers[K]>;
@@ -10,11 +11,7 @@ export type InferControllerFromDefinition<TDefinition extends ControllerDefiniti
10
11
  export type InferControllersMapFromDefinition<TControllers extends ControllerDefinitionsMap<CoreEngine | CoreEngineNext, Controller>> = {
11
12
  [K in keyof TControllers]: InferControllerFromDefinition<TControllers[K]>;
12
13
  };
13
- export type InferControllerStaticStateFromController<TController extends Controller> = ControllerStaticState<TController['state']>;
14
14
  export type InferControllerStaticStateMapFromDefinitions<TControllers extends ControllerDefinitionsMap<CoreEngine | CoreEngineNext, Controller>> = {
15
15
  [K in keyof TControllers]: InferControllerStaticStateFromController<InferControllerFromDefinition<TControllers[K]>> & InferControllerPropsFromDefinition<TControllers[K]>;
16
16
  };
17
- export type InferControllerStaticStateMapFromControllers<TControllers extends ControllersMap> = {
18
- [K in keyof TControllers]: InferControllerStaticStateFromController<TControllers[K]>;
19
- };
20
17
  export {};
@@ -0,0 +1,52 @@
1
+ import type { AnyAction } from '@reduxjs/toolkit';
2
+ import type { CoreEngine, CoreEngineNext } from '../../../app/engine.js';
3
+ import type { NavigatorContextProvider } from '../../../app/navigator-context-provider.js';
4
+ import type { SearchEngineOptions } from '../../../app/search-engine/search-engine.js';
5
+ import type { Controller } from '../../../controllers/controller/headless-controller.js';
6
+ import type { ControllersMap, ControllersPropsMap } from '../../common/types/controllers.js';
7
+ import type { HasKeys } from '../../common/types/utilities.js';
8
+ import type { SSRSearchEngine } from '../engine/search-engine.ssr.js';
9
+ import type { Build } from './build.js';
10
+ import type { ControllerDefinitionsMap } from './controller-definition.js';
11
+ import type { InferControllerPropsMapFromDefinitions, InferControllerStaticStateMapFromDefinitions, InferControllersMapFromDefinition } from './controller-inference.js';
12
+ import type { FetchStaticState } from './fetch-static-state.js';
13
+ import type { HydrateStaticState } from './hydrate-static-state.js';
14
+ export type EngineBuildResult<TEngine extends CoreEngine | CoreEngineNext, TControllers extends ControllerDefinitionsMap<TEngine, Controller>, TEngineOptions> = Build<TEngine, TEngineOptions, InferControllersMapFromDefinition<TControllers>, InferControllerPropsMapFromDefinitions<TControllers>>;
15
+ /**
16
+ * The options to create a search engine definition in SSR.
17
+ *
18
+ * @group Engine
19
+ */
20
+ export type SearchEngineDefinitionOptions<TControllers extends ControllerDefinitionsMap<SSRSearchEngine, Controller>> = SearchEngineOptions & {
21
+ /**
22
+ * The controllers to initialize with the search engine.
23
+ */
24
+ controllers?: TControllers;
25
+ };
26
+ export interface SearchEngineDefinition<TEngine extends CoreEngine | CoreEngineNext, TControllers extends ControllerDefinitionsMap<TEngine, Controller>> {
27
+ /**
28
+ * Fetches the static state on the server side using your engine definition.
29
+ */
30
+ fetchStaticState: FetchStaticState<AnyAction, InferControllerStaticStateMapFromDefinitions<TControllers>, InferControllerPropsMapFromDefinitions<TControllers>>;
31
+ /**
32
+ * Fetches the hydrated state on the client side using your engine definition and the static state.
33
+ */
34
+ hydrateStaticState: HydrateStaticState<TEngine, InferControllersMapFromDefinition<TControllers>, AnyAction, InferControllerPropsMapFromDefinitions<TControllers>>;
35
+ /**
36
+ * Sets the navigator context provider.
37
+ * This provider is essential for retrieving navigation-related data such as referrer, userAgent, location, and clientId, which are crucial for handling both server-side and client-side API requests effectively.
38
+ *
39
+ * Note: The implementation specifics of the navigator context provider depend on the Node.js framework being utilized. It is the developer's responsibility to appropriately define and implement the navigator context provider to ensure accurate navigation context is available throughout the application. If the user fails to provide a navigator context provider, a warning will be logged either on the server or the browser console.
40
+ */
41
+ setNavigatorContextProvider: (navigatorContextProvider: NavigatorContextProvider) => void;
42
+ }
43
+ /**
44
+ * This type defines the required and optional controller props for the search engine definition.
45
+ */
46
+ export type SearchEngineDefinitionControllersPropsOption<TControllersPropsMap extends ControllersPropsMap> = HasKeys<TControllersPropsMap> extends false ? {} : {
47
+ controllers: TControllersPropsMap;
48
+ };
49
+ export interface SearchEngineDefinitionBuildResult<TEngine extends CoreEngine | CoreEngineNext, TControllers extends ControllersMap> {
50
+ engine: TEngine;
51
+ controllers: TControllers;
52
+ }
@@ -1,10 +1,11 @@
1
1
  import type { UnknownAction } from '@reduxjs/toolkit';
2
- import type { ControllerStaticStateMap, ControllersPropsMap } from './controllers.js';
3
- import type { EngineDefinitionControllersPropsOption, EngineStaticState } from './engine.js';
4
- import type { OptionsTuple } from './utilities.js';
2
+ import type { ControllerStaticStateMap, ControllersPropsMap } from '../../common/types/controllers.js';
3
+ import type { EngineStaticState } from '../../common/types/engine.js';
4
+ import type { OptionsTuple } from '../../common/types/utilities.js';
5
+ import type { SearchEngineDefinitionControllersPropsOption } from './engine.js';
5
6
  /**
6
7
  * Executes only the initial search for a given configuration, then returns a resumable snapshot of engine state along with the state of the controllers.
7
8
  *
8
9
  * Useful for static generation and server-side rendering.
9
10
  */
10
- export type FetchStaticState<TSearchAction extends UnknownAction, TControllersStaticState extends ControllerStaticStateMap, TControllersProps extends ControllersPropsMap> = (...params: OptionsTuple<EngineDefinitionControllersPropsOption<TControllersProps>>) => Promise<EngineStaticState<TSearchAction, TControllersStaticState>>;
11
+ export type FetchStaticState<TSearchAction extends UnknownAction, TControllersStaticState extends ControllerStaticStateMap, TControllersProps extends ControllersPropsMap> = (...params: OptionsTuple<SearchEngineDefinitionControllersPropsOption<TControllersProps>>) => Promise<EngineStaticState<TSearchAction, TControllersStaticState>>;
@@ -1,17 +1,16 @@
1
1
  import type { UnknownAction } from '@reduxjs/toolkit';
2
2
  import type { CoreEngine, CoreEngineNext } from '../../../app/engine.js';
3
- import type { ControllersMap, ControllersPropsMap } from './controllers.js';
4
- import type { EngineDefinitionBuildResult, EngineDefinitionControllersPropsOption } from './engine.js';
5
- import type { OptionsTuple } from './utilities.js';
3
+ import type { ControllersMap, ControllersPropsMap } from '../../common/types/controllers.js';
4
+ import type { OptionsTuple } from '../../common/types/utilities.js';
5
+ import type { SearchEngineDefinitionBuildResult, SearchEngineDefinitionControllersPropsOption } from './engine.js';
6
+ export type HydratedState<TEngine extends CoreEngine | CoreEngineNext, TControllers extends ControllersMap> = SearchEngineDefinitionBuildResult<TEngine, TControllers>;
6
7
  interface HydrateStaticStateOptions<TSearchAction> {
7
8
  searchAction: TSearchAction;
8
9
  }
9
- export interface HydratedState<TEngine extends CoreEngine | CoreEngineNext, TControllers extends ControllersMap> extends EngineDefinitionBuildResult<TEngine, TControllers> {
10
- }
11
10
  /**
12
11
  * Creates a new engine from the snapshot of the engine created in SSR with fetchStaticState.
13
12
  *
14
13
  * Useful when hydrating a server-side-rendered engine.
15
14
  */
16
- export type HydrateStaticState<TEngine extends CoreEngine | CoreEngineNext, TControllers extends ControllersMap, TSearchAction extends UnknownAction, TControllersProps extends ControllersPropsMap> = (...params: OptionsTuple<HydrateStaticStateOptions<TSearchAction> & EngineDefinitionControllersPropsOption<TControllersProps>>) => Promise<HydratedState<TEngine, TControllers>>;
15
+ export type HydrateStaticState<TEngine extends CoreEngine | CoreEngineNext, TControllers extends ControllersMap, TSearchAction extends UnknownAction, TControllersProps extends ControllersPropsMap> = (...params: OptionsTuple<HydrateStaticStateOptions<TSearchAction> & SearchEngineDefinitionControllersPropsOption<TControllersProps>>) => Promise<HydratedState<TEngine, TControllers>>;
17
16
  export {};
@@ -58,9 +58,6 @@ export { getSampleSearchEngineConfiguration } from './app/search-engine/search-e
58
58
  export type { ErrorPayload } from './controllers/controller/error-payload.js';
59
59
  export type { Controller, Subscribable, } from './controllers/controller/headless-controller.js';
60
60
  export type { InlineLink } from './controllers/smart-snippet/headless-smart-snippet-interactive-inline-links.js';
61
- export type { ControllerDefinitionsMap, ControllerDefinitionWithoutProps, ControllerDefinitionWithProps, } from './ssr-next/common/types/controllers.js';
62
- export type { EngineDefinition, InferHydratedState, InferStaticState, } from './ssr-next/common/types/engine.js';
63
- export type { InferControllerFromDefinition, InferControllerStaticStateFromController, InferControllerStaticStateMapFromControllers, InferControllerStaticStateMapFromDefinitions, InferControllersMapFromDefinition, } from './ssr-next/common/types/inference.js';
64
61
  export type { AutomaticFacetBreadcrumb, Breadcrumb, BreadcrumbManager, BreadcrumbManagerDefinition, BreadcrumbManagerState, BreadcrumbValue, CategoryFacetBreadcrumb, CoreBreadcrumbManager, CoreBreadcrumbManagerState, DateFacetBreadcrumb, DeselectableValue, FacetBreadcrumb, NumericFacetBreadcrumb, StaticFilterBreadcrumb, } from './ssr-next/search/controllers/breadcrumb-manager/headless-breadcrumb-manager.ssr.js';
65
62
  export { defineBreadcrumbManager } from './ssr-next/search/controllers/breadcrumb-manager/headless-breadcrumb-manager.ssr.js';
66
63
  export type { Context, ContextDefinition, ContextInitialState, ContextPayload, ContextProps, ContextState, ContextValue, } from './ssr-next/search/controllers/context/headless-context.ssr.js';
@@ -143,8 +140,13 @@ export type { RedirectionTrigger, RedirectionTriggerDefinition, RedirectionTrigg
143
140
  export { defineRedirectionTrigger } from './ssr-next/search/controllers/triggers/headless-redirection-trigger.ssr.js';
144
141
  export type { UrlManager, UrlManagerBuildProps, UrlManagerInitialState, UrlManagerProps, UrlManagerState, } from './ssr-next/search/controllers/url-manager/headless-url-manager.ssr.js';
145
142
  export { defineUrlManager } from './ssr-next/search/controllers/url-manager/headless-url-manager.ssr.js';
146
- export type { SearchCompletedAction, SearchEngineDefinition, SearchEngineDefinitionOptions, SSRSearchEngine as SearchEngine, } from './ssr-next/search/engine/search-engine.ssr.js';
143
+ export type { SearchCompletedAction, SSRSearchEngine as SearchEngine, } from './ssr-next/search/engine/search-engine.ssr.js';
147
144
  export { defineSearchEngine } from './ssr-next/search/engine/search-engine.ssr.js';
145
+ export type { ControllerDefinitionsMap, InferControllerStaticStateFromController, InferControllerStaticStateMapFromControllers, InferHydratedState, InferStaticState, } from './ssr-next/search/types/controller-definition.js';
146
+ export type { InferControllerFromDefinition, InferControllerStaticStateMapFromDefinitions, InferControllersMapFromDefinition, } from './ssr-next/search/types/controller-inference.js';
147
+ export type { SearchEngineDefinition, SearchEngineDefinitionOptions, } from './ssr-next/search/types/engine.js';
148
+ export type { FetchStaticState } from './ssr-next/search/types/fetch-static-state.js';
149
+ export type { HydratedState, HydrateStaticState, } from './ssr-next/search/types/hydrate-static-state.js';
148
150
  export type { SearchAppState, SearchParametersState, } from './state/search-app-state.js';
149
151
  export { getAnalyticsNextApiBaseUrl, getOrganizationEndpoint, } from './api/platform-client.js';
150
152
  export type { RelativeDate, RelativeDatePeriod, RelativeDateUnit, } from './api/search/date/relative-date.js';
@@ -1,7 +1,8 @@
1
1
  import type { SearchEngine } from '../app/search-engine/search-engine.js';
2
2
  import type { Controller } from '../controllers/controller/headless-controller.js';
3
3
  import type { Kind } from '../ssr/commerce/types/kind.js';
4
- import type { ControllerDefinitionWithoutProps, ControllerDefinitionWithProps } from '../ssr-next/common/types/controllers.js';
4
+ import type { ControllerDefinitionWithoutProps, ControllerDefinitionWithProps } from '../ssr/common/types/controllers.js';
5
+ import { recommendationInternalOptionKey } from '../ssr-next/commerce/types/controller-constants.js';
5
6
  interface MockController {
6
7
  initialState?: Record<string, unknown>;
7
8
  }
@@ -35,4 +36,15 @@ export declare function defineMockCommerceControllerWithProps(options?: Solution
35
36
  standalone: boolean;
36
37
  recommendation: boolean;
37
38
  };
39
+ export declare function defineMockRecommendationDefinition(slotId: string): {
40
+ recommendation: boolean;
41
+ [recommendationInternalOptionKey]: {
42
+ slotId: string;
43
+ };
44
+ buildWithProps: import("vitest").Mock<(engine: any, props: any) => {
45
+ state: {};
46
+ subscribe(listener: () => void): import("redux").Unsubscribe;
47
+ _kind: Kind;
48
+ }>;
49
+ };
38
50
  export {};
@@ -1,6 +1,6 @@
1
1
  import { buildProductListing } from '../../../../controllers/commerce/product-listing/headless-product-listing.js';
2
2
  import { buildSearch } from '../../../../controllers/commerce/search/headless-search.js';
3
- import { ensureAtLeastOneSolutionType } from '../../../../ssr/commerce/controller-utils.js';
3
+ import { ensureAtLeastOneSolutionType } from '../../controller-utils.js';
4
4
  import { SolutionType } from '../../types/controller-constants.js';
5
5
  /**
6
6
  * Defines a `BreadcrumbManager` controller instance.
@@ -14,8 +14,8 @@ import { manualNumericFacetSelector } from '../../../../features/commerce/facets
14
14
  import { manualNumericFacetReducer as manualNumericFacetSet } from '../../../../features/commerce/facets/numeric-facet/manual-numeric-facet-slice.js';
15
15
  import { categoryFacetSearchStateSelector } from '../../../../features/facets/facet-search-set/category/category-facet-search-state-selector.js';
16
16
  import { specificFacetSearchStateSelector } from '../../../../features/facets/facet-search-set/specific/specific-facet-search-state-selector.js';
17
- import { ensureAtLeastOneSolutionType } from '../../../../ssr/commerce/controller-utils.js';
18
17
  import { loadReducerError } from '../../../../utils/errors.js';
18
+ import { ensureAtLeastOneSolutionType } from '../../controller-utils.js';
19
19
  import { SolutionType } from '../../types/controller-constants.js';
20
20
  /**
21
21
  * @group Definers
@@ -1,6 +1,6 @@
1
1
  import { buildProductListing } from '../../../../controllers/commerce/product-listing/headless-product-listing.js';
2
2
  import { buildSearch } from '../../../../controllers/commerce/search/headless-search.js';
3
- import { ensureAtLeastOneSolutionType } from '../../../../ssr/commerce/controller-utils.js';
3
+ import { ensureAtLeastOneSolutionType } from '../../controller-utils.js';
4
4
  import { SolutionType } from '../../types/controller-constants.js';
5
5
  /**
6
6
  * Defines a `Pagination` controller instance.
@@ -8,8 +8,8 @@ import { queryReducer as query } from '../../../../features/commerce/query/query
8
8
  import { sortReducer as commerceSort } from '../../../../features/commerce/sort/sort-slice.js';
9
9
  import { facetOrderReducer as facetOrder } from '../../../../features/facets/facet-order/facet-order-slice.js';
10
10
  import { querySetReducer as querySet } from '../../../../features/query-set/query-set-slice.js';
11
- import { ensureAtLeastOneSolutionType } from '../../../../ssr/commerce/controller-utils.js';
12
11
  import { loadReducerError } from '../../../../utils/errors.js';
12
+ import { ensureAtLeastOneSolutionType } from '../../controller-utils.js';
13
13
  import { SolutionType } from '../../types/controller-constants.js';
14
14
  import { createControllerWithKind, Kind } from '../../types/kind.js';
15
15
  /**
@@ -17,7 +17,7 @@ export function defineRecommendations(props) {
17
17
  buildWithProps: (engine, options) => {
18
18
  const staticOptions = props.options;
19
19
  const controller = buildRecommendations(engine, {
20
- options: { ...staticOptions, ...options },
20
+ options: { ...staticOptions, ...options.initialState },
21
21
  });
22
22
  return createControllerWithKind(controller, Kind.Recommendations);
23
23
  },
@@ -1,6 +1,6 @@
1
1
  import { buildProductListing } from '../../../../controllers/commerce/product-listing/headless-product-listing.js';
2
2
  import { buildSearch } from '../../../../controllers/commerce/search/headless-search.js';
3
- import { ensureAtLeastOneSolutionType } from '../../../../ssr/commerce/controller-utils.js';
3
+ import { ensureAtLeastOneSolutionType } from '../../controller-utils.js';
4
4
  import { SolutionType } from '../../types/controller-constants.js';
5
5
  /**
6
6
  * Defines a `Sort` controller instance.
@@ -1,6 +1,6 @@
1
1
  import { buildProductListing } from '../../../../controllers/commerce/product-listing/headless-product-listing.js';
2
2
  import { buildSearch } from '../../../../controllers/commerce/search/headless-search.js';
3
- import { ensureAtLeastOneSolutionType } from '../../../../ssr/commerce/controller-utils.js';
3
+ import { ensureAtLeastOneSolutionType } from '../../controller-utils.js';
4
4
  import { SolutionType } from '../../types/controller-constants.js';
5
5
  /**
6
6
  * Defines a `Summary` controller instance.
@@ -57,34 +57,34 @@ function buildSSRCommerceEngine(solutionType, options, recommendationCount) {
57
57
  },
58
58
  };
59
59
  }
60
- function fetchActiveRecommendationControllers(controllerProps, solutionType) {
61
- return solutionType === SolutionType.recommendation
62
- ? Object.values(controllerProps).filter((controller) => controller &&
63
- typeof controller === 'object' &&
64
- 'enabled' in controller &&
65
- controller.enabled).length
66
- : 0;
67
- }
68
60
  export const buildFactory = (controllerDefinitions, options) => (solutionType) => async (...[buildOptions]) => {
69
61
  const controllerProps = wireControllerParams(solutionType, controllerDefinitions, buildOptions); // TODO: KIT-4754: remove non-null assertion operator
70
62
  const logger = buildLogger(options.loggerOptions);
71
63
  if (!options.navigatorContextProvider) {
72
64
  logger.warn('[WARNING] Missing navigator context in server-side code. Make sure to set it with `setNavigatorContextProvider` before calling fetchStaticState()');
73
65
  }
74
- const enabledRecommendationControllers = fetchActiveRecommendationControllers(controllerProps, solutionType);
66
+ const enabledRecommendationControllers = buildOptions && 'recommendations' in buildOptions // TODO: KIT-4754: remove non-null assertion
67
+ ? buildOptions
68
+ ?.recommendations.length
69
+ : 0;
75
70
  const engineOptions = {
76
71
  ...options,
77
72
  configuration: extendEngineConfiguration(options.configuration, buildOptions), // TODO: KIT-4754: remove non-null assertion operator
78
73
  };
79
74
  const engine = buildSSRCommerceEngine(solutionType, engineOptions, enabledRecommendationControllers);
80
75
  const controllers = buildControllerDefinitions({
81
- definitionsMap: (controllerDefinitions ?? {}),
76
+ definitionsMap: controllerDefinitions ?? {},
82
77
  engine,
83
78
  solutionType,
84
79
  propsMap: controllerProps,
85
80
  });
81
+ if (buildOptions && 'searchActions' in buildOptions) {
82
+ buildOptions.searchActions.forEach((action) => {
83
+ engine.dispatch(action);
84
+ });
85
+ }
86
86
  return {
87
87
  engine,
88
- controllers,
88
+ controllers: controllers,
89
89
  };
90
90
  };
@@ -3,9 +3,6 @@ export function hydratedStaticStateFactory(controllerDefinitions, options) {
3
3
  return (solutionType) => async (...params) => {
4
4
  const solutionTypeBuild = await buildFactory(controllerDefinitions, options)(solutionType);
5
5
  const { engine, controllers } = await solutionTypeBuild(...params);
6
- params[0].searchActions.forEach((action) => {
7
- engine.dispatch(action);
8
- });
9
6
  await engine.waitForRequestCompletedAction();
10
7
  return { engine, controllers };
11
8
  };
@@ -1,12 +1,9 @@
1
1
  import { SolutionType } from '../types/controller-constants.js';
2
- import { buildFactory, } from './build-factory.js';
2
+ import { buildFactory } from './build-factory.js';
3
3
  export function hydratedRecommendationStaticStateFactory(controllerDefinitions, options) {
4
4
  return async (...params) => {
5
5
  const solutionTypeBuild = await buildFactory(controllerDefinitions, options)(SolutionType.recommendation);
6
- const { engine, controllers } = (await solutionTypeBuild(...params));
7
- params[0].searchActions.forEach((action) => {
8
- engine.dispatch(action);
9
- });
6
+ const { engine, controllers } = await solutionTypeBuild(...params);
10
7
  await engine.waitForRequestCompletedAction();
11
8
  return { engine, controllers };
12
9
  };
@@ -1,22 +1,13 @@
1
- import { filterObject } from '../../../utils/utils.js';
2
1
  import { createStaticState } from '../controller-utils.js';
3
2
  import { SolutionType } from '../types/controller-constants.js';
4
3
  import { filterRecommendationControllers } from '../utils/recommendation-filter.js';
5
- import { buildFactory, } from './build-factory.js';
4
+ import { buildFactory } from './build-factory.js';
6
5
  export function fetchRecommendationStaticStateFactory(controllerDefinitions, options) {
7
- // TODO: KIT-4619: no longer the right way to get the allowed recommendation keys
8
- const getAllowedRecommendationKeys = (props) => {
9
- if (props && 'controllers' in props) {
10
- const enabledRecommendationControllers = filterObject(props.controllers, (value) => Boolean(value.enabled));
11
- return Object.keys(enabledRecommendationControllers);
12
- }
13
- return [];
14
- };
15
6
  return async (...params) => {
16
7
  const [props] = params;
17
- const allowedRecommendationKeys = getAllowedRecommendationKeys(props);
8
+ const allowedRecommendationKeys = props?.recommendations;
18
9
  const solutionTypeBuild = await buildFactory(controllerDefinitions, options)(SolutionType.recommendation);
19
- const { engine, controllers } = (await solutionTypeBuild(...params));
10
+ const { engine, controllers } = await solutionTypeBuild(...params);
20
11
  filterRecommendationControllers(controllers, controllerDefinitions ?? {}).refresh(allowedRecommendationKeys);
21
12
  const searchActions = await Promise.all(engine.waitForRequestCompletedAction());
22
13
  const staticState = createStaticState({
@@ -3,7 +3,7 @@ import { buildSearch } from '../../../controllers/commerce/search/headless-searc
3
3
  import { augmentPreprocessRequestWithForwardedFor } from '../../common/augment-preprocess-request.js';
4
4
  import { createStaticState } from '../controller-utils.js';
5
5
  import { SolutionType } from '../types/controller-constants.js';
6
- import { buildFactory, } from './build-factory.js';
6
+ import { buildFactory } from './build-factory.js';
7
7
  export function fetchStaticStateFactory(controllerDefinitions, options) {
8
8
  return (solutionType) => async (...params) => {
9
9
  const solutionTypeBuild = await buildFactory(controllerDefinitions, options)(solutionType);
@@ -1,13 +1,9 @@
1
- /**
2
- * Controller Wiring Utilities
3
- *
4
- * Transforms simple user configuration into complex internal controller structures.
5
- */
6
- import { RecordValue, Schema } from '@coveo/bueno';
1
+ import { ArrayValue, RecordValue, Schema, StringValue } from '@coveo/bueno';
7
2
  import { contextDefinition } from '../../../features/commerce/context/context-validation.js';
8
3
  import { parametersDefinition } from '../../../features/commerce/parameters/parameters-schema.js';
9
- import { requiredEmptyAllowedString } from '../../../utils/validate-payload.js';
4
+ import { nonEmptyString, requiredEmptyAllowedString, } from '../../../utils/validate-payload.js';
10
5
  import { SolutionType } from '../types/controller-constants.js';
6
+ import { getRecommendationDefinitions, isRecommendationDefinition, } from './recommendation-filter.js';
11
7
  const requiredDefinition = {
12
8
  context: new RecordValue({
13
9
  options: { required: true },
@@ -30,23 +26,31 @@ const searchDefinition = {
30
26
  values: { query: requiredEmptyAllowedString, ...parametersDefinition },
31
27
  }),
32
28
  };
33
- const recommendationsDefinition = {
29
+ const recommendationsDefinition = (recommendationName) => ({
34
30
  ...requiredDefinition,
35
- // recommendation: // TODO: KIT-4619: support array of recommendations
36
- };
31
+ recommendations: new ArrayValue({
32
+ each: new StringValue({
33
+ required: true,
34
+ constrainTo: recommendationName,
35
+ emptyAllowed: false,
36
+ }),
37
+ required: true,
38
+ }),
39
+ productId: nonEmptyString,
40
+ });
37
41
  export const listingDefinitionSchema = new Schema(listingDefinition);
38
42
  export const searchDefinitionSchema = new Schema(searchDefinition);
39
43
  export const standaloneDefinitionSchema = new Schema(standaloneDefinition);
40
- export const recommendationsDefinitionSchema = new Schema(recommendationsDefinition);
44
+ export const recommendationsDefinitionSchema = (recommendationName) => new Schema(recommendationsDefinition(recommendationName));
41
45
  /**
42
46
  * Validates the build configuration based on the solution type.
43
47
  */
44
- function validateBuildConfig(solutionType, buildConfig) {
48
+ function validateBuildConfig(solutionType, controllerDefinitions, buildConfig) {
45
49
  const validationMap = {
46
50
  [SolutionType.listing]: listingDefinitionSchema,
47
51
  [SolutionType.search]: searchDefinitionSchema,
48
52
  [SolutionType.standalone]: standaloneDefinitionSchema,
49
- [SolutionType.recommendation]: recommendationsDefinitionSchema,
53
+ [SolutionType.recommendation]: recommendationsDefinitionSchema(Object.keys(getRecommendationDefinitions(controllerDefinitions))),
50
54
  };
51
55
  const schema = validationMap[solutionType];
52
56
  schema.validate(buildConfig);
@@ -95,7 +99,20 @@ class ControllerWirer {
95
99
  };
96
100
  }
97
101
  wireRecommendations() {
98
- // TODO: KIT-4619: wire recommendations
102
+ if (!('recommendations' in this.buildConfig)) {
103
+ return;
104
+ }
105
+ for (const recController in this.controllerDefinitions) {
106
+ if (isRecommendationDefinition(this.controllerDefinitions[recController])) {
107
+ this.controllerProps[recController] = {
108
+ initialState: {
109
+ ...('productId' in this.buildConfig && {
110
+ productId: this.buildConfig.productId,
111
+ }),
112
+ },
113
+ };
114
+ }
115
+ }
99
116
  }
100
117
  /**
101
118
  * Wires all controllers based on solution type and controller definitions.
@@ -138,7 +155,7 @@ class ControllerWirer {
138
155
  * @returns Formatted and validated controller properties map defined for the controller in the definition
139
156
  */
140
157
  export function wireControllerParams(solutionType, controllerDefinitions, buildConfig) {
141
- validateBuildConfig(solutionType, buildConfig);
158
+ validateBuildConfig(solutionType, controllerDefinitions, buildConfig);
142
159
  const controllerProps = buildConfig.controllers ?? {};
143
160
  new ControllerWirer(buildConfig, controllerDefinitions, controllerProps).wire(solutionType);
144
161
  return controllerProps;
@@ -1,15 +1,34 @@
1
1
  import { MultipleRecommendationError } from '../../common/errors.js';
2
2
  import { recommendationInternalOptionKey } from '../types/controller-constants.js';
3
+ /**
4
+ * Type guard to check if a controller definition is a recommendation controller.
5
+ * A recommendation controller must have both the recommendation flag and a slotId.
6
+ */
7
+ export function isRecommendationDefinition(controllerDefinition) {
8
+ const hasRecommendationFlag = 'recommendation' in controllerDefinition &&
9
+ controllerDefinition.recommendation === true;
10
+ const hasValidSlotId = recommendationInternalOptionKey in controllerDefinition &&
11
+ 'slotId' in
12
+ controllerDefinition[recommendationInternalOptionKey];
13
+ return hasRecommendationFlag && hasValidSlotId;
14
+ }
15
+ /**
16
+ * Extracts recommendation controller definitions from a controller definitions map.
17
+ *
18
+ * @param controllerDefinitions - Map of controller definitions
19
+ * @returns Object containing only the recommendation controller definitions
20
+ */
21
+ export function getRecommendationDefinitions(controllerDefinitions) {
22
+ const recommendationMap = {};
23
+ for (const [name, definition] of Object.entries(controllerDefinitions)) {
24
+ if (isRecommendationDefinition(definition)) {
25
+ recommendationMap[name] = definition;
26
+ }
27
+ }
28
+ return recommendationMap;
29
+ }
3
30
  export function filterRecommendationControllers(controllers, controllerDefinitions) {
4
31
  const slotIdSet = new Set();
5
- const isRecommendationDefinition = (controllerDefinition) => {
6
- const isControllerRecommendation = 'recommendation' in controllerDefinition &&
7
- controllerDefinition.recommendation === true;
8
- const hasSlotId = recommendationInternalOptionKey in controllerDefinition &&
9
- 'slotId' in
10
- controllerDefinition[recommendationInternalOptionKey];
11
- return isControllerRecommendation && hasSlotId;
12
- };
13
32
  const ensureSingleRecommendationPerSlot = (slotId) => {
14
33
  throw new MultipleRecommendationError(slotId);
15
34
  };
@@ -1,6 +1,6 @@
1
1
  import { clone, mapObject } from '../../utils/utils.js';
2
- import { ControllerBuilder } from './builders/controller-builder.js';
3
- import { createStaticControllerBuilder } from './builders/static-controller-builder.js';
2
+ import { ControllerBuilder } from '../common/builders/controller-builder.js';
3
+ import { createStaticControllerBuilder } from '../common/builders/static-controller-builder.js';
4
4
  export function buildControllerDefinitions({ definitionsMap, engine, propsMap, }) {
5
5
  return mapObject(definitionsMap, (definition, key) => {
6
6
  const props = propsMap?.[key];
@@ -2,7 +2,7 @@ import { buildLogger } from '../../../app/logger.js';
2
2
  import { buildSearchEngine, } from '../../../app/search-engine/search-engine.js';
3
3
  import { createWaitForActionMiddleware } from '../../../utils/utils.js';
4
4
  import { augmentPreprocessRequestWithForwardedFor } from '../../common/augment-preprocess-request.js';
5
- import { buildControllerDefinitions, createStaticState, } from '../../common/controller-utils.js';
5
+ import { buildControllerDefinitions, createStaticState, } from '../controller-utils.js';
6
6
  function isSearchCompletedAction(action) {
7
7
  return /^search\/executeSearch\/(fulfilled|rejected)$/.test(action.type);
8
8
  }
@@ -0,0 +1 @@
1
+ export {};