Skip to content

Commit 327fae4

Browse files
committed
Expose load and autoload methods
1 parent 3951637 commit 327fae4

File tree

5 files changed

+64
-54
lines changed

5 files changed

+64
-54
lines changed

packages/metascraper/src/index.js

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
'use strict'
22

33
const { isUrl } = require('@metascraper/helpers')
4-
const { isEmpty } = require('lodash')
4+
const { isEmpty, partial } = require('lodash')
55

6-
const loadRules = require('./load-rules')
6+
const {autoload: autoLoadRules, load: loadRules} = require('./load-rules')
77
const loadHTML = require('./load-html')
88
const getData = require('./get-data')
99

10-
module.exports = async ({ url, html } = {}) => {
11-
const rules = await loadRules()
10+
const create = loader => {
11+
return async ({url, html} = {}) => {
12+
const rules = await loader()
1213

13-
if (!isUrl(url)) throw new TypeError('You need to provide a valid url.')
14-
if (isEmpty(html)) {
15-
throw new TypeError('You need to provide a valid HTML markup.')
16-
}
14+
if (!isUrl(url)) throw new TypeError('You need to provide a valid url.')
15+
if (isEmpty(html)) {
16+
throw new TypeError('You need to provide a valid HTML markup.')
17+
}
1718

18-
const htmlDom = loadHTML(html)
19-
return getData({ rules, htmlDom, url })
19+
const htmlDom = loadHTML(html)
20+
return getData({ rules, htmlDom, url })
21+
}
2022
}
23+
24+
module.exports = create(autoLoadRules)
25+
module.exports.load = rules => create(partial(loadRules, rules))

packages/metascraper/src/load-rules.js

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ const config = require('cosmiconfig')('metascraper').load(cwd)
55
const resolveFrom = require('resolve-from')
66

77
const {
8+
map,
9+
memoize,
810
findIndex,
911
forEach,
1012
chain,
@@ -26,50 +28,53 @@ const DEFAULT_RULES = [
2628
'metascraper-url'
2729
]
2830

29-
let singletonConfig
31+
const load = rules =>
32+
// export an array interface, it's easier to iterate
33+
map(rules, obj => {
34+
const key = Object.keys(obj)[0]
35+
const value = obj[key]
36+
return [key, value]
37+
})
3038

31-
module.exports = () =>
32-
singletonConfig ||
33-
Promise.resolve(config).then(configFile => {
34-
const rules = get(configFile, 'config.rules', DEFAULT_RULES)
39+
const autoload = async () => {
40+
const configFile = await config
41+
const rules = get(configFile, 'config.rules', DEFAULT_RULES)
3542

36-
singletonConfig = chain(rules)
37-
.map(rule => {
38-
let moduleName
39-
let moduleConfig
43+
return chain(rules)
44+
.map(rule => {
45+
let moduleName
46+
let moduleConfig
4047

41-
if (isString(rule)) {
42-
moduleName = rule
43-
} else if (isArray(rule)) {
44-
moduleName = rule[0]
45-
moduleConfig = rule[1]
46-
} else if (isObject(rule)) {
47-
moduleName = Object.keys(rule)[0]
48-
moduleConfig = rule[moduleName]
49-
}
48+
if (isString(rule)) {
49+
moduleName = rule
50+
} else if (isArray(rule)) {
51+
moduleName = rule[0]
52+
moduleConfig = rule[1]
53+
} else if (isObject(rule)) {
54+
moduleName = Object.keys(rule)[0]
55+
moduleConfig = rule[moduleName]
56+
}
5057

51-
const modulePath = resolveFrom(cwd, moduleName)
52-
return require(modulePath)(moduleConfig)
53-
})
54-
// merge rules with same props
55-
.reduce((acc, rules) => {
56-
forEach(rules, function (rule, propName) {
57-
const index = findIndex(acc, item => item[propName])
58-
if (index !== -1) {
59-
acc[index][propName] = acc[index][propName].concat(rule)
60-
} else {
61-
acc.push({ [propName]: rule })
62-
}
63-
})
64-
return acc
65-
}, [])
66-
// export an array interface, it's easier to iterate
67-
.map(obj => {
68-
const key = Object.keys(obj)[0]
69-
const value = obj[key]
70-
return [key, value]
58+
const modulePath = resolveFrom(cwd, moduleName)
59+
return require(modulePath)(moduleConfig)
60+
})
61+
// merge rules with same props
62+
.reduce((acc, rules) => {
63+
forEach(rules, function (rule, propName) {
64+
const index = findIndex(acc, item => item[propName])
65+
if (index !== -1) {
66+
acc[index][propName] = acc[index][propName].concat(rule)
67+
} else {
68+
acc.push({ [propName]: rule })
69+
}
7170
})
72-
.value()
71+
return acc
72+
}, [])
73+
.thru(load)
74+
.value()
75+
}
7376

74-
return singletonConfig
75-
})
77+
module.exports = {
78+
autoload,
79+
load
80+
}

packages/metascraper/test/unit/load-rules/config/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const should = require('should')
55

66
let metascraper
77

8-
describe('load rules', () => {
8+
describe('automagically load rules', () => {
99
before(() => {
1010
clearModule.all()
1111
process.env.METASCRAPER_CWD = __dirname

packages/metascraper/test/unit/load-rules/pkg/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const should = require('should')
55

66
let metascraper
77

8-
describe('load rules', () => {
8+
describe('automagically load rules', () => {
99
before(() => {
1010
clearModule.all()
1111
process.env.METASCRAPER_CWD = __dirname

packages/metascraper/test/unit/load-rules/rc/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const should = require('should')
55

66
let metascraper
77

8-
describe('load rules', () => {
8+
describe('automagically load rules', () => {
99
before(() => {
1010
clearModule.all()
1111
process.env.METASCRAPER_CWD = __dirname

0 commit comments

Comments
 (0)