@searchspring/snap-preact 0.29.0 → 0.30.2

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 (37) hide show
  1. package/dist/cjs/Instantiators/RecommendationInstantiator.d.ts +4 -3
  2. package/dist/cjs/Instantiators/RecommendationInstantiator.d.ts.map +1 -1
  3. package/dist/cjs/Instantiators/RecommendationInstantiator.js +13 -2
  4. package/dist/cjs/Snap.d.ts +64 -13
  5. package/dist/cjs/Snap.d.ts.map +1 -1
  6. package/dist/cjs/Snap.js +159 -65
  7. package/dist/cjs/create/createAutocompleteController.d.ts +1 -1
  8. package/dist/cjs/create/createAutocompleteController.d.ts.map +1 -1
  9. package/dist/cjs/create/createAutocompleteController.js +6 -1
  10. package/dist/cjs/create/createFinderController.d.ts +1 -1
  11. package/dist/cjs/create/createFinderController.d.ts.map +1 -1
  12. package/dist/cjs/create/createFinderController.js +6 -1
  13. package/dist/cjs/create/createRecommendationController.d.ts +1 -1
  14. package/dist/cjs/create/createRecommendationController.d.ts.map +1 -1
  15. package/dist/cjs/create/createRecommendationController.js +6 -1
  16. package/dist/cjs/create/createSearchController.d.ts +1 -1
  17. package/dist/cjs/create/createSearchController.d.ts.map +1 -1
  18. package/dist/cjs/create/createSearchController.js +6 -1
  19. package/dist/cjs/types.d.ts +6 -5
  20. package/dist/cjs/types.d.ts.map +1 -1
  21. package/dist/esm/Instantiators/RecommendationInstantiator.d.ts +4 -3
  22. package/dist/esm/Instantiators/RecommendationInstantiator.d.ts.map +1 -1
  23. package/dist/esm/Instantiators/RecommendationInstantiator.js +15 -3
  24. package/dist/esm/Snap.d.ts +14 -12
  25. package/dist/esm/Snap.d.ts.map +1 -1
  26. package/dist/esm/Snap.js +129 -52
  27. package/dist/esm/create/createAutocompleteController.d.ts.map +1 -1
  28. package/dist/esm/create/createAutocompleteController.js +6 -1
  29. package/dist/esm/create/createFinderController.d.ts.map +1 -1
  30. package/dist/esm/create/createFinderController.js +6 -1
  31. package/dist/esm/create/createRecommendationController.d.ts.map +1 -1
  32. package/dist/esm/create/createRecommendationController.js +6 -1
  33. package/dist/esm/create/createSearchController.d.ts.map +1 -1
  34. package/dist/esm/create/createSearchController.js +6 -1
  35. package/dist/esm/types.d.ts +6 -5
  36. package/dist/esm/types.d.ts.map +1 -1
  37. package/package.json +13 -13
package/dist/cjs/Snap.js CHANGED
@@ -73,7 +73,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
73
73
  return (mod && mod.__esModule) ? mod : { "default": mod };
74
74
  };
75
75
  Object.defineProperty(exports, "__esModule", { value: true });
76
- exports.Snap = exports.SS_DEV_COOKIE = exports.BRANCH_COOKIE = void 0;
76
+ exports.Snap = exports.DEV_COOKIE = exports.BRANCH_COOKIE = void 0;
77
77
  var jsx_runtime_1 = require("preact/jsx-runtime");
78
78
  var deepmerge_1 = __importDefault(require("deepmerge"));
79
79
  var is_plain_object_1 = require("is-plain-object");
@@ -82,16 +82,20 @@ var snap_client_1 = require("@searchspring/snap-client");
82
82
  var snap_logger_1 = require("@searchspring/snap-logger");
83
83
  var snap_tracker_1 = require("@searchspring/snap-tracker");
84
84
  var snap_toolbox_1 = require("@searchspring/snap-toolbox");
85
- var snap_toolbox_2 = require("@searchspring/snap-toolbox");
86
85
  var snap_controller_1 = require("@searchspring/snap-controller");
87
86
  var createSearchController_1 = __importDefault(require("./create/createSearchController"));
88
87
  exports.BRANCH_COOKIE = 'ssBranch';
89
- exports.SS_DEV_COOKIE = 'ssDev';
88
+ exports.DEV_COOKIE = 'ssDev';
89
+ var SESSION_ATTRIBUTION = 'ssAttribution';
90
90
  var COMPONENT_ERROR = "Uncaught Error - Invalid value passed as the component.\nThis usually happens when you pass a JSX Element, and not a function that returns the component, in the snap config. \n\t\t\n\t\tinstead of - \n\n\ttargeters: [\n\t\t{\n\t\t\tselector: '#searchspring-content',\n\t\t\thideTarget: true,\n\t\t\tcomponent: <Content/>,\n\t\t},\n\t]\n\n\t\tor - \n\n\ttargeters: [\n\t\t{\n\t\t\tselector: '#searchspring-content',\n\t\t\thideTarget: true,\n\t\t\tcomponent: Content,\n\t\t},\n\t]\n\n\t\tplease try - \n\n\ttargeters: [\n\t\t{\n\t\t\tselector: '#searchspring-content',\n\t\t\thideTarget: true,\n\t\t\tcomponent: () => Content\n\t\t},\n\t]\n\nThe error above happened in the following targeter in the Snap Config";
91
91
  var Snap = /** @class */ (function () {
92
92
  function Snap(config, services) {
93
93
  var _this = this;
94
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
94
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;
95
+ this.mode = snap_toolbox_1.AppMode.production;
96
+ this._instantiatorPromises = {};
97
+ this._controllerPromises = {};
98
+ this.controllers = {};
95
99
  this.getInstantiator = function (id) {
96
100
  return _this._instantiatorPromises[id] || Promise.reject("getInstantiator could not find instantiator with id: ".concat(id));
97
101
  };
@@ -107,7 +111,35 @@ var Snap = /** @class */ (function () {
107
111
  controllerIds.forEach(function (id) { return getControllerPromises.push(_this.getController(id)); });
108
112
  return Promise.all(getControllerPromises);
109
113
  };
114
+ // exposed method used for creating controllers dynamically - calls _createController()
110
115
  this.createController = function (type, config, services, urlConfig, context, callback) { return __awaiter(_this, void 0, void 0, function () {
116
+ var _this = this;
117
+ return __generator(this, function (_a) {
118
+ if (typeof this._controllerPromises[config.id] != 'undefined') {
119
+ throw new Error("Controller with id '".concat(config.id, "' is already defined"));
120
+ }
121
+ this._controllerPromises[config.id] = new Promise(function (resolve) {
122
+ return _this._createController(type, config, services, urlConfig, context, function (cntrlr) { return __awaiter(_this, void 0, void 0, function () {
123
+ return __generator(this, function (_a) {
124
+ switch (_a.label) {
125
+ case 0:
126
+ if (!(typeof callback == 'function')) return [3 /*break*/, 2];
127
+ return [4 /*yield*/, callback(cntrlr)];
128
+ case 1:
129
+ _a.sent();
130
+ _a.label = 2;
131
+ case 2:
132
+ resolve(cntrlr);
133
+ return [2 /*return*/];
134
+ }
135
+ });
136
+ }); });
137
+ });
138
+ return [2 /*return*/, this._controllerPromises[config.id]];
139
+ });
140
+ }); };
141
+ // internal use method that creates controllers without verifying if id is in use first
142
+ this._createController = function (type, config, services, urlConfig, context, callback) { return __awaiter(_this, void 0, void 0, function () {
111
143
  var importPromise, creationFunc;
112
144
  return __generator(this, function (_a) {
113
145
  switch (_a.label) {
@@ -131,7 +163,9 @@ var Snap = /** @class */ (function () {
131
163
  case 1:
132
164
  creationFunc = (_a.sent()).default;
133
165
  if (!this.controllers[config.id]) {
134
- this.controllers[config.id] = creationFunc({
166
+ window.searchspring.controller = window.searchspring.controller || {};
167
+ window.searchspring.controller[config.id] = this.controllers[config.id] = creationFunc({
168
+ mode: this.mode,
135
169
  url: (0, deepmerge_1.default)(this.config.url || {}, urlConfig || {}),
136
170
  controller: config,
137
171
  context: (0, deepmerge_1.default)(this.context || {}, context || {}),
@@ -183,14 +217,13 @@ var Snap = /** @class */ (function () {
183
217
  window.removeEventListener('error', this.handlers.error);
184
218
  window.addEventListener('error', this.handlers.error);
185
219
  this.config = config;
186
- this.logger = (services === null || services === void 0 ? void 0 : services.logger) || new snap_logger_1.Logger('Snap Preact ');
187
220
  var globalContext = {};
188
221
  try {
189
222
  // get global context
190
- globalContext = (0, snap_toolbox_2.getContext)(['shopper', 'config', 'merchandising']);
223
+ globalContext = (0, snap_toolbox_1.getContext)(['shopper', 'config', 'merchandising']);
191
224
  }
192
225
  catch (err) {
193
- this.logger.error('failed to find global context');
226
+ console.error('Snap failed to find global context');
194
227
  }
195
228
  // merge configs - but only merge plain objects
196
229
  this.config = (0, deepmerge_1.default)(this.config || {}, globalContext.config || {}, {
@@ -202,8 +235,9 @@ var Snap = /** @class */ (function () {
202
235
  if ((!(services === null || services === void 0 ? void 0 : services.client) || !(services === null || services === void 0 ? void 0 : services.tracker)) && !((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.client) === null || _b === void 0 ? void 0 : _b.globals) === null || _c === void 0 ? void 0 : _c.siteId)) {
203
236
  throw new Error("Snap: config provided must contain a valid config.client.globals.siteId value");
204
237
  }
205
- if ((_d = this.context.merchandising) === null || _d === void 0 ? void 0 : _d.segments) {
206
- if ((_e = this.config.client) === null || _e === void 0 ? void 0 : _e.globals.merchandising) {
238
+ // segmented merchandising context -> client globals
239
+ if (((_d = this.config.client) === null || _d === void 0 ? void 0 : _d.globals) && ((_e = this.context.merchandising) === null || _e === void 0 ? void 0 : _e.segments)) {
240
+ if ((_f = this.config.client.globals) === null || _f === void 0 ? void 0 : _f.merchandising) {
207
241
  this.config.client.globals.merchandising.segments = (0, deepmerge_1.default)(this.config.client.globals.merchandising.segments, this.context.merchandising.segments);
208
242
  }
209
243
  else {
@@ -212,33 +246,73 @@ var Snap = /** @class */ (function () {
212
246
  };
213
247
  }
214
248
  }
215
- this.client = (services === null || services === void 0 ? void 0 : services.client) || new snap_client_1.Client(this.config.client.globals, this.config.client.config);
216
- this.tracker = (services === null || services === void 0 ? void 0 : services.tracker) || new snap_tracker_1.Tracker(this.config.client.globals, { framework: 'preact' });
217
- this._controllerPromises = {};
218
- this._instantiatorPromises = {};
219
- this.controllers = {};
220
- // TODO environment switch using URL?
221
- this.logger.setMode(process.env.NODE_ENV);
222
- // log version
223
- this.logger.imageText({
224
- url: 'https://snapui.searchspring.io/favicon.svg',
225
- text: "[".concat(snap_toolbox_1.version, "]"),
226
- style: "color: ".concat(this.logger.colors.indigo, "; font-weight: bold;"),
227
- });
228
249
  try {
229
250
  var urlParams = (0, snap_toolbox_1.url)(window.location.href);
230
- var branchParam_1 = ((_g = (_f = urlParams === null || urlParams === void 0 ? void 0 : urlParams.params) === null || _f === void 0 ? void 0 : _f.query) === null || _g === void 0 ? void 0 : _g.branch) || snap_toolbox_1.cookies.get(exports.BRANCH_COOKIE);
231
- if (branchParam_1 && !document.querySelector("script[".concat(exports.BRANCH_COOKIE, "]"))) {
232
- // set a cookie or localstorage with branch
251
+ var branchOverride_1 = ((_h = (_g = urlParams === null || urlParams === void 0 ? void 0 : urlParams.params) === null || _g === void 0 ? void 0 : _g.query) === null || _h === void 0 ? void 0 : _h.branch) || snap_toolbox_1.cookies.get(exports.BRANCH_COOKIE);
252
+ /* app mode priority:
253
+ 1. node env
254
+ 2. config
255
+ 3. override via query param / cookie
256
+ */
257
+ // node env
258
+ if (process.env.NODE_ENV && Object.values(snap_toolbox_1.AppMode).includes(process.env.NODE_ENV)) {
259
+ this.mode = process.env.NODE_ENV;
260
+ }
261
+ // config
262
+ if (this.config.mode && Object.values(snap_toolbox_1.AppMode).includes(this.config.mode)) {
263
+ this.mode = this.config.mode;
264
+ }
265
+ // query param / cookiev override
266
+ if ((((_j = urlParams === null || urlParams === void 0 ? void 0 : urlParams.params) === null || _j === void 0 ? void 0 : _j.query) && 'dev' in urlParams.params.query) || !!snap_toolbox_1.cookies.get(exports.DEV_COOKIE)) {
267
+ if (((_k = urlParams === null || urlParams === void 0 ? void 0 : urlParams.params.query) === null || _k === void 0 ? void 0 : _k.dev) == 'false' || ((_l = urlParams === null || urlParams === void 0 ? void 0 : urlParams.params.query) === null || _l === void 0 ? void 0 : _l.dev) == '0') {
268
+ snap_toolbox_1.cookies.unset(exports.DEV_COOKIE);
269
+ this.mode = snap_toolbox_1.AppMode.production;
270
+ }
271
+ else {
272
+ snap_toolbox_1.cookies.set(exports.DEV_COOKIE, '1', 'Lax', 0);
273
+ this.mode = snap_toolbox_1.AppMode.development;
274
+ }
275
+ }
276
+ // client mode uses client config over snap config
277
+ if (this.config.client) {
278
+ this.config.client.config = this.config.client.config || {};
279
+ this.config.client.config.mode = this.config.client.config.mode || this.mode;
280
+ }
281
+ this.client = (services === null || services === void 0 ? void 0 : services.client) || new snap_client_1.Client(this.config.client.globals, this.config.client.config);
282
+ this.tracker = (services === null || services === void 0 ? void 0 : services.tracker) || new snap_tracker_1.Tracker(this.config.client.globals, { framework: 'preact' });
283
+ this.logger = (services === null || services === void 0 ? void 0 : services.logger) || new snap_logger_1.Logger({ prefix: 'Snap Preact ', mode: this.mode });
284
+ // check for tracking attribution in URL ?ss_attribution=type:id
285
+ var sessionAttribution = (_m = window.sessionStorage) === null || _m === void 0 ? void 0 : _m.getItem(SESSION_ATTRIBUTION);
286
+ if ((_p = (_o = urlParams === null || urlParams === void 0 ? void 0 : urlParams.params) === null || _o === void 0 ? void 0 : _o.query) === null || _p === void 0 ? void 0 : _p.ss_attribution) {
287
+ var attribution = urlParams.params.query.ss_attribution.split(':');
288
+ var type = attribution[0], id = attribution[1];
289
+ if (type && id) {
290
+ this.tracker.updateContext('attribution', { type: type, id: id });
291
+ }
292
+ // save to session storage
293
+ (_q = window.sessionStorage) === null || _q === void 0 ? void 0 : _q.setItem(SESSION_ATTRIBUTION, urlParams.params.query.ss_attribution);
294
+ }
295
+ else if (sessionAttribution) {
296
+ var _y = sessionAttribution.split(':'), type = _y[0], id = _y[1];
297
+ if (type && id) {
298
+ this.tracker.updateContext('attribution', { type: type, id: id });
299
+ }
300
+ }
301
+ // log version
302
+ this.logger.imageText({
303
+ url: 'https://snapui.searchspring.io/favicon.svg',
304
+ text: "[".concat(snap_toolbox_1.version, "]"),
305
+ style: "color: ".concat(this.logger.colors.indigo, "; font-weight: bold;"),
306
+ });
307
+ if (branchOverride_1 && !document.querySelector("script[".concat(exports.BRANCH_COOKIE, "]"))) {
308
+ this.logger.warn("...loading build... '".concat(branchOverride_1, "'"));
309
+ // set a cookie with branch
233
310
  if (snap_toolbox_1.featureFlags.cookies) {
234
- snap_toolbox_1.cookies.set(exports.BRANCH_COOKIE, branchParam_1, 'Lax', 3600000); // 1 hour
235
- snap_toolbox_1.cookies.set(exports.SS_DEV_COOKIE, '1', 'Lax', 0);
311
+ snap_toolbox_1.cookies.set(exports.BRANCH_COOKIE, branchOverride_1, 'Lax', 3600000); // 1 hour
236
312
  }
237
313
  else {
238
314
  this.logger.warn('Cookies are not supported/enabled by this browser, branch overrides will not persist!');
239
315
  }
240
- this.logger.setMode(snap_logger_1.LogMode.DEVELOPMENT);
241
- this.logger.warn("...loading build... '".concat(branchParam_1, "'"));
242
316
  // get the path and siteId from the current bundle script in case its not the same as the client config
243
317
  var path = "https://snapui.searchspring.io/".concat(this.config.client.globals.siteId, "/");
244
318
  var script = document.querySelector('script[src*="//snapui.searchspring.io"]');
@@ -250,9 +324,9 @@ var Snap = /** @class */ (function () {
250
324
  }
251
325
  // append script with new branch in path
252
326
  var branchScript_1 = document.createElement('script');
253
- var src_1 = "".concat(path).concat(branchParam_1, "/bundle.js");
327
+ var src_1 = "".concat(path).concat(branchOverride_1, "/bundle.js");
254
328
  branchScript_1.src = src_1;
255
- branchScript_1.setAttribute(exports.BRANCH_COOKIE, branchParam_1);
329
+ branchScript_1.setAttribute(exports.BRANCH_COOKIE, branchOverride_1);
256
330
  new snap_toolbox_1.DomTargeter([
257
331
  {
258
332
  selector: 'body',
@@ -266,32 +340,30 @@ var Snap = /** @class */ (function () {
266
340
  },
267
341
  },
268
342
  ], function (target, elem) { return __awaiter(_this, void 0, void 0, function () {
269
- var error, bundleDetails, getBundleDetails, err_1, BranchOverride;
270
- return __generator(this, function (_a) {
271
- switch (_a.label) {
343
+ var props, getBundleDetails, _a, err_1, BranchOverride;
344
+ return __generator(this, function (_b) {
345
+ switch (_b.label) {
272
346
  case 0:
273
- error = {
274
- message: 'Error',
275
- description: '',
276
- };
277
- _a.label = 1;
347
+ props = {};
348
+ _b.label = 1;
278
349
  case 1:
279
- _a.trys.push([1, 4, , 5]);
350
+ _b.trys.push([1, 4, , 5]);
280
351
  return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('./getBundleDetails/getBundleDetails')); })];
281
352
  case 2:
282
- getBundleDetails = (_a.sent()).getBundleDetails;
353
+ getBundleDetails = (_b.sent()).getBundleDetails;
354
+ _a = props;
283
355
  return [4 /*yield*/, getBundleDetails(src_1)];
284
356
  case 3:
285
- bundleDetails = _a.sent();
357
+ _a.details = _b.sent();
286
358
  return [3 /*break*/, 5];
287
359
  case 4:
288
- err_1 = _a.sent();
289
- error.description = err_1;
360
+ err_1 = _b.sent();
361
+ props.error = err_1;
290
362
  return [3 /*break*/, 5];
291
363
  case 5: return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('./components/BranchOverride')); })];
292
364
  case 6:
293
- BranchOverride = (_a.sent()).BranchOverride;
294
- (0, preact_1.render)((0, jsx_runtime_1.jsx)(BranchOverride, { name: branchParam_1, details: bundleDetails, error: error, onRemoveClick: function () {
365
+ BranchOverride = (_b.sent()).BranchOverride;
366
+ (0, preact_1.render)((0, jsx_runtime_1.jsx)(BranchOverride, __assign({}, props, { name: branchOverride_1, onRemoveClick: function () {
295
367
  snap_toolbox_1.cookies.unset(exports.BRANCH_COOKIE);
296
368
  var urlState = (0, snap_toolbox_1.url)(window.location.href);
297
369
  urlState === null || urlState === void 0 ? true : delete urlState.params.query['branch'];
@@ -302,8 +374,9 @@ var Snap = /** @class */ (function () {
302
374
  else {
303
375
  window.location.reload();
304
376
  }
305
- } }), elem);
306
- window.searchspring = undefined;
377
+ } })), elem);
378
+ // reset the global searchspring object
379
+ delete window.searchspring;
307
380
  document.head.appendChild(branchScript_1);
308
381
  return [2 /*return*/];
309
382
  }
@@ -313,33 +386,40 @@ var Snap = /** @class */ (function () {
313
386
  return;
314
387
  }
315
388
  }
316
- catch (e) { }
317
- if (window.searchspring) {
318
- window.searchspring.context = this.context;
319
- if (this.client)
320
- window.searchspring.client = this.client;
389
+ catch (e) {
390
+ this.logger.error(e);
321
391
  }
392
+ // bind to window global
393
+ window.searchspring = window.searchspring || {};
394
+ window.searchspring.context = this.context;
395
+ if (this.client)
396
+ window.searchspring.client = this.client;
322
397
  // autotrack shopper id from the context
323
- if ((_j = (_h = this.context) === null || _h === void 0 ? void 0 : _h.shopper) === null || _j === void 0 ? void 0 : _j.id) {
398
+ if ((_s = (_r = this.context) === null || _r === void 0 ? void 0 : _r.shopper) === null || _s === void 0 ? void 0 : _s.id) {
324
399
  this.tracker.track.shopper.login({
325
400
  id: this.context.shopper.id,
326
401
  });
327
402
  }
328
403
  // auto populate cart cookie from the context
329
- if ((_l = (_k = this.context) === null || _k === void 0 ? void 0 : _k.shopper) === null || _l === void 0 ? void 0 : _l.cart) {
404
+ if ((_u = (_t = this.context) === null || _t === void 0 ? void 0 : _t.shopper) === null || _u === void 0 ? void 0 : _u.cart) {
330
405
  var cart = this.context.shopper.cart;
331
406
  if (Array.isArray(cart)) {
332
407
  var cartItems = cart.filter(function (item) { return (item === null || item === void 0 ? void 0 : item.sku) || (item === null || item === void 0 ? void 0 : item.childSku); }).map(function (item) { return ((item === null || item === void 0 ? void 0 : item.sku) || (item === null || item === void 0 ? void 0 : item.childSku) || '').trim(); });
333
408
  this.tracker.cookies.cart.set(cartItems);
334
409
  }
335
410
  }
336
- Object.keys(((_m = this.config) === null || _m === void 0 ? void 0 : _m.controllers) || {}).forEach(function (type) {
411
+ Object.keys(((_v = this.config) === null || _v === void 0 ? void 0 : _v.controllers) || {}).forEach(function (type) {
337
412
  switch (type) {
338
413
  case 'search': {
339
414
  _this.config.controllers[type].forEach(function (controller, index) {
340
415
  var _a, _b, _c, _d, _e, _f, _g, _h;
341
416
  try {
417
+ if (typeof _this._controllerPromises[controller.config.id] != 'undefined') {
418
+ _this.logger.error("Controller with id '".concat(controller.config.id, "' is already defined"));
419
+ return;
420
+ }
342
421
  var cntrlr_1 = (0, createSearchController_1.default)({
422
+ mode: _this.mode,
343
423
  url: (0, deepmerge_1.default)(_this.config.url || {}, controller.url || {}),
344
424
  controller: controller.config,
345
425
  context: (0, deepmerge_1.default)(_this.context || {}, controller.context || {}),
@@ -352,7 +432,8 @@ var Snap = /** @class */ (function () {
352
432
  logger: (_f = controller.services) === null || _f === void 0 ? void 0 : _f.logger,
353
433
  tracker: ((_g = controller.services) === null || _g === void 0 ? void 0 : _g.tracker) || _this.tracker,
354
434
  });
355
- _this.controllers[cntrlr_1.config.id] = cntrlr_1;
435
+ window.searchspring.controller = window.searchspring.controller || {};
436
+ window.searchspring.controller[cntrlr_1.config.id] = _this.controllers[cntrlr_1.config.id] = cntrlr_1;
356
437
  _this._controllerPromises[cntrlr_1.config.id] = new Promise(function (resolve) { return resolve(cntrlr_1); });
357
438
  var searched_1 = false;
358
439
  var runSearch_1 = function () {
@@ -434,6 +515,10 @@ var Snap = /** @class */ (function () {
434
515
  }
435
516
  case 'autocomplete': {
436
517
  _this.config.controllers[type].forEach(function (controller, index) {
518
+ if (typeof _this._controllerPromises[controller.config.id] != 'undefined') {
519
+ _this.logger.error("Controller with id '".concat(controller.config.id, "' is already defined"));
520
+ return;
521
+ }
437
522
  _this._controllerPromises[controller.config.id] = new Promise(function (resolve) {
438
523
  var _a;
439
524
  try {
@@ -480,7 +565,7 @@ var Snap = /** @class */ (function () {
480
565
  });
481
566
  }); };
482
567
  if (!(controller === null || controller === void 0 ? void 0 : controller.targeters) || (controller === null || controller === void 0 ? void 0 : controller.targeters.length) === 0) {
483
- _this.createController(snap_controller_1.ControllerTypes.autocomplete, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
568
+ _this._createController(snap_controller_1.ControllerTypes.autocomplete, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
484
569
  if (cntrlr)
485
570
  resolve(cntrlr);
486
571
  });
@@ -508,7 +593,7 @@ var Snap = /** @class */ (function () {
508
593
  var cntrlr;
509
594
  return __generator(this, function (_a) {
510
595
  switch (_a.label) {
511
- case 0: return [4 /*yield*/, this.createController(snap_controller_1.ControllerTypes.autocomplete, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
596
+ case 0: return [4 /*yield*/, this._createController(snap_controller_1.ControllerTypes.autocomplete, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
512
597
  if (cntrlr)
513
598
  resolve(cntrlr);
514
599
  })];
@@ -532,6 +617,10 @@ var Snap = /** @class */ (function () {
532
617
  }
533
618
  case 'finder': {
534
619
  _this.config.controllers[type].forEach(function (controller, index) {
620
+ if (typeof _this._controllerPromises[controller.config.id] != 'undefined') {
621
+ _this.logger.error("Controller with id '".concat(controller.config.id, "' is already defined"));
622
+ return;
623
+ }
535
624
  _this._controllerPromises[controller.config.id] = new Promise(function (resolve) {
536
625
  var _a;
537
626
  try {
@@ -576,7 +665,7 @@ var Snap = /** @class */ (function () {
576
665
  });
577
666
  }); };
578
667
  if (!(controller === null || controller === void 0 ? void 0 : controller.targeters) || (controller === null || controller === void 0 ? void 0 : controller.targeters.length) === 0) {
579
- _this.createController(snap_controller_1.ControllerTypes.finder, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
668
+ _this._createController(snap_controller_1.ControllerTypes.finder, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
580
669
  if (cntrlr)
581
670
  resolve(cntrlr);
582
671
  });
@@ -592,7 +681,7 @@ var Snap = /** @class */ (function () {
592
681
  var cntrlr;
593
682
  return __generator(this, function (_a) {
594
683
  switch (_a.label) {
595
- case 0: return [4 /*yield*/, this.createController(snap_controller_1.ControllerTypes.finder, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
684
+ case 0: return [4 /*yield*/, this._createController(snap_controller_1.ControllerTypes.finder, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
596
685
  if (cntrlr)
597
686
  resolve(cntrlr);
598
687
  })];
@@ -616,6 +705,10 @@ var Snap = /** @class */ (function () {
616
705
  }
617
706
  case 'recommendation': {
618
707
  _this.config.controllers[type].forEach(function (controller, index) {
708
+ if (typeof _this._controllerPromises[controller.config.id] != 'undefined') {
709
+ _this.logger.error("Controller with id '".concat(controller.config.id, "' is already defined"));
710
+ return;
711
+ }
619
712
  _this._controllerPromises[controller.config.id] = new Promise(function (resolve) {
620
713
  var _a;
621
714
  try {
@@ -660,7 +753,7 @@ var Snap = /** @class */ (function () {
660
753
  });
661
754
  }); };
662
755
  if (!(controller === null || controller === void 0 ? void 0 : controller.targeters) || (controller === null || controller === void 0 ? void 0 : controller.targeters.length) === 0) {
663
- _this.createController(snap_controller_1.ControllerTypes.recommendation, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
756
+ _this._createController(snap_controller_1.ControllerTypes.recommendation, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
664
757
  if (cntrlr)
665
758
  resolve(cntrlr);
666
759
  });
@@ -676,7 +769,7 @@ var Snap = /** @class */ (function () {
676
769
  var cntrlr;
677
770
  return __generator(this, function (_a) {
678
771
  switch (_a.label) {
679
- case 0: return [4 /*yield*/, this.createController(snap_controller_1.ControllerTypes.recommendation, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
772
+ case 0: return [4 /*yield*/, this._createController(snap_controller_1.ControllerTypes.recommendation, controller.config, controller.services, controller.url, controller.context, function (cntrlr) {
680
773
  if (cntrlr)
681
774
  resolve(cntrlr);
682
775
  })];
@@ -700,10 +793,11 @@ var Snap = /** @class */ (function () {
700
793
  }
701
794
  }
702
795
  });
703
- if ((_p = (_o = this.config) === null || _o === void 0 ? void 0 : _o.instantiators) === null || _p === void 0 ? void 0 : _p.recommendation) {
796
+ if ((_x = (_w = this.config) === null || _w === void 0 ? void 0 : _w.instantiators) === null || _x === void 0 ? void 0 : _x.recommendation) {
704
797
  try {
705
798
  this._instantiatorPromises.recommendation = Promise.resolve().then(function () { return __importStar(require('./Instantiators/RecommendationInstantiator')); }).then(function (_a) {
706
799
  var RecommendationInstantiator = _a.RecommendationInstantiator;
800
+ _this.config.instantiators.recommendation.mode = _this.config.instantiators.recommendation.mode || _this.mode;
707
801
  return new RecommendationInstantiator(_this.config.instantiators.recommendation, {
708
802
  client: _this.client,
709
803
  tracker: _this.tracker,
@@ -1,5 +1,5 @@
1
1
  import { AutocompleteController } from '@searchspring/snap-controller';
2
2
  import type { SnapControllerServices, SnapAutocompleteControllerConfig } from '../types';
3
- declare const _default: (config: SnapAutocompleteControllerConfig, services?: SnapControllerServices) => AutocompleteController;
3
+ declare const _default: (config: SnapAutocompleteControllerConfig, services?: SnapControllerServices | undefined) => AutocompleteController;
4
4
  export default _default;
5
5
  //# sourceMappingURL=createAutocompleteController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createAutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/create/createAutocompleteController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AASvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;iCAIjE,gCAAgC,aAAa,sBAAsB,KAAG,sBAAsB;AAApH,wBAkBE"}
1
+ {"version":3,"file":"createAutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/create/createAutocompleteController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AASvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;iCAIjE,gCAAgC,oDAAsC,sBAAsB;AAApH,wBAwBE"}
@@ -12,13 +12,18 @@ var snap_tracker_1 = require("@searchspring/snap-tracker");
12
12
  (0, mobx_1.configure)({ useProxies: 'never' });
13
13
  exports.default = (function (config, services) {
14
14
  var urlManager = ((services === null || services === void 0 ? void 0 : services.urlManager) || new snap_url_manager_1.UrlManager(new snap_url_manager_1.UrlTranslator(config.url), snap_url_manager_1.reactLinker)).detach();
15
+ // set client mode
16
+ if (config.mode && config.client) {
17
+ config.client.config = config.client.config || {};
18
+ config.client.config.mode = config.mode;
19
+ }
15
20
  var cntrlr = new snap_controller_1.AutocompleteController(config.controller, {
16
21
  client: (services === null || services === void 0 ? void 0 : services.client) || new snap_client_1.Client(config.client.globals, config.client.config),
17
22
  store: (services === null || services === void 0 ? void 0 : services.store) || new snap_store_mobx_1.AutocompleteStore(config.controller, { urlManager: urlManager }),
18
23
  urlManager: urlManager,
19
24
  eventManager: (services === null || services === void 0 ? void 0 : services.eventManager) || new snap_event_manager_1.EventManager(),
20
25
  profiler: (services === null || services === void 0 ? void 0 : services.profiler) || new snap_profiler_1.Profiler(),
21
- logger: (services === null || services === void 0 ? void 0 : services.logger) || new snap_logger_1.Logger(),
26
+ logger: (services === null || services === void 0 ? void 0 : services.logger) || new snap_logger_1.Logger({ mode: config.mode }),
22
27
  tracker: (services === null || services === void 0 ? void 0 : services.tracker) || new snap_tracker_1.Tracker(config.client.globals),
23
28
  }, config.context);
24
29
  return cntrlr;
@@ -1,5 +1,5 @@
1
1
  import { FinderController } from '@searchspring/snap-controller';
2
2
  import type { SnapControllerServices, SnapFinderControllerConfig } from '../types';
3
- declare const _default: (config: SnapFinderControllerConfig, services?: SnapControllerServices) => FinderController;
3
+ declare const _default: (config: SnapFinderControllerConfig, services?: SnapControllerServices | undefined) => FinderController;
4
4
  export default _default;
5
5
  //# sourceMappingURL=createFinderController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createFinderController.d.ts","sourceRoot":"","sources":["../../../src/create/createFinderController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AASjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;iCAI3D,0BAA0B,aAAa,sBAAsB,KAAG,gBAAgB;AAAxG,wBAkBE"}
1
+ {"version":3,"file":"createFinderController.d.ts","sourceRoot":"","sources":["../../../src/create/createFinderController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AASjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;iCAI3D,0BAA0B,oDAAsC,gBAAgB;AAAxG,wBAwBE"}
@@ -12,13 +12,18 @@ var snap_tracker_1 = require("@searchspring/snap-tracker");
12
12
  (0, mobx_1.configure)({ useProxies: 'never' });
13
13
  exports.default = (function (config, services) {
14
14
  var urlManager = ((services === null || services === void 0 ? void 0 : services.urlManager) || new snap_url_manager_1.UrlManager(new snap_url_manager_1.UrlTranslator(config.url), snap_url_manager_1.reactLinker)).detach(true);
15
+ // set client mode
16
+ if (config.mode && config.client) {
17
+ config.client.config = config.client.config || {};
18
+ config.client.config.mode = config.mode;
19
+ }
15
20
  var cntrlr = new snap_controller_1.FinderController(config.controller, {
16
21
  client: (services === null || services === void 0 ? void 0 : services.client) || new snap_client_1.Client(config.client.globals, config.client.config),
17
22
  store: (services === null || services === void 0 ? void 0 : services.store) || new snap_store_mobx_1.FinderStore(config.controller, { urlManager: urlManager }),
18
23
  urlManager: urlManager,
19
24
  eventManager: (services === null || services === void 0 ? void 0 : services.eventManager) || new snap_event_manager_1.EventManager(),
20
25
  profiler: (services === null || services === void 0 ? void 0 : services.profiler) || new snap_profiler_1.Profiler(),
21
- logger: (services === null || services === void 0 ? void 0 : services.logger) || new snap_logger_1.Logger(),
26
+ logger: (services === null || services === void 0 ? void 0 : services.logger) || new snap_logger_1.Logger({ mode: config.mode }),
22
27
  tracker: (services === null || services === void 0 ? void 0 : services.tracker) || new snap_tracker_1.Tracker(config.client.globals),
23
28
  }, config.context);
24
29
  return cntrlr;
@@ -1,5 +1,5 @@
1
1
  import { RecommendationController } from '@searchspring/snap-controller';
2
2
  import type { SnapControllerServices, SnapRecommendationControllerConfig } from '../types';
3
- declare const _default: (config: SnapRecommendationControllerConfig, services?: SnapControllerServices) => RecommendationController;
3
+ declare const _default: (config: SnapRecommendationControllerConfig, services?: SnapControllerServices | undefined) => RecommendationController;
4
4
  export default _default;
5
5
  //# sourceMappingURL=createRecommendationController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createRecommendationController.d.ts","sourceRoot":"","sources":["../../../src/create/createRecommendationController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AASzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,kCAAkC,EAAE,MAAM,UAAU,CAAC;iCAInE,kCAAkC,aAAa,sBAAsB,KAAG,wBAAwB;AAAxH,wBAiBE"}
1
+ {"version":3,"file":"createRecommendationController.d.ts","sourceRoot":"","sources":["../../../src/create/createRecommendationController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AASzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,kCAAkC,EAAE,MAAM,UAAU,CAAC;iCAInE,kCAAkC,oDAAsC,wBAAwB;AAAxH,wBAwBE"}
@@ -12,13 +12,18 @@ var snap_tracker_1 = require("@searchspring/snap-tracker");
12
12
  (0, mobx_1.configure)({ useProxies: 'never' });
13
13
  exports.default = (function (config, services) {
14
14
  var urlManager = ((services === null || services === void 0 ? void 0 : services.urlManager) || new snap_url_manager_1.UrlManager(new snap_url_manager_1.UrlTranslator(config.url), snap_url_manager_1.reactLinker)).detach(true);
15
+ // set client mode
16
+ if (config.mode && config.client) {
17
+ config.client.config = config.client.config || {};
18
+ config.client.config.mode = config.mode;
19
+ }
15
20
  var cntrlr = new snap_controller_1.RecommendationController(config.controller, {
16
21
  client: (services === null || services === void 0 ? void 0 : services.client) || new snap_client_1.Client(config.client.globals, config.client.config),
17
22
  store: (services === null || services === void 0 ? void 0 : services.store) || new snap_store_mobx_1.RecommendationStore(config.controller, { urlManager: urlManager }),
18
23
  urlManager: urlManager,
19
24
  eventManager: (services === null || services === void 0 ? void 0 : services.eventManager) || new snap_event_manager_1.EventManager(),
20
25
  profiler: (services === null || services === void 0 ? void 0 : services.profiler) || new snap_profiler_1.Profiler(),
21
- logger: (services === null || services === void 0 ? void 0 : services.logger) || new snap_logger_1.Logger(),
26
+ logger: (services === null || services === void 0 ? void 0 : services.logger) || new snap_logger_1.Logger({ mode: config.mode }),
22
27
  tracker: (services === null || services === void 0 ? void 0 : services.tracker) || new snap_tracker_1.Tracker(config.client.globals),
23
28
  }, config.context);
24
29
  return cntrlr;
@@ -1,5 +1,5 @@
1
1
  import { SearchController } from '@searchspring/snap-controller';
2
2
  import type { SnapControllerServices, SnapSearchControllerConfig } from '../types';
3
- declare const _default: (config: SnapSearchControllerConfig, services?: SnapControllerServices) => SearchController;
3
+ declare const _default: (config: SnapSearchControllerConfig, services?: SnapControllerServices | undefined) => SearchController;
4
4
  export default _default;
5
5
  //# sourceMappingURL=createSearchController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSearchController.d.ts","sourceRoot":"","sources":["../../../src/create/createSearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAQjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;iCAI3D,0BAA0B,aAAa,sBAAsB,KAAG,gBAAgB;AAAxG,wBAkBE"}
1
+ {"version":3,"file":"createSearchController.d.ts","sourceRoot":"","sources":["../../../src/create/createSearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAQjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;iCAI3D,0BAA0B,oDAAsC,gBAAgB;AAAxG,wBAwBE"}
@@ -12,13 +12,18 @@ var snap_tracker_1 = require("@searchspring/snap-tracker");
12
12
  (0, mobx_1.configure)({ useProxies: 'never' });
13
13
  exports.default = (function (config, services) {
14
14
  var urlManager = (services === null || services === void 0 ? void 0 : services.urlManager) || new snap_url_manager_1.UrlManager(new snap_url_manager_1.UrlTranslator(config.url), snap_url_manager_1.reactLinker);
15
+ // set client mode
16
+ if (config.mode && config.client) {
17
+ config.client.config = config.client.config || {};
18
+ config.client.config.mode = config.mode;
19
+ }
15
20
  var cntrlr = new snap_controller_1.SearchController(config.controller, {
16
21
  client: (services === null || services === void 0 ? void 0 : services.client) || new snap_client_1.Client(config.client.globals, config.client.config),
17
22
  store: (services === null || services === void 0 ? void 0 : services.store) || new snap_store_mobx_1.SearchStore(config.controller, { urlManager: urlManager }),
18
23
  urlManager: urlManager,
19
24
  eventManager: (services === null || services === void 0 ? void 0 : services.eventManager) || new snap_event_manager_1.EventManager(),
20
25
  profiler: (services === null || services === void 0 ? void 0 : services.profiler) || new snap_profiler_1.Profiler(),
21
- logger: (services === null || services === void 0 ? void 0 : services.logger) || new snap_logger_1.Logger(),
26
+ logger: (services === null || services === void 0 ? void 0 : services.logger) || new snap_logger_1.Logger({ mode: config.mode }),
22
27
  tracker: (services === null || services === void 0 ? void 0 : services.tracker) || new snap_tracker_1.Tracker(config.client.globals),
23
28
  }, config.context);
24
29
  return cntrlr;
@@ -1,12 +1,12 @@
1
- /// <reference types="react" />
2
1
  import type { Client, ClientConfig, ClientGlobals } from '@searchspring/snap-client';
3
- import type { AbstractController, SearchControllerConfig, AutocompleteControllerConfig, FinderControllerConfig, RecommendationControllerConfig, ContextVariables } from '@searchspring/snap-controller';
2
+ import type { SearchControllerConfig, AutocompleteControllerConfig, FinderControllerConfig, RecommendationControllerConfig, ContextVariables } from '@searchspring/snap-controller';
4
3
  import type { SearchStore, AutocompleteStore, FinderStore, RecommendationStore } from '@searchspring/snap-store-mobx';
5
4
  import type { UrlManager, UrlTranslatorConfig } from '@searchspring/snap-url-manager';
6
5
  import type { EventManager } from '@searchspring/snap-event-manager';
7
6
  import type { Profiler } from '@searchspring/snap-profiler';
8
7
  import type { Logger } from '@searchspring/snap-logger';
9
8
  import type { Tracker } from '@searchspring/snap-tracker';
9
+ import { AppMode } from '@searchspring/snap-toolbox';
10
10
  export declare type SnapControllerServices = {
11
11
  client?: Client;
12
12
  store?: SearchStore | AutocompleteStore | FinderStore | RecommendationStore;
@@ -17,10 +17,8 @@ export declare type SnapControllerServices = {
17
17
  tracker?: Tracker;
18
18
  };
19
19
  export declare type SnapControllerConfigs = SnapSearchControllerConfig | SnapAutocompleteControllerConfig | SnapFinderControllerConfig | SnapRecommendationControllerConfig;
20
- export declare type RootComponent = React.ElementType<{
21
- controller: AbstractController;
22
- }>;
23
20
  export declare type SnapSearchControllerConfig = {
21
+ mode?: keyof typeof AppMode | AppMode;
24
22
  url?: UrlTranslatorConfig;
25
23
  client?: {
26
24
  globals: ClientGlobals;
@@ -30,6 +28,7 @@ export declare type SnapSearchControllerConfig = {
30
28
  context?: ContextVariables;
31
29
  };
32
30
  export declare type SnapAutocompleteControllerConfig = {
31
+ mode?: keyof typeof AppMode | AppMode;
33
32
  url?: UrlTranslatorConfig;
34
33
  client?: {
35
34
  globals: ClientGlobals;
@@ -39,6 +38,7 @@ export declare type SnapAutocompleteControllerConfig = {
39
38
  context?: ContextVariables;
40
39
  };
41
40
  export declare type SnapFinderControllerConfig = {
41
+ mode?: keyof typeof AppMode | AppMode;
42
42
  url?: UrlTranslatorConfig;
43
43
  client?: {
44
44
  globals: ClientGlobals;
@@ -48,6 +48,7 @@ export declare type SnapFinderControllerConfig = {
48
48
  context?: ContextVariables;
49
49
  };
50
50
  export declare type SnapRecommendationControllerConfig = {
51
+ mode?: keyof typeof AppMode | AppMode;
51
52
  url?: UrlTranslatorConfig;
52
53
  client?: {
53
54
  globals: ClientGlobals;