@miso.ai/client-sdk-ui 1.11.4-beta.1 → 1.11.4-beta.3
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.
- package/dist/cjs/actor/filters.js +57 -11
- package/dist/cjs/actor/tracker.js +1 -6
- package/dist/cjs/actor/view.js +6 -8
- package/dist/cjs/actor/views.js +10 -26
- package/dist/cjs/constants.js +12 -2
- package/dist/cjs/element/role/index.js +7 -0
- package/dist/cjs/element/role/miso-sort.js +20 -0
- package/dist/cjs/layout/affiliation/affiliation.js +1 -1
- package/dist/cjs/layout/container/container.js +2 -2
- package/dist/cjs/layout/index.js +7 -0
- package/dist/cjs/layout/input/facets.js +2 -2
- package/dist/cjs/layout/input/search-box.js +1 -1
- package/dist/cjs/layout/input/select.js +150 -0
- package/dist/cjs/layout/raf.js +2 -4
- package/dist/cjs/layout/trackable.js +3 -3
- package/dist/cjs/layout/triggerable.js +1 -1
- package/dist/cjs/util/trackers.js +2 -0
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/workflow/answer-based.js +2 -2
- package/dist/cjs/workflow/ask.js +4 -1
- package/dist/cjs/workflow/base.js +4 -4
- package/dist/cjs/workflow/context.js +3 -3
- package/dist/cjs/workflow/explore.js +2 -2
- package/dist/cjs/workflow/hybrid-search-answer.js +9 -7
- package/dist/cjs/workflow/hybrid-search-results.js +18 -16
- package/dist/cjs/workflow/hybrid-search-views.js +5 -12
- package/dist/cjs/workflow/hybrid-search.js +2 -2
- package/dist/cjs/workflow/options/api.js +56 -0
- package/dist/cjs/workflow/options/configurable.js +49 -0
- package/dist/cjs/workflow/options/data-processor.js +23 -0
- package/dist/cjs/workflow/options/filters.js +18 -0
- package/dist/cjs/workflow/options/index.js +115 -0
- package/dist/cjs/workflow/options/interactions.js +44 -0
- package/dist/cjs/workflow/options/layouts.js +83 -0
- package/dist/cjs/workflow/options/options.js +154 -0
- package/dist/cjs/workflow/options/pagination.js +28 -0
- package/dist/cjs/workflow/options/roles.js +17 -0
- package/dist/cjs/workflow/options/trackers.js +39 -0
- package/dist/cjs/workflow/options/utils.js +33 -0
- package/dist/cjs/workflow/processors.js +39 -33
- package/dist/cjs/workflow/recommendation.js +2 -2
- package/dist/cjs/workflow/search-based.js +59 -22
- package/package.json +2 -2
- package/src/actor/filters.js +53 -12
- package/src/actor/tracker.js +1 -6
- package/src/actor/view.js +7 -8
- package/src/actor/views.js +9 -30
- package/src/constants.js +11 -0
- package/src/element/role/index.js +1 -0
- package/src/element/role/miso-sort.js +16 -0
- package/src/layout/affiliation/affiliation.js +1 -1
- package/src/layout/container/container.js +2 -2
- package/src/layout/index.js +1 -0
- package/src/layout/input/facets.js +3 -2
- package/src/layout/input/search-box.js +1 -1
- package/src/layout/input/select.js +142 -0
- package/src/layout/raf.js +2 -2
- package/src/layout/trackable.js +3 -3
- package/src/layout/triggerable.js +1 -1
- package/src/util/trackers.js +2 -0
- package/src/version.js +1 -1
- package/src/workflow/answer-based.js +1 -1
- package/src/workflow/ask.js +4 -1
- package/src/workflow/base.js +1 -1
- package/src/workflow/context.js +1 -1
- package/src/workflow/explore.js +1 -1
- package/src/workflow/hybrid-search-answer.js +8 -3
- package/src/workflow/hybrid-search-results.js +21 -7
- package/src/workflow/hybrid-search-views.js +4 -12
- package/src/workflow/hybrid-search.js +3 -3
- package/src/workflow/options/api.js +46 -0
- package/src/workflow/options/configurable.js +48 -0
- package/src/workflow/options/data-processor.js +15 -0
- package/src/workflow/options/filters.js +10 -0
- package/src/workflow/options/index.js +10 -0
- package/src/workflow/options/interactions.js +36 -0
- package/src/workflow/options/layouts.js +73 -0
- package/src/workflow/options/options.js +169 -0
- package/src/workflow/options/pagination.js +18 -0
- package/src/workflow/options/roles.js +12 -0
- package/src/workflow/options/trackers.js +32 -0
- package/src/workflow/options/utils.js +26 -0
- package/src/workflow/processors.js +30 -34
- package/src/workflow/recommendation.js +1 -1
- package/src/workflow/search-based.js +58 -13
- package/dist/cjs/workflow/options.js +0 -448
- 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 {
|
|
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(),
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
154
|
-
payload =
|
|
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, [
|
|
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
|
-
}
|