Skip to content

Commit

Permalink
fix: ensure inline rules merged are collections (#237)
Browse files Browse the repository at this point in the history
  • Loading branch information
Kikobeats committed Nov 13, 2019
1 parent 4b71398 commit 7327236
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 53 deletions.
2 changes: 1 addition & 1 deletion packages/metascraper/src/get-data.js
@@ -1,8 +1,8 @@
'use strict'

const { isString, map, fromPairs } = require('lodash')
const { has } = require('@metascraper/helpers')
const mapValuesDeep = require('map-values-deep')
const { has } = require('@metascraper/helpers')
const xss = require('xss')

const truthyTest = () => true
Expand Down
3 changes: 1 addition & 2 deletions packages/metascraper/src/index.js
Expand Up @@ -3,8 +3,7 @@
const { isUrl } = require('@metascraper/helpers')
const whoops = require('whoops')

const mergeRules = require('./merge-rules')
const loadRules = require('./load-rules')
const { loadRules, mergeRules } = require('./rules')
const loadHTML = require('./load-html')
const getData = require('./get-data')

Expand Down
24 changes: 0 additions & 24 deletions packages/metascraper/src/load-rules.js

This file was deleted.

26 changes: 0 additions & 26 deletions packages/metascraper/src/merge-rules.js

This file was deleted.

54 changes: 54 additions & 0 deletions packages/metascraper/src/rules.js
@@ -0,0 +1,54 @@
'use strict'

const {
cloneDeep,
concat,
first,
findIndex,
forEach,
chain,
castArray,
has,
set
} = require('lodash')

const forEachRule = (collection, fn) => forEach(castArray(collection), fn)

const loadRules = rulesBundle =>
chain(rulesBundle)
.reduce((acc, { test, ...rules }) => {
forEach(rules, (innerRules, propName) => {
if (test) forEachRule(innerRules, rule => (rule.test = test))

set(
acc,
propName,
has(acc, propName)
? concat(acc[propName], innerRules)
: concat(innerRules)
)

return acc
})
return acc
}, {})
.toPairs()
.value()

const mergeRules = (rules, baseRules) =>
chain(rules)
.reduce((acc, { test, ...rules }) => {
forEach(rules, (innerRules, propName) => {
if (test) forEachRule(innerRules, rule => (rule.test = test))
// find the rules associated with `propName`
const index = findIndex(acc, item => first(item) === propName)
// if `propName` has more rule, add the new rule from the end
if (index !== -1) acc[index][1] = concat(innerRules, ...acc[index][1])
// otherwise, create an array of rules
else acc.push([propName, castArray(innerRules)])
})
return acc
}, cloneDeep(baseRules))
.value()

module.exports = { mergeRules, loadRules }

0 comments on commit 7327236

Please sign in to comment.