aboutsummaryrefslogtreecommitdiff
path: root/src/services/theme_data
diff options
context:
space:
mode:
authorHenry Jameson <me@hjkos.com>2024-03-25 18:18:48 +0200
committerHenry Jameson <me@hjkos.com>2024-03-25 18:18:48 +0200
commitc1568ad2ba283336378e135ce329bb4c4c1b92f2 (patch)
tree5af36c87ae4b9120a5928ee27094bdeaf7ec837d /src/services/theme_data
parent1050fed5589c44105c3d22aba3350969deb06e5c (diff)
fix massive issue in getAllPossibleCombinations
Diffstat (limited to 'src/services/theme_data')
-rw-r--r--src/services/theme_data/iss_utils.js16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/services/theme_data/iss_utils.js b/src/services/theme_data/iss_utils.js
index 6568f576..2d9dd0b5 100644
--- a/src/services/theme_data/iss_utils.js
+++ b/src/services/theme_data/iss_utils.js
@@ -11,18 +11,28 @@ export const unroll = (item) => {
}
// This gives you an array of arrays of all possible unique (i.e. order-insensitive) combinations
+// Can only accept primitives. Duplicates are not supported and can cause unexpected behavior
export const getAllPossibleCombinations = (array) => {
const combos = [array.map(x => [x])]
for (let comboSize = 2; comboSize <= array.length; comboSize++) {
const previous = combos[combos.length - 1]
- const selfSet = new Set()
const newCombos = previous.map(self => {
+ const selfSet = new Set()
self.forEach(x => selfSet.add(x))
const nonSelf = array.filter(x => !selfSet.has(x))
return nonSelf.map(x => [...self, x])
})
const flatCombos = newCombos.reduce((acc, x) => [...acc, ...x], [])
- combos.push(flatCombos)
+ const uniqueComboStrings = new Set()
+ const uniqueCombos = flatCombos.map(x => x.toSorted()).filter(x => {
+ if (uniqueComboStrings.has(x.join())) {
+ return false
+ } else {
+ uniqueComboStrings.add(x.join())
+ return true
+ }
+ })
+ combos.push(uniqueCombos)
}
return combos.reduce((acc, x) => [...acc, ...x], [])
}
@@ -31,7 +41,7 @@ export const getAllPossibleCombinations = (array) => {
export const genericRuleToSelector = components => (rule, ignoreOutOfTreeSelector, isParent) => {
if (!rule && !isParent) return null
const component = components[rule.component]
- const { states, variants, selector, outOfTreeSelector } = component
+ const { states = {}, variants = {}, selector, outOfTreeSelector } = component
const applicableStates = ((rule.state || []).filter(x => x !== 'normal')).map(state => states[state])