@miso.ai/client-sdk-ui 1.11.4-beta.1 → 1.11.4-beta.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 (87) hide show
  1. package/dist/cjs/actor/filters.js +57 -11
  2. package/dist/cjs/actor/tracker.js +1 -6
  3. package/dist/cjs/actor/view.js +6 -8
  4. package/dist/cjs/actor/views.js +10 -26
  5. package/dist/cjs/constants.js +12 -2
  6. package/dist/cjs/element/role/index.js +7 -0
  7. package/dist/cjs/element/role/miso-sort.js +20 -0
  8. package/dist/cjs/layout/affiliation/affiliation.js +1 -1
  9. package/dist/cjs/layout/container/container.js +2 -2
  10. package/dist/cjs/layout/index.js +7 -0
  11. package/dist/cjs/layout/input/facets.js +2 -2
  12. package/dist/cjs/layout/input/search-box.js +1 -1
  13. package/dist/cjs/layout/input/select.js +150 -0
  14. package/dist/cjs/layout/raf.js +2 -4
  15. package/dist/cjs/layout/trackable.js +3 -3
  16. package/dist/cjs/layout/triggerable.js +1 -1
  17. package/dist/cjs/util/trackers.js +2 -0
  18. package/dist/cjs/version.js +1 -1
  19. package/dist/cjs/workflow/answer-based.js +2 -2
  20. package/dist/cjs/workflow/ask.js +4 -1
  21. package/dist/cjs/workflow/base.js +4 -4
  22. package/dist/cjs/workflow/context.js +3 -3
  23. package/dist/cjs/workflow/explore.js +2 -2
  24. package/dist/cjs/workflow/hybrid-search-answer.js +9 -7
  25. package/dist/cjs/workflow/hybrid-search-results.js +18 -16
  26. package/dist/cjs/workflow/hybrid-search-views.js +5 -12
  27. package/dist/cjs/workflow/hybrid-search.js +2 -2
  28. package/dist/cjs/workflow/options/api.js +56 -0
  29. package/dist/cjs/workflow/options/configurable.js +49 -0
  30. package/dist/cjs/workflow/options/data-processor.js +23 -0
  31. package/dist/cjs/workflow/options/filters.js +18 -0
  32. package/dist/cjs/workflow/options/index.js +115 -0
  33. package/dist/cjs/workflow/options/interactions.js +44 -0
  34. package/dist/cjs/workflow/options/layouts.js +83 -0
  35. package/dist/cjs/workflow/options/options.js +154 -0
  36. package/dist/cjs/workflow/options/pagination.js +28 -0
  37. package/dist/cjs/workflow/options/roles.js +17 -0
  38. package/dist/cjs/workflow/options/trackers.js +39 -0
  39. package/dist/cjs/workflow/options/utils.js +33 -0
  40. package/dist/cjs/workflow/processors.js +39 -33
  41. package/dist/cjs/workflow/recommendation.js +2 -2
  42. package/dist/cjs/workflow/search-based.js +59 -22
  43. package/package.json +2 -2
  44. package/src/actor/filters.js +53 -12
  45. package/src/actor/tracker.js +1 -6
  46. package/src/actor/view.js +7 -8
  47. package/src/actor/views.js +9 -30
  48. package/src/constants.js +11 -0
  49. package/src/element/role/index.js +1 -0
  50. package/src/element/role/miso-sort.js +16 -0
  51. package/src/layout/affiliation/affiliation.js +1 -1
  52. package/src/layout/container/container.js +2 -2
  53. package/src/layout/index.js +1 -0
  54. package/src/layout/input/facets.js +3 -2
  55. package/src/layout/input/search-box.js +1 -1
  56. package/src/layout/input/select.js +142 -0
  57. package/src/layout/raf.js +2 -2
  58. package/src/layout/trackable.js +3 -3
  59. package/src/layout/triggerable.js +1 -1
  60. package/src/util/trackers.js +2 -0
  61. package/src/version.js +1 -1
  62. package/src/workflow/answer-based.js +1 -1
  63. package/src/workflow/ask.js +4 -1
  64. package/src/workflow/base.js +1 -1
  65. package/src/workflow/context.js +1 -1
  66. package/src/workflow/explore.js +1 -1
  67. package/src/workflow/hybrid-search-answer.js +8 -3
  68. package/src/workflow/hybrid-search-results.js +21 -7
  69. package/src/workflow/hybrid-search-views.js +4 -12
  70. package/src/workflow/hybrid-search.js +3 -3
  71. package/src/workflow/options/api.js +46 -0
  72. package/src/workflow/options/configurable.js +48 -0
  73. package/src/workflow/options/data-processor.js +15 -0
  74. package/src/workflow/options/filters.js +10 -0
  75. package/src/workflow/options/index.js +10 -0
  76. package/src/workflow/options/interactions.js +36 -0
  77. package/src/workflow/options/layouts.js +73 -0
  78. package/src/workflow/options/options.js +169 -0
  79. package/src/workflow/options/pagination.js +18 -0
  80. package/src/workflow/options/roles.js +12 -0
  81. package/src/workflow/options/trackers.js +32 -0
  82. package/src/workflow/options/utils.js +26 -0
  83. package/src/workflow/processors.js +30 -34
  84. package/src/workflow/recommendation.js +1 -1
  85. package/src/workflow/search-based.js +58 -13
  86. package/dist/cjs/workflow/options.js +0 -448
  87. package/src/workflow/options.js +0 -433
@@ -1,10 +1,10 @@
1
- import { API } from '@miso.ai/commons';
1
+ import { API, asArray, trimObj } from '@miso.ai/commons';
2
2
  import Workflow from './base.js';
3
3
  import { fields } from '../actor/index.js';
4
- import { STATUS, ROLE } from '../constants.js';
5
- import { SearchBoxLayout, ListLayout, TextLayout, FacetsLayout, MoreButtonLayout } from '../layout/index.js';
6
- import { writeKeywordsToData, writeFiltersToPayload, retainFacetCountsInData, writeExhaustionToData, concatItemsFromMoreResponse } from './processors.js';
7
- import { mergeRolesOptions, makeConfigurable } from './options.js';
4
+ import { STATUS, ROLE, WORKFLOW_CONFIGURABLE } from '../constants.js';
5
+ import { SearchBoxLayout, ListLayout, TextLayout, FacetsLayout, SelectLayout, MoreButtonLayout } from '../layout/index.js';
6
+ import { mappingSortData, writeKeywordsToData, retainFacetCountsInData, writeExhaustionToData, concatItemsFromMoreResponse } from './processors.js';
7
+ import { mergeRolesOptions, makeConfigurable } from './options/index.js';
8
8
 
9
9
  const DEFAULT_ROWS = 10;
10
10
  const DEFAULT_PAGE_LIMIT = 10;
@@ -26,6 +26,7 @@ const DEFAULT_LAYOUTS = Object.freeze({
26
26
  [ROLE.KEYWORDS]: [TextLayout.type, { raw: true }],
27
27
  [ROLE.TOTAL]: [TextLayout.type, { raw: true, format: 'number' }],
28
28
  [ROLE.FACETS]: [FacetsLayout.type],
29
+ [ROLE.SORT]: [SelectLayout.type],
29
30
  [ROLE.MORE]: [MoreButtonLayout.type],
30
31
  });
31
32
 
@@ -53,6 +54,7 @@ const ROLES_OPTIONS = mergeRolesOptions(Workflow.ROLES_OPTIONS, {
53
54
  members: Object.keys(DEFAULT_LAYOUTS),
54
55
  mappings: {
55
56
  [ROLE.FACETS]: 'facet_counts',
57
+ [ROLE.SORT]: mappingSortData,
56
58
  },
57
59
  });
58
60
 
@@ -63,8 +65,9 @@ export default class SearchBasedWorkflow extends Workflow {
63
65
  this._unsubscribes = [
64
66
  ...this._unsubscribes,
65
67
  this._hub.on(fields.query(), args => this._query(args)),
66
- this._hub.on(fields.filters(), filters => this._refine(filters)),
68
+ this._hub.on(fields.filters(), () => this._refine()),
67
69
  this._hub.on(fields.more(), () => this._more()),
70
+ this._views.get(ROLE.SORT).on('select', event => this._handleSortSelect(event)),
68
71
  ];
69
72
  }
70
73
 
@@ -104,7 +107,7 @@ export default class SearchBasedWorkflow extends Workflow {
104
107
  this._request({ payload });
105
108
  }
106
109
 
107
- _refine(filters) {
110
+ _refine() {
108
111
  // remember current facet_counts
109
112
  const { facet_counts } = this._hub.states[fields.data()].value || {};
110
113
  this._currentFacetCounts = facet_counts;
@@ -114,7 +117,7 @@ export default class SearchBasedWorkflow extends Workflow {
114
117
 
115
118
  // payload
116
119
  const query = this._getQuery();
117
- const payload = this._buildPayload({ ...query, filters });
120
+ const payload = this._buildPayload(query);
118
121
 
119
122
  this._request({ payload });
120
123
  }
@@ -134,8 +137,7 @@ export default class SearchBasedWorkflow extends Workflow {
134
137
 
135
138
  // payload
136
139
  const query = this._getQuery();
137
- const filters = this._hub.states[fields.filters()]; // get stored filters
138
- let payload = this._buildPayload({ ...query, filters });
140
+ let payload = this._buildPayload(query);
139
141
  payload = this._processPayloadForMoreRequest(payload);
140
142
 
141
143
  this._request({ payload });
@@ -150,12 +152,46 @@ export default class SearchBasedWorkflow extends Workflow {
150
152
  return this._options.resolved.api.payload.rows;
151
153
  }
152
154
 
153
- _buildPayload({ filters, ...payload } = {}) {
154
- payload = writeFiltersToPayload(payload, filters);
155
+ _buildPayload(payload) {
156
+ payload = this._writeFiltersToPayload(payload);
155
157
  payload = this._writePageInfoToPayload(payload);
156
158
  return payload;
157
159
  }
158
160
 
161
+ _writeFiltersToPayload(payload) {
162
+ const filters = this._hub.states[fields.filters()];
163
+ const { facets, sort } = filters || {};
164
+ return trimObj({
165
+ ...payload,
166
+ facet_filters: this._buildFacetFilters(facets),
167
+ order_by: this._buildOrderBy(sort),
168
+ });
169
+ }
170
+
171
+ _buildFacetFilters(facets) {
172
+ if (!facets) {
173
+ return undefined;
174
+ }
175
+ const filters = {};
176
+ for (const field in facets) {
177
+ const values = facets[field];
178
+ if (!values || !values.length) {
179
+ continue; // just in case
180
+ }
181
+ filters[field] = {
182
+ terms: values,
183
+ };
184
+ }
185
+ return Object.keys(filters).length ? filters : undefined;
186
+ }
187
+
188
+ _buildOrderBy(sort) {
189
+ if (!sort) {
190
+ return undefined;
191
+ }
192
+ return asArray(sort);
193
+ }
194
+
159
195
  _writePageInfoToPayload(payload) {
160
196
  return {
161
197
  ...payload,
@@ -208,9 +244,18 @@ export default class SearchBasedWorkflow extends Workflow {
208
244
  return concatItemsFromMoreResponse(currentData, data, { role: this._roles.main });
209
245
  }
210
246
 
247
+ // view actions //
248
+ _handleSortSelect({ value } = {}) {
249
+ if (!value) {
250
+ return;
251
+ }
252
+ this._views.filters.update({ sort: value });
253
+ this._views.filters.apply();
254
+ }
255
+
211
256
  }
212
257
 
213
- makeConfigurable(SearchBasedWorkflow.prototype, ['pagination']);
258
+ makeConfigurable(SearchBasedWorkflow.prototype, [WORKFLOW_CONFIGURABLE.PAGINATION, WORKFLOW_CONFIGURABLE.FILTERS]);
214
259
 
215
260
  Object.assign(SearchBasedWorkflow, {
216
261
  DEFAULT_API_OPTIONS,
@@ -1,448 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.WorkflowOptions = exports.WorkflowContextOptions = void 0;
7
- exports.makeConfigurable = makeConfigurable;
8
- exports.mergeApiOptions = mergeApiOptions;
9
- exports.mergeAutocompleteOptions = mergeAutocompleteOptions;
10
- exports.mergeDataProcessorOptions = mergeDataProcessorOptions;
11
- exports.mergeInteractionsOptions = mergeInteractionsOptions;
12
- exports.mergeLayoutsOptions = mergeLayoutsOptions;
13
- exports.mergePaginationOptions = mergePaginationOptions;
14
- exports.mergeRolesOptions = mergeRolesOptions;
15
- exports.mergeTrackersOptions = mergeTrackersOptions;
16
- exports.normalizeApiOptions = normalizeApiOptions;
17
- exports.normalizeDataProcessorOptions = normalizeDataProcessorOptions;
18
- exports.normalizeInteractionsOptions = normalizeInteractionsOptions;
19
- exports.normalizeLayoutsOptions = normalizeLayoutsOptions;
20
- exports.normalizePaginationOptions = normalizePaginationOptions;
21
- exports.normalizeTrackers = normalizeTrackers;
22
- var _commons = require("@miso.ai/commons");
23
- var _constants = require("../constants.js");
24
- function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
25
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
26
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
27
- // normalize //
28
- function normalizeApiOptions() {
29
- let [name, payload] = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
30
- // TODO: take object form as well
31
- if (name === false) {
32
- return {
33
- actor: false
34
- };
35
- }
36
- if (typeof name === 'object' && payload === undefined) {
37
- payload = name;
38
- name = undefined;
39
- }
40
- let group = undefined;
41
- if (name && name.indexOf('/') !== -1) {
42
- [group, name] = name.split('/');
43
- }
44
- if (name && typeof name !== 'string' || payload !== undefined && typeof payload !== 'object') {
45
- throw new Error(`Invalid arguments for useApi(): ${name}, ${payload}`);
46
- }
47
- return (0, _commons.trimObj)({
48
- group,
49
- name,
50
- payload
51
- });
52
- }
53
- function normalizeLayoutsOptions() {
54
- let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
55
- if (options === false) {
56
- return false;
57
- }
58
- // fallback: results -> products
59
- const _ROLE$RESULTS = _constants.ROLE.RESULTS,
60
- {
61
- [_ROLE$RESULTS]: results
62
- } = options,
63
- rest = _objectWithoutPropertiesLoose(options, [_ROLE$RESULTS].map(_toPropertyKey));
64
- if (results !== undefined) {
65
- console.warn(`useLayouts({ ${[_constants.ROLE.RESULTS]}: ... }) is deprecated, use useLayouts({ ${[_constants.ROLE.PRODUCTS]}: ... }) instead`);
66
- options = Object.assign({}, rest, {
67
- [_constants.ROLE.PRODUCTS]: results
68
- });
69
- }
70
- const normalize = {};
71
- for (const [role, args] of Object.entries(options)) {
72
- normalize[normalizeRole(role)] = normalizeLayoutOptions(args);
73
- }
74
- return normalize;
75
- }
76
- function normalizeRole(role) {
77
- role = (0, _commons.lowerCamelToSnake)(role);
78
- role = (0, _commons.kebabToSnake)(role);
79
- return role;
80
- }
81
- function normalizeLayoutOptions(args) {
82
- // take args:
83
- // * undefined
84
- // * false
85
- // * name (string)
86
- // * options (object)
87
- // * [name, options]
88
- if (args === undefined) {
89
- return undefined;
90
- }
91
- let [name, options] = (0, _commons.asArray)(args);
92
- if (typeof name === 'object') {
93
- options = name;
94
- name = undefined;
95
- }
96
- return [name, options];
97
- }
98
- function normalizeDataProcessorOptions(fns) {
99
- fns = (0, _commons.asArray)(fns);
100
- for (const fn of fns) {
101
- if (typeof fn !== 'function') {
102
- throw new Error(`Expect data processor options to be a function: ${fn}`);
103
- }
104
- }
105
- return fns;
106
- }
107
- function normalizeTrackers(options) {
108
- if (options === undefined || options === false) {
109
- return options;
110
- }
111
- const normalized = {};
112
- for (const [role, args] of Object.entries(options)) {
113
- normalized[role] = normalizeTrackerOptions(args);
114
- }
115
- return normalized;
116
- }
117
- function normalizeTrackerOptions(options) {
118
- return options;
119
- }
120
- function normalizeInteractionsOptions(options) {
121
- if (options === undefined) {
122
- return undefined;
123
- }
124
- if (options === false) {
125
- return {
126
- handle: () => {}
127
- };
128
- }
129
- // preprocess
130
- const preprocess = (0, _commons.asArray)(options.preprocess);
131
- for (const p of preprocess) {
132
- if (typeof p !== 'function') {
133
- throw new Error(`Expect preprocess options to be a function: ${p}`);
134
- }
135
- }
136
- // handle
137
- if (options.handle && typeof options.handle !== 'function') {
138
- throw new Error(`Expect handle options to be a function: ${options.handle}`);
139
- }
140
- return Object.assign({}, options, {
141
- preprocess
142
- });
143
- }
144
- function normalizePaginationOptions(options) {
145
- if (options === undefined) {
146
- throw new Error(`Expect pagination options to be an object or a boolean value: ${options}`);
147
- }
148
- if (typeof options === 'boolean') {
149
- options = {
150
- active: options
151
- };
152
- }
153
- return options;
154
- }
155
-
156
- // merge //
157
- function mergeApiOptions() {
158
- for (var _len = arguments.length, optionsList = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {
159
- optionsList[_key2] = arguments[_key2];
160
- }
161
- if (optionsList[optionsList.length - 1] === false) {
162
- return false;
163
- }
164
- return mergeOptions(optionsList, (merged, options) => Object.assign(merged, Object.assign({}, options, {
165
- payload: mergeApiPayloads(merged.payload, options.payload)
166
- })));
167
- }
168
- function mergeApiPayloads(base, overrides) {
169
- return Object.assign({}, base, overrides, mergeObjectValueIfPresent('_meta', base, overrides));
170
- }
171
- function mergeObjectValueIfPresent(key, base, overrides) {
172
- const baseValue = base && base[key];
173
- const overridesValue = overrides && overrides[key];
174
- const value = baseValue ? overridesValue ? Object.assign({}, baseValue, overridesValue) : baseValue : overridesValue;
175
- return value !== undefined ? {
176
- [key]: value
177
- } : {};
178
- }
179
- function mergeLayoutsOptions() {
180
- for (var _len2 = arguments.length, optionsList = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {
181
- optionsList[_key3] = arguments[_key3];
182
- }
183
- if (optionsList[optionsList.length - 1] === false) {
184
- return false;
185
- }
186
- return mergeOptions(optionsList, (merged, options) => {
187
- for (const [role, args] of Object.entries(options)) {
188
- merged[role] = mergeLayoutOptions(merged[role], args);
189
- }
190
- return merged;
191
- });
192
- }
193
- function mergeLayoutOptions(base, overrides) {
194
- overrides = normalizeLayoutOptions(overrides);
195
- if (overrides[0] === false) {
196
- return overrides;
197
- }
198
- return base && overrides ? [overrides[0] || base[0], mergeLayoutParameters(base[1], overrides[1])] : overrides || base;
199
- }
200
- function mergeLayoutParameters(base, overrides) {
201
- return Object.assign({}, base, overrides, {
202
- link: Object.assign({}, base && base.link, overrides && overrides.link),
203
- templates: Object.assign({}, base && base.templates, overrides && overrides.templates)
204
- });
205
- }
206
- function mergeDataProcessorOptions() {
207
- for (var _len3 = arguments.length, optionsList = new Array(_len3), _key4 = 0; _key4 < _len3; _key4++) {
208
- optionsList[_key4] = arguments[_key4];
209
- }
210
- return optionsList.flat().filter(Boolean);
211
- }
212
- function mergeTrackersOptions() {
213
- for (var _len4 = arguments.length, optionsList = new Array(_len4), _key5 = 0; _key5 < _len4; _key5++) {
214
- optionsList[_key5] = arguments[_key5];
215
- }
216
- if (optionsList[optionsList.length - 1] === false) {
217
- return false;
218
- }
219
- return mergeOptions(optionsList, (merged, options) => Object.assign(merged, Object.assign({}, options, {
220
- impression: mergeTrackerEventOptions(merged.impression, options.impression),
221
- viewable: mergeTrackerEventOptions(merged.viewable, options.viewable),
222
- click: mergeTrackerEventOptions(merged.click, options.click)
223
- })));
224
- }
225
- function mergeTrackerEventOptions() {
226
- let base = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
227
- let overrides = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
228
- return overrides === false || base === false ? overrides : Object.assign({}, base, overrides);
229
- }
230
- function mergeInteractionsOptions() {
231
- for (var _len5 = arguments.length, optionsList = new Array(_len5), _key6 = 0; _key6 < _len5; _key6++) {
232
- optionsList[_key6] = arguments[_key6];
233
- }
234
- if (optionsList[optionsList.length - 1] === false) {
235
- return false;
236
- }
237
- return mergeOptions(optionsList, (merged, options) => Object.assign(merged, Object.assign({}, options, {
238
- preprocess: concatArrays(merged.preprocess, options.preprocess)
239
- })));
240
- }
241
- function mergePaginationOptions() {
242
- for (var _len6 = arguments.length, optionsList = new Array(_len6), _key7 = 0; _key7 < _len6; _key7++) {
243
- optionsList[_key7] = arguments[_key7];
244
- }
245
- if (optionsList[optionsList.length - 1] === false) {
246
- return false;
247
- }
248
- return mergeOptions(optionsList, (merged, options) => Object.assign(merged, options));
249
- }
250
- function mergeAutocompleteOptions() {
251
- for (var _len7 = arguments.length, optionsList = new Array(_len7), _key8 = 0; _key8 < _len7; _key8++) {
252
- optionsList[_key8] = arguments[_key8];
253
- }
254
- return mergeOptions(optionsList, (merged, options) => Object.assign(merged, Object.assign({}, options, {
255
- api: mergeApiOptions(merged.api, options.api)
256
- })));
257
- }
258
- function mergeRolesOptions(base, overrides) {
259
- return Object.freeze(Object.assign({}, base, overrides, {
260
- members: mergeRolesMembers(base.members, overrides.members),
261
- mappings: Object.freeze(Object.assign({}, base.mappings, overrides.mappings))
262
- }));
263
- }
264
- function mergeRolesMembers() {
265
- let base = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
266
- let overrides = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
267
- return [...new Set([...base, ...overrides])];
268
- }
269
-
270
- // manifest //
271
- const FEATURES = [{
272
- key: 'api',
273
- normalize: normalizeApiOptions,
274
- merge: mergeApiOptions
275
- }, {
276
- key: 'layouts',
277
- normalize: normalizeLayoutsOptions,
278
- merge: mergeLayoutsOptions
279
- }, {
280
- key: 'dataProcessor',
281
- normalize: normalizeDataProcessorOptions,
282
- merge: mergeDataProcessorOptions
283
- }, {
284
- key: 'trackers',
285
- normalize: normalizeTrackerOptions,
286
- merge: mergeTrackersOptions
287
- }, {
288
- key: 'interactions',
289
- normalize: normalizeInteractionsOptions,
290
- merge: mergeInteractionsOptions
291
- }, {
292
- key: 'pagination',
293
- normalize: normalizePaginationOptions,
294
- merge: mergePaginationOptions
295
- }];
296
- class WorkflowContextOptions {
297
- constructor() {
298
- this._events = new _commons.EventEmitter({
299
- target: this
300
- });
301
- this._globals = {};
302
- }
303
- _notify(name) {
304
- this._events.emit(name, {
305
- name,
306
- value: this[name]
307
- });
308
- }
309
- }
310
- exports.WorkflowContextOptions = WorkflowContextOptions;
311
- class WorkflowOptions {
312
- constructor() {
313
- let context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
314
- let defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
315
- this._events = new _commons.EventEmitter({
316
- target: this
317
- });
318
- this._defaults = defaults; // TODO: we should call normalize() on defaults
319
- this._context = context || {};
320
- this._locals = {};
321
- (0, _commons.defineValues)(this, {
322
- resolved: new ResolvedWorkflowOptions(this),
323
- defaults
324
- });
325
- if (context && context.on) {
326
- this._unsubscribes = [context.on('*', event => this._notify(event.name))];
327
- }
328
- }
329
- _notify(name) {
330
- this._events.emit(name, {
331
- name,
332
- value: this.resolved[name]
333
- });
334
- }
335
- _destroy() {
336
- for (const unsubscribe of this._unsubscribes || []) {
337
- unsubscribe();
338
- }
339
- this._unsubscribes = [];
340
- }
341
- }
342
- exports.WorkflowOptions = WorkflowOptions;
343
- class WorkflowFeature {
344
- constructor(options, store, key, normalize, merge) {
345
- this._options = options;
346
- this._store = store;
347
- this._key = key;
348
- this._normalize = value => value !== undefined ? normalize(value) : undefined;
349
- this._merge = merge;
350
- }
351
- get() {
352
- return this._store[this._key];
353
- }
354
- set(value) {
355
- this._set(this._normalize(value));
356
- }
357
- merge(value) {
358
- this._set(this._merge(this.get(), this._normalize(value)));
359
- }
360
- _set(value) {
361
- this._store[this._key] = value;
362
- this._options._notify(this._key);
363
- }
364
- }
365
- class ResolvedWorkflowOptions {
366
- constructor(options) {
367
- this._options = options;
368
- }
369
- }
370
- for (const {
371
- key,
372
- normalize,
373
- merge
374
- } of FEATURES) {
375
- Object.defineProperty(WorkflowContextOptions.prototype, key, {
376
- get: function () {
377
- const _key = `_${key}`;
378
- return this[_key] || (this[_key] = new WorkflowFeature(this, this._globals, key, normalize, merge));
379
- }
380
- });
381
- Object.defineProperty(WorkflowOptions.prototype, key, {
382
- get: function () {
383
- const _key = `_${key}`;
384
- return this[_key] || (this[_key] = new WorkflowFeature(this, this._locals, key, normalize, merge));
385
- }
386
- });
387
- Object.defineProperty(ResolvedWorkflowOptions.prototype, key, {
388
- get: function () {
389
- const options = this._options;
390
- const contextFeature = options._context[key];
391
- return merge(options._defaults[key], contextFeature && contextFeature.get(), options._locals[key]);
392
- }
393
- });
394
- }
395
- const DEFAULT_FEATURES = ['api', 'layouts', 'dataProcessor', 'trackers', 'interactions'];
396
- function makeConfigurable(prototype) {
397
- let features = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_FEATURES;
398
- for (const feature of features) {
399
- injectConfigurableFeature(prototype, feature);
400
- }
401
- }
402
- function injectConfigurableFeature(prototype, feature) {
403
- if (feature === 'api') {
404
- Object.assign(prototype, {
405
- useApi() {
406
- for (var _len8 = arguments.length, args = new Array(_len8), _key9 = 0; _key9 < _len8; _key9++) {
407
- args[_key9] = arguments[_key9];
408
- }
409
- this._options.api.merge(args);
410
- return this;
411
- },
412
- clearApi() {
413
- this._options.api.set();
414
- return this;
415
- }
416
- });
417
- } else {
418
- const upperCased = upperCase(feature);
419
- Object.assign(prototype, {
420
- [`use${upperCased}`](value) {
421
- this._options[feature].merge(value);
422
- return this;
423
- },
424
- [`clear${upperCased}`]() {
425
- this._options[feature].set();
426
- return this;
427
- }
428
- });
429
- }
430
- }
431
-
432
- // helpers //
433
- function upperCase(str) {
434
- return str.charAt(0).toUpperCase() + str.slice(1);
435
- }
436
- function concatArrays(a0, a1) {
437
- return a0 && a0.length ? a1 && a1.length ? [...a0, ...a1] : a0 : a1;
438
- }
439
- function mergeOptions(optionsList, merge) {
440
- let merged = {};
441
- for (const options of optionsList) {
442
- if (!options) {
443
- continue;
444
- }
445
- merged = merge(merged, options);
446
- }
447
- return (0, _commons.trimObj)(merged);
448
- }