@searchspring/snap-preact 0.25.1 → 0.27.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 (35) hide show
  1. package/dist/cjs/Instantiators/RecommendationInstantiator.d.ts +20 -21
  2. package/dist/cjs/Instantiators/RecommendationInstantiator.d.ts.map +1 -1
  3. package/dist/cjs/Instantiators/RecommendationInstantiator.js +75 -50
  4. package/dist/cjs/Snap.d.ts +17 -15
  5. package/dist/cjs/Snap.d.ts.map +1 -1
  6. package/dist/cjs/Snap.js +314 -236
  7. package/dist/cjs/components/BranchOverride.d.ts +1 -6
  8. package/dist/cjs/components/BranchOverride.d.ts.map +1 -1
  9. package/dist/cjs/components/BranchOverride.js +2 -234
  10. package/dist/cjs/create/index.d.ts +1 -1
  11. package/dist/cjs/create/index.d.ts.map +1 -1
  12. package/dist/cjs/create/index.js +2 -2
  13. package/dist/cjs/getBundleDetails/getBundleDetails.d.ts +7 -0
  14. package/dist/cjs/getBundleDetails/getBundleDetails.d.ts.map +1 -0
  15. package/dist/cjs/getBundleDetails/getBundleDetails.js +64 -0
  16. package/dist/cjs/types.d.ts +1 -0
  17. package/dist/cjs/types.d.ts.map +1 -1
  18. package/dist/esm/Instantiators/RecommendationInstantiator.d.ts +20 -21
  19. package/dist/esm/Instantiators/RecommendationInstantiator.d.ts.map +1 -1
  20. package/dist/esm/Instantiators/RecommendationInstantiator.js +63 -40
  21. package/dist/esm/Snap.d.ts +17 -15
  22. package/dist/esm/Snap.d.ts.map +1 -1
  23. package/dist/esm/Snap.js +157 -111
  24. package/dist/esm/components/BranchOverride.d.ts +1 -6
  25. package/dist/esm/components/BranchOverride.d.ts.map +1 -1
  26. package/dist/esm/components/BranchOverride.js +1 -172
  27. package/dist/esm/create/index.d.ts +1 -1
  28. package/dist/esm/create/index.d.ts.map +1 -1
  29. package/dist/esm/create/index.js +1 -1
  30. package/dist/esm/getBundleDetails/getBundleDetails.d.ts +7 -0
  31. package/dist/esm/getBundleDetails/getBundleDetails.d.ts.map +1 -0
  32. package/dist/esm/getBundleDetails/getBundleDetails.js +22 -0
  33. package/dist/esm/types.d.ts +1 -0
  34. package/dist/esm/types.d.ts.map +1 -1
  35. package/package.json +13 -12
@@ -2,26 +2,32 @@ import { jsx as _jsx } from "preact/jsx-runtime";
2
2
  import { render } from 'preact';
3
3
  import deepmerge from 'deepmerge';
4
4
  import { DomTargeter, getContext } from '@searchspring/snap-toolbox';
5
+ import { Client } from '@searchspring/snap-client';
6
+ import { Logger } from '@searchspring/snap-logger';
7
+ import { Tracker } from '@searchspring/snap-tracker';
5
8
  export class RecommendationInstantiator {
6
- constructor(config, { client, logger, tracker }, context) {
7
- this.controllers = {};
9
+ constructor(config, services, context) {
10
+ this.controller = {};
8
11
  this.uses = [];
9
12
  this.plugins = [];
10
13
  this.middleware = [];
11
14
  this.config = config;
12
- this.context = deepmerge(context || {}, config.context || {});
13
15
  if (!this.config) {
14
16
  throw new Error(`Recommendation Instantiator config is required`);
15
17
  }
16
18
  if (!this.config.config?.branch) {
17
19
  throw new Error(`Recommendation Instantiator config must contain 'branch' property`);
18
20
  }
19
- if (!this.config.components || typeof this.config.components != 'object') {
21
+ if (!this.config.components || typeof this.config.components != 'object' || !Object.keys(this.config.components).length) {
20
22
  throw new Error(`Recommendation Instantiator config must contain 'components' mapping property`);
21
23
  }
22
- this.client = client;
23
- this.tracker = tracker;
24
- this.logger = logger;
24
+ if ((!services?.client || !services?.tracker) && !this.config?.client?.globals?.siteId) {
25
+ throw new Error(`Recommendation Instantiator config must contain a valid config.client.globals.siteId value`);
26
+ }
27
+ this.context = deepmerge(context || {}, config.context || {});
28
+ this.client = services?.client || new Client(this.config.client.globals, this.config.client.config);
29
+ this.tracker = services?.tracker || new Tracker(this.config.client.globals);
30
+ this.logger = services?.logger || new Logger('RecommendationInstantiator ');
25
31
  const profileCount = {};
26
32
  this.targeter = new DomTargeter([
27
33
  {
@@ -30,22 +36,22 @@ export class RecommendationInstantiator {
30
36
  action: 'before',
31
37
  element: (target, origElement) => {
32
38
  const profile = origElement.getAttribute('profile');
33
- if (profile) {
34
- const recsContainer = document.createElement('div');
35
- recsContainer.setAttribute('searchspring-recommend', profile);
36
- return recsContainer;
37
- }
38
- else {
39
- this.logger.warn(`'profile' attribute is missing from <script> tag, skipping this profile`, origElement);
40
- }
39
+ const recsContainer = document.createElement('div');
40
+ recsContainer.setAttribute('searchspring-recommend', profile);
41
+ return recsContainer;
41
42
  },
42
43
  },
43
44
  },
44
45
  ], async (target, injectedElem, elem) => {
46
+ const tag = injectedElem.getAttribute('searchspring-recommend');
47
+ if (!tag) {
48
+ this.logger.warn(`'profile' attribute is missing from <script> tag, skipping this profile`, elem);
49
+ return;
50
+ }
45
51
  const contextGlobals = {};
46
- const elemContext = getContext(['shopperId', 'shopper', 'product', 'seed', 'options', 'profile', 'custom'], elem);
52
+ const elemContext = getContext(['shopperId', 'shopper', 'product', 'seed', 'cart', 'options', 'profile', 'custom'], elem);
47
53
  const context = deepmerge(this.context, elemContext);
48
- const { shopper, shopperId, product, seed, options } = context;
54
+ const { shopper, shopperId, product, seed, cart, options } = context;
49
55
  /*
50
56
  type instantiatorContext = {
51
57
  shopper?: {
@@ -54,6 +60,7 @@ export class RecommendationInstantiator {
54
60
  shopperId?: string;
55
61
  product?: string;
56
62
  seed?: string;
63
+ cart?: string[] | () => string[];
57
64
  options?: {
58
65
  siteId?: string;
59
66
  branch?: string;
@@ -82,14 +89,32 @@ export class RecommendationInstantiator {
82
89
  if (options?.limit && Number.isInteger(Number(options?.limit))) {
83
90
  contextGlobals.limits = Number(options?.limit);
84
91
  }
85
- const tag = injectedElem.getAttribute('searchspring-recommend');
92
+ let cartContents;
93
+ if (typeof cart === 'function') {
94
+ try {
95
+ const cartFuncContents = cart();
96
+ if (Array.isArray(cartFuncContents)) {
97
+ cartContents = cartFuncContents;
98
+ }
99
+ }
100
+ catch (e) {
101
+ this.logger.warn(`Error getting cart contents from function`, e);
102
+ }
103
+ }
104
+ else if (Array.isArray(cart)) {
105
+ cartContents = cart;
106
+ }
107
+ if (Array.isArray(cartContents)) {
108
+ this.tracker.cookies.cart.set(cartContents);
109
+ contextGlobals.cart = this.tracker.cookies.cart.get();
110
+ }
86
111
  profileCount[tag] = profileCount[tag] + 1 || 1;
87
112
  const defaultGlobals = {
88
113
  limits: 20,
89
114
  };
90
- const globals = deepmerge(deepmerge(defaultGlobals, this.config.config?.globals || {}), contextGlobals);
115
+ const globals = deepmerge(deepmerge(defaultGlobals, this.config.client?.globals || {}), contextGlobals);
91
116
  const controllerConfig = {
92
- id: `recommend_${tag + (profileCount[tag] - 1)}`,
117
+ id: `recommend_${tag}_${profileCount[tag] - 1}`,
93
118
  tag,
94
119
  batched: options?.batched ?? true,
95
120
  realtime: Boolean(options?.realtime),
@@ -97,41 +122,39 @@ export class RecommendationInstantiator {
97
122
  globals,
98
123
  };
99
124
  const createRecommendationController = (await import('../create/createRecommendationController')).default;
100
- const client = this.config.services?.client || this.client;
101
- const tracker = this.config.services?.tracker || this.tracker;
102
- const recs = createRecommendationController({
103
- url: this.config.url || {},
125
+ const controller = createRecommendationController({
126
+ url: this.config.url,
104
127
  controller: controllerConfig,
105
128
  context,
106
- }, { client, tracker });
107
- this.uses.forEach((attachements) => recs.use(attachements));
108
- this.plugins.forEach((plugin) => recs.plugin(plugin));
109
- this.middleware.forEach((middleware) => recs.on(middleware.event, ...middleware.func));
110
- await recs.search();
111
- recs.addTargeter(this.targeter);
112
- this.controllers[recs.config.id] = recs;
113
- const profileVars = recs.store.profile.display.templateParameters;
114
- const component = recs.store.profile.display.template?.component;
129
+ }, { client: this.client, tracker: this.tracker });
130
+ this.uses.forEach((attachements) => controller.use(attachements));
131
+ this.plugins.forEach((plugin) => controller.plugin(plugin.func, ...plugin.args));
132
+ this.middleware.forEach((middleware) => controller.on(middleware.event, ...middleware.func));
133
+ await controller.search();
134
+ controller.addTargeter(this.targeter);
135
+ this.controller[controller.config.id] = controller;
136
+ const profileVars = controller.store.profile.display.templateParameters;
137
+ const component = controller.store.profile.display.template?.component;
115
138
  if (!profileVars) {
116
- recs.log.error(`profile failed to load!`);
139
+ this.logger.error(`profile '${tag}' found on ${elem} is missing templateParameters!`);
117
140
  return;
118
141
  }
119
142
  if (!component) {
120
- recs.log.error(`template does not support components!`);
143
+ this.logger.error(`profile '${tag}' found on ${elem} is missing component!`);
121
144
  return;
122
145
  }
123
- const RecommendationsComponent = this.config.components && (await this.config.components[component]());
146
+ const RecommendationsComponent = this.config.components[component] && (await this.config.components[component]());
124
147
  if (!RecommendationsComponent) {
125
- recs.log.error(`component '${profileVars.component}' not found!`);
148
+ this.logger.error(`profile '${tag}' found on ${elem} is expecting component mapping for '${component}' - verify instantiator config.`);
126
149
  return;
127
150
  }
128
151
  setTimeout(() => {
129
- render(_jsx(RecommendationsComponent, { controller: recs }), injectedElem);
152
+ render(_jsx(RecommendationsComponent, { controller: controller }), injectedElem);
130
153
  });
131
154
  });
132
155
  }
133
- plugin(func) {
134
- this.plugins.push(func);
156
+ plugin(func, ...args) {
157
+ this.plugins.push({ func, args });
135
158
  }
136
159
  on(event, ...func) {
137
160
  this.middleware.push({ event, func });
@@ -1,12 +1,15 @@
1
1
  import { Client } from '@searchspring/snap-client';
2
2
  import { Logger } from '@searchspring/snap-logger';
3
3
  import { Tracker } from '@searchspring/snap-tracker';
4
+ import { ControllerTypes } from '@searchspring/snap-controller';
4
5
  import type { ClientConfig, ClientGlobals } from '@searchspring/snap-client';
5
6
  import type { AbstractController, SearchController, AutocompleteController, FinderController, RecommendationController, SearchControllerConfig, AutocompleteControllerConfig, FinderControllerConfig, RecommendationControllerConfig, ControllerConfigs, ContextVariables } from '@searchspring/snap-controller';
6
7
  import type { Target, OnTarget } from '@searchspring/snap-toolbox';
7
8
  import type { UrlTranslatorConfig } from '@searchspring/snap-url-manager';
8
9
  import { RecommendationInstantiator, RecommendationInstantiatorConfig } from './Instantiators/RecommendationInstantiator';
9
10
  import type { SnapControllerServices, RootComponent } from './types';
11
+ export declare const BRANCH_COOKIE = "ssBranch";
12
+ export declare const SS_DEV_COOKIE = "ssDev";
10
13
  declare type ExtendedTarget = Target & {
11
14
  name?: string;
12
15
  controller?: AbstractController;
@@ -19,7 +22,7 @@ declare type ExtendedTarget = Target & {
19
22
  export declare type SnapConfig = {
20
23
  context?: ContextVariables;
21
24
  url?: UrlTranslatorConfig;
22
- client: {
25
+ client?: {
23
26
  globals: ClientGlobals;
24
27
  config?: ClientConfig;
25
28
  };
@@ -36,7 +39,7 @@ export declare type SnapConfig = {
36
39
  }[];
37
40
  autocomplete?: {
38
41
  config: AutocompleteControllerConfig;
39
- targeters: ExtendedTarget[];
42
+ targeters?: ExtendedTarget[];
40
43
  services?: SnapControllerServices;
41
44
  url?: UrlTranslatorConfig;
42
45
  context?: ContextVariables;
@@ -57,13 +60,12 @@ export declare type SnapConfig = {
57
60
  }[];
58
61
  };
59
62
  };
60
- declare type ControllerTypes = SearchController | AutocompleteController | FinderController | RecommendationController;
61
- declare enum DynamicImportNames {
62
- SEARCH = "searchController",
63
- AUTOCOMPLETE = "autocompleteController",
64
- FINDER = "finderController",
65
- RECOMMENDATION = "recommendationController"
66
- }
63
+ declare type SnapServices = {
64
+ client?: Client;
65
+ tracker?: Tracker;
66
+ logger?: Logger;
67
+ };
68
+ declare type Controllers = SearchController | AutocompleteController | FinderController | RecommendationController;
67
69
  export declare class Snap {
68
70
  config: SnapConfig;
69
71
  logger: Logger;
@@ -71,19 +73,19 @@ export declare class Snap {
71
73
  tracker: Tracker;
72
74
  context: ContextVariables;
73
75
  _controllerPromises: {
74
- [controllerConfigId: string]: Promise<ControllerTypes>;
76
+ [controllerConfigId: string]: Promise<Controllers>;
75
77
  };
76
78
  controllers: {
77
- [controllerConfigId: string]: ControllerTypes;
79
+ [controllerConfigId: string]: Controllers;
78
80
  };
79
81
  _instantiatorPromises: {
80
82
  [instantiatorId: string]: Promise<RecommendationInstantiator>;
81
83
  };
82
84
  getInstantiator: (id: string) => Promise<RecommendationInstantiator>;
83
- getController: (id: string) => Promise<ControllerTypes>;
84
- getControllers: (...controllerIds: string[]) => Promise<ControllerTypes[]>;
85
- createController: (type: DynamicImportNames, config: ControllerConfigs, services: SnapControllerServices, urlConfig: UrlTranslatorConfig, resolve: (value?: ControllerTypes | PromiseLike<ControllerTypes>) => void, context?: ContextVariables) => Promise<ControllerTypes>;
86
- constructor(config: SnapConfig);
85
+ getController: (id: string) => Promise<Controllers>;
86
+ getControllers: (...controllerIds: string[]) => Promise<Controllers[]>;
87
+ createController: (type: keyof typeof ControllerTypes, config: ControllerConfigs, services?: SnapControllerServices, urlConfig?: UrlTranslatorConfig, context?: ContextVariables, callback?: (value?: Controllers | PromiseLike<Controllers>) => void | Promise<void>) => Promise<Controllers>;
88
+ constructor(config: SnapConfig, services?: SnapServices);
87
89
  }
88
90
  export {};
89
91
  //# sourceMappingURL=Snap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Snap.d.ts","sourceRoot":"","sources":["../../src/Snap.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Snap.d.ts","sourceRoot":"","sources":["../../src/Snap.tsx"],"names":[],"mappings":"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"}