@darkpos/pricing 1.0.92 → 1.0.95
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/__TEST__/item.test.js +46 -48
- package/__TEST__/modifier/addItemModifier.test.js +181 -60
- package/__TEST__/modifier/overrideModifiers.test.js +196 -0
- package/__TEST__/order/conditionsNotMet.test.js +124 -0
- package/__TEST__/order/getParentTotals.test.js +79 -0
- package/__TEST__/order/order-payment-modifier.test.js +335 -28
- package/lib/item/calculate.js +76 -19
- package/lib/item/getItemPrice.js +1 -12
- package/lib/item/getPriceWithoutModifiers.js +7 -5
- package/lib/item/hasPaymentMethodType.js +7 -1
- package/lib/item/index.js +6 -0
- package/lib/item/isOverwrittenPrice.js +4 -0
- package/lib/item/isOverwrittenQuantity.js +4 -0
- package/lib/item/overrideNotes.js +24 -0
- package/lib/item/removeModifier.js +1 -22
- package/lib/item/removeModifiers.js +1 -2
- package/lib/modifier/areConditionsMet.js +4 -1
- package/lib/modifier/calculate.js +20 -2
- package/lib/modifier/calculatePaymentModifier.js +2 -0
- package/lib/modifier/createDescription.js +1 -1
- package/lib/modifier/duplicate.js +3 -0
- package/lib/modifier/getOverrideAmount.js +7 -0
- package/lib/modifier/getOverrideNote.js +5 -0
- package/lib/modifier/getServiceOverride.js +5 -0
- package/lib/modifier/hasPaymentMethodType.js +21 -6
- package/lib/modifier/index.js +20 -12
- package/lib/modifier/{isManual.js → isManualOverride.js} +1 -1
- package/lib/modifier/{isMultiplier.js → isMultiplierOverride.js} +1 -1
- package/lib/modifier/isNotesOverride.js +7 -0
- package/lib/modifier/isOverrideSubtotal.js +9 -0
- package/lib/modifier/isPaymentModifier.js +2 -1
- package/lib/modifier/isPercentage.js +1 -1
- package/lib/modifier/isPrepayModifier.js +11 -0
- package/lib/modifier/{isService.js → isServiceOverride.js} +1 -1
- package/lib/modifier/isTotalOverride.js +7 -0
- package/lib/modifier/sort.js +16 -27
- package/lib/order/addItem.js +10 -12
- package/lib/order/addItemModifier.js +15 -62
- package/lib/order/getTotals.js +21 -22
- package/lib/order/removeItemModifier.js +2 -27
- package/lib/order/splitItems.js +2 -1
- package/package.json +5 -2
- package/lib/modifier/createAmountOverrideModifier.js +0 -18
- package/lib/modifier/getService.js +0 -5
- package/lib/modifier/mutateModifier.js +0 -23
|
@@ -2,6 +2,7 @@ module.exports = ({ actions }) =>
|
|
|
2
2
|
function isPaymentModifier(modifier) {
|
|
3
3
|
return (
|
|
4
4
|
actions.isPaymentTypeModifier(modifier) ||
|
|
5
|
-
actions.isPaymentMethodModifier(modifier)
|
|
5
|
+
actions.isPaymentMethodModifier(modifier) ||
|
|
6
|
+
actions.isPrepayModifier(modifier)
|
|
6
7
|
);
|
|
7
8
|
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
module.exports = () =>
|
|
2
|
+
function isPrepayModifier(modifier) {
|
|
3
|
+
return !!(
|
|
4
|
+
modifier &&
|
|
5
|
+
modifier.conditions &&
|
|
6
|
+
Array.isArray(modifier.conditions.rules) &&
|
|
7
|
+
modifier.conditions.rules.some(
|
|
8
|
+
condition => condition.key === 'payment' && condition.value === 'prepay'
|
|
9
|
+
)
|
|
10
|
+
);
|
|
11
|
+
};
|
package/lib/modifier/sort.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
module.exports = ({ actions }) => {
|
|
3
3
|
function compareValues(key, order = 'asc') {
|
|
4
4
|
return function innerSort(a, b) {
|
|
5
|
-
// property doesn't exist on either object
|
|
6
5
|
const aVal = actions.getProperty(a, key);
|
|
7
6
|
const bVal = actions.getProperty(b, key);
|
|
8
7
|
|
|
@@ -13,38 +12,27 @@ module.exports = ({ actions }) => {
|
|
|
13
12
|
const bIsCalculatedPaymentModifier =
|
|
14
13
|
actions.isCalculatedPaymentModifier(b);
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
if (bIsCalculatedPaymentModifier && aIsPaymentModifier && bVal === null) {
|
|
20
|
-
return -1;
|
|
21
|
-
}
|
|
15
|
+
const aIsPercentageNoSort = actions.isPercentage(a) && aVal == null;
|
|
16
|
+
const bIsPercentageNoSort = actions.isPercentage(b) && bVal == null;
|
|
22
17
|
|
|
23
|
-
if (
|
|
24
|
-
(aIsPaymentModifier || aIsCalculatedPaymentModifier) &&
|
|
25
|
-
aVal === null
|
|
26
|
-
) {
|
|
18
|
+
if (bIsPaymentModifier && aIsPercentageNoSort && !bIsPercentageNoSort)
|
|
27
19
|
return 1;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (
|
|
31
|
-
(bIsPaymentModifier || bIsCalculatedPaymentModifier) &&
|
|
32
|
-
bVal === null
|
|
33
|
-
) {
|
|
34
|
-
return 1;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (aVal == null && bVal === null) {
|
|
38
|
-
return 0;
|
|
39
|
-
}
|
|
20
|
+
if (aIsPaymentModifier && !aIsPercentageNoSort && bIsPercentageNoSort)
|
|
21
|
+
return -1;
|
|
40
22
|
|
|
41
|
-
if (aVal
|
|
23
|
+
if (aIsCalculatedPaymentModifier && bIsPaymentModifier && aVal === null)
|
|
24
|
+
return -1;
|
|
25
|
+
if (bIsCalculatedPaymentModifier && aIsPaymentModifier && bVal === null)
|
|
42
26
|
return -1;
|
|
43
|
-
}
|
|
44
27
|
|
|
45
|
-
if (
|
|
28
|
+
if ((aIsPaymentModifier || aIsCalculatedPaymentModifier) && aVal === null)
|
|
29
|
+
return 1;
|
|
30
|
+
if ((bIsPaymentModifier || bIsCalculatedPaymentModifier) && bVal === null)
|
|
46
31
|
return 1;
|
|
47
|
-
|
|
32
|
+
|
|
33
|
+
if (aVal == null && bVal === null) return 0;
|
|
34
|
+
if (aVal == null) return -1;
|
|
35
|
+
if (bVal === null) return 1;
|
|
48
36
|
|
|
49
37
|
const varA = typeof aVal === 'string' ? aVal.toUpperCase() : aVal;
|
|
50
38
|
const varB = typeof bVal === 'string' ? bVal.toUpperCase() : bVal;
|
|
@@ -52,6 +40,7 @@ module.exports = ({ actions }) => {
|
|
|
52
40
|
let comparison = 0;
|
|
53
41
|
if (varA > varB) comparison = 1;
|
|
54
42
|
else if (varA < varB) comparison = -1;
|
|
43
|
+
|
|
55
44
|
return order === 'desc' ? comparison * -1 : comparison;
|
|
56
45
|
};
|
|
57
46
|
}
|
package/lib/order/addItem.js
CHANGED
|
@@ -218,18 +218,16 @@ module.exports = ({ actions, itemActions, modifierActions, settings, _ }) => {
|
|
|
218
218
|
);
|
|
219
219
|
|
|
220
220
|
if (modifiersToAdd.length) {
|
|
221
|
-
nextOrder = modifiersToAdd
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
nextOrder
|
|
232
|
-
);
|
|
221
|
+
nextOrder = modifiersToAdd.reduce(
|
|
222
|
+
(acc, modifier) =>
|
|
223
|
+
actions.addItemModifier({
|
|
224
|
+
itemIndex: nextItemIndex,
|
|
225
|
+
order: acc,
|
|
226
|
+
modifier,
|
|
227
|
+
originalItem: item,
|
|
228
|
+
}),
|
|
229
|
+
nextOrder
|
|
230
|
+
);
|
|
233
231
|
}
|
|
234
232
|
|
|
235
233
|
const { reArrangedOrder, newIndex } = reArrangeNewItem({
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
|
|
2
2
|
const { math } = utils;
|
|
3
|
-
const { getComputeModField } = require('../modifier/utils');
|
|
4
|
-
|
|
5
|
-
const getPrice = ({ item, modifier }) => {
|
|
6
|
-
const compute = getComputeModField(modifier);
|
|
7
|
-
const amount = (modifier && compute && compute.amount) || 0;
|
|
8
|
-
const { price = 0 } = item;
|
|
9
|
-
if (modifierActions.isMultiplier(modifier)) return math.mul(price, amount);
|
|
10
|
-
return amount;
|
|
11
|
-
};
|
|
12
3
|
|
|
13
4
|
const filterByRemoveModifiers = (modifiers, modifier) => {
|
|
14
5
|
const { delModifiers = [] } = modifier;
|
|
@@ -107,64 +98,31 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
|
|
|
107
98
|
}
|
|
108
99
|
|
|
109
100
|
const modifier = modifierActions.removeGroupRelations(_modifier); // to avoid no param reassign lint rule
|
|
110
|
-
|
|
111
|
-
const compute = getComputeModField(modifier);
|
|
101
|
+
const item = { ...itemProp };
|
|
112
102
|
const conditionsBag = areConditionsMet(item, modifier.conditions);
|
|
113
|
-
|
|
114
|
-
const isPriceOverride = modifierActions.isPriceOverride(modifier);
|
|
115
|
-
// is the modifier suggestion required
|
|
103
|
+
|
|
116
104
|
if (conditionsBag.length > 0 && !modifierActions.isRequired(modifier)) {
|
|
117
105
|
if (onConditionsNotMet) onConditionsNotMet(conditionsBag);
|
|
118
106
|
return item;
|
|
119
107
|
}
|
|
120
|
-
const modifierToAdd = modifierActions.
|
|
121
|
-
const modifierIndex = item.modifiers.findIndex(
|
|
122
|
-
ieach => ieach.modifierId === modifier._id
|
|
123
|
-
);
|
|
108
|
+
const modifierToAdd = modifierActions.duplicate(modifier);
|
|
124
109
|
|
|
125
|
-
|
|
126
|
-
if (modifierIndex > -1) item.modifiers[modifierIndex] = modifierToAdd;
|
|
127
|
-
else item.modifiers.push(modifierToAdd);
|
|
128
|
-
} else {
|
|
129
|
-
item.modifiers.push(modifierToAdd);
|
|
130
|
-
}
|
|
110
|
+
item.modifiers.push(modifierToAdd);
|
|
131
111
|
|
|
132
112
|
if (modifierActions.isRemoveModifier(modifier)) {
|
|
133
113
|
item.modifiers = filterByRemoveModifiers(item.modifiers, modifier);
|
|
134
114
|
}
|
|
135
115
|
|
|
136
|
-
|
|
137
|
-
item
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
item.quantity = modifier.compute.amount || 1;
|
|
146
|
-
} else if (typeof modifier.properties.override.fixedValue === 'number') {
|
|
147
|
-
item.quantity = modifier.properties.override.fixedValue;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
116
|
+
item.properties = {
|
|
117
|
+
...(item.properties || {}),
|
|
118
|
+
basePrice: item.price,
|
|
119
|
+
};
|
|
120
|
+
item.price = itemActions.getItemPrice({
|
|
121
|
+
item,
|
|
122
|
+
itemPriceLevels: originalItem ? originalItem.priceLevels : undefined,
|
|
123
|
+
customer,
|
|
124
|
+
});
|
|
150
125
|
|
|
151
|
-
if (isPriceOverride) {
|
|
152
|
-
item.properties = {
|
|
153
|
-
...(item.properties || {}),
|
|
154
|
-
basePrice: item.price,
|
|
155
|
-
};
|
|
156
|
-
item.price = getPrice({ modifier: modifierToAdd, item });
|
|
157
|
-
} else {
|
|
158
|
-
item.properties = {
|
|
159
|
-
...(item.properties || {}),
|
|
160
|
-
basePrice: item.price,
|
|
161
|
-
};
|
|
162
|
-
item.price = itemActions.getItemPrice({
|
|
163
|
-
item,
|
|
164
|
-
itemPriceLevels: originalItem ? originalItem.priceLevels : undefined,
|
|
165
|
-
customer,
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
126
|
return item;
|
|
169
127
|
};
|
|
170
128
|
|
|
@@ -204,7 +162,7 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
|
|
|
204
162
|
) {
|
|
205
163
|
return order;
|
|
206
164
|
}
|
|
207
|
-
// Remove if it has it already only if it is not group of value
|
|
165
|
+
// Remove if it has it already only if it is not group of value
|
|
208
166
|
|
|
209
167
|
const maxApplies = modifierActions.getMaxItemUse(modifier) || 0;
|
|
210
168
|
const isUnlimitedItemUse = modifierActions.isUnlimitedItemUse(modifier);
|
|
@@ -212,12 +170,7 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
|
|
|
212
170
|
const maxQuantity =
|
|
213
171
|
math.mul(item.quantity || 0, maxApplies) || item.quantity;
|
|
214
172
|
|
|
215
|
-
if (
|
|
216
|
-
!isUnlimitedItemUse &&
|
|
217
|
-
contains &&
|
|
218
|
-
usingCount >= maxQuantity &&
|
|
219
|
-
!modifierActions.isOverride(modifier)
|
|
220
|
-
) {
|
|
173
|
+
if (!isUnlimitedItemUse && contains && usingCount >= maxQuantity) {
|
|
221
174
|
if (maxApplies && onError) {
|
|
222
175
|
onError('modifier.has.reached.the.maximum.amount.of.applies');
|
|
223
176
|
return order;
|
package/lib/order/getTotals.js
CHANGED
|
@@ -1,29 +1,28 @@
|
|
|
1
1
|
module.exports = ({ utils }) => {
|
|
2
2
|
const { math } = utils;
|
|
3
|
+
|
|
3
4
|
return function getTotals(orders) {
|
|
4
|
-
if (!Array.isArray(orders))
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
acc.subTotals[key] || 0,
|
|
17
|
-
orderSubTotals[key]
|
|
18
|
-
);
|
|
5
|
+
if (!Array.isArray(orders)) {
|
|
6
|
+
return { total: 0, subTotal: 0, subTotals: {} };
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
return orders.reduce(
|
|
10
|
+
(acc, order) => {
|
|
11
|
+
const { subTotals: orderSubTotals, subTotal = 0, total = 0 } = order;
|
|
12
|
+
|
|
13
|
+
if (orderSubTotals) {
|
|
14
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
15
|
+
for (const [key, value] of Object.entries(orderSubTotals)) {
|
|
16
|
+
acc.subTotals[key] = math.add(acc.subTotals[key] || 0, value);
|
|
19
17
|
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
acc.total = math.add(acc.total, total);
|
|
21
|
+
acc.subTotal = math.add(acc.subTotal, subTotal);
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
},
|
|
26
|
-
{ total: 0, subTotals: {} }
|
|
27
|
-
);
|
|
23
|
+
return acc;
|
|
24
|
+
},
|
|
25
|
+
{ total: 0, subTotal: 0, subTotals: {} }
|
|
26
|
+
);
|
|
28
27
|
};
|
|
29
28
|
};
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
module.exports = ({ actions, modifierActions, itemActions,
|
|
2
|
-
const {
|
|
3
|
-
|
|
4
|
-
const getPrice = ({ item, modifier }) => {
|
|
5
|
-
const amount =
|
|
6
|
-
(modifier && modifier.compute && modifier.compute.amount) || 0;
|
|
7
|
-
const { price = 0 } = item;
|
|
8
|
-
if (modifierActions.isMultiplier(modifier)) return math.mul(price, amount);
|
|
9
|
-
return amount;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
const removeModifier = ({ item, modifier, originalItem }) => {
|
|
1
|
+
module.exports = ({ actions, modifierActions, itemActions, _ }) => {
|
|
2
|
+
const removeModifier = ({ item, modifier }) => {
|
|
13
3
|
const nextItem = { ...item, modifiers: [] };
|
|
14
4
|
|
|
15
5
|
nextItem.modifiers = item.modifiers.filter(each => {
|
|
@@ -19,17 +9,6 @@ module.exports = ({ actions, modifierActions, itemActions, utils, _ }) => {
|
|
|
19
9
|
return each._id !== modifier._id;
|
|
20
10
|
});
|
|
21
11
|
|
|
22
|
-
if (modifierActions.isAmountOverride(modifier))
|
|
23
|
-
return {
|
|
24
|
-
...originalItem,
|
|
25
|
-
...nextItem,
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
if (modifierActions.isPriceOverride(modifier))
|
|
29
|
-
nextItem.price = getPrice({ modifier, item: nextItem });
|
|
30
|
-
|
|
31
|
-
if (modifierActions.isQuantityOverride(modifier)) nextItem.quantity = 1;
|
|
32
|
-
|
|
33
12
|
return nextItem;
|
|
34
13
|
};
|
|
35
14
|
|
|
@@ -56,10 +35,6 @@ module.exports = ({ actions, modifierActions, itemActions, utils, _ }) => {
|
|
|
56
35
|
|
|
57
36
|
if (!contains) return order;
|
|
58
37
|
|
|
59
|
-
if (modifierActions.isRequiredAndOverride(modifier)) {
|
|
60
|
-
return order;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
38
|
// Remove
|
|
64
39
|
item = removeModifier({
|
|
65
40
|
item,
|
package/lib/order/splitItems.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module.exports = ({ actions, modifierActions, itemActions }) =>
|
|
1
|
+
module.exports = ({ actions, modifierActions, itemActions, utils }) =>
|
|
2
2
|
function splitItems({ order }) {
|
|
3
3
|
if (!order || !order.items) return order;
|
|
4
4
|
|
|
@@ -32,6 +32,7 @@ module.exports = ({ actions, modifierActions, itemActions }) =>
|
|
|
32
32
|
...item,
|
|
33
33
|
quantity: splitQty,
|
|
34
34
|
modifiers: [],
|
|
35
|
+
_id: utils.helpers.getObjectID(),
|
|
35
36
|
});
|
|
36
37
|
remaining -= splitQty;
|
|
37
38
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@darkpos/pricing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.95",
|
|
4
4
|
"description": "Pricing calculator",
|
|
5
5
|
"author": "Dark POS",
|
|
6
6
|
"license": "ISC",
|
|
@@ -27,6 +27,9 @@
|
|
|
27
27
|
"test:modifier": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/modifier.test.js",
|
|
28
28
|
"test:paymentModifiers": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/order/order-payment-modifier.test.js",
|
|
29
29
|
"test:addItem": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/order/addItem.test.js",
|
|
30
|
+
"test:getParentTotals": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/order/getParentTotals.test.js",
|
|
31
|
+
"test:overrideModifiers": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/modifier/overrideModifiers.test.js",
|
|
32
|
+
"test:addItemModifier": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/modifier/addItemModifier.test.js",
|
|
30
33
|
"lint": "eslint --quiet lib/"
|
|
31
34
|
},
|
|
32
35
|
"publishConfig": {
|
|
@@ -51,5 +54,5 @@
|
|
|
51
54
|
"supertest": "^6.2.3",
|
|
52
55
|
"supervisor": "^0.12.0"
|
|
53
56
|
},
|
|
54
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "edb497d37801c9749d2c3722a67657abe77c9ab6"
|
|
55
58
|
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
module.exports = ({ constants, actions }) => {
|
|
2
|
-
const { Modifier } = constants;
|
|
3
|
-
|
|
4
|
-
return function createAmountOverrideModifier(params) {
|
|
5
|
-
return actions.create({
|
|
6
|
-
compute: {
|
|
7
|
-
amount: params.amount,
|
|
8
|
-
action: Modifier.Compute.Actions.OVERRIDE,
|
|
9
|
-
},
|
|
10
|
-
properties: {
|
|
11
|
-
override: { field: 'amount' },
|
|
12
|
-
},
|
|
13
|
-
attributes: [Modifier.Attributes.OVERRIDE],
|
|
14
|
-
name: `Modifier Amount ${Modifier.Compute.Actions.OVERRIDE}`,
|
|
15
|
-
included: true,
|
|
16
|
-
});
|
|
17
|
-
};
|
|
18
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
module.exports = ({ _, actions }) =>
|
|
2
|
-
function mutateModifier(mod) {
|
|
3
|
-
const modifier = actions.duplicate(mod);
|
|
4
|
-
const fixedValue = _.get(modifier, 'properties.override.fixedValue', '');
|
|
5
|
-
const isAmountOverride = actions.isAmountOverride(mod);
|
|
6
|
-
const isPriceOverride = actions.isPriceOverride(mod);
|
|
7
|
-
|
|
8
|
-
if (isPriceOverride && fixedValue) {
|
|
9
|
-
modifier.compute = {
|
|
10
|
-
amount: fixedValue,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (isAmountOverride && fixedValue) {
|
|
15
|
-
modifier.compute = {
|
|
16
|
-
type: 'fixed',
|
|
17
|
-
amount: fixedValue,
|
|
18
|
-
action: 'add',
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return modifier;
|
|
23
|
-
};
|