-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
110 lines (93 loc) · 2.74 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
const path = require('path')
const pify = require('pify')
const fs = pify(require('fs'))
const findit = require('findit')
const dotProp = require('dot-prop')
const VALUE_FILENAME_REGEX = /^([^/]+)\/(.*?)\.[^.]+$/
module.exports = { split, merge, embedValues }
function split (models, dir) {
dir = path.resolve(dir)
return Promise.all(
models.map((m) => {
const fname = toFilePath(dir, m.id)
return fs.writeFile(path.resolve(fname), prettify(m))
})
)
}
function embedValues (modelsDir, valuesDir) {
valuesDir = path.resolve(valuesDir)
const finder = findit(valuesDir)
const edits = {}
const promises = []
finder.on('file', (file) => {
const relativePath = file.slice(valuesDir.length + path.sep.length)
const parsed = parseValueFileName(relativePath)
if (!parsed) return
const { modelId, propPath } = parsed
const modelFile = path.join(modelsDir, `${modelId}.json`)
const model = edits[modelFile] || require(path.resolve(modelFile))
edits[modelFile] = model
const setValue = fs.readFile(file, { encoding: 'utf8' }).then((value) => {
dotProp.set(model, propPath, value)
})
promises.push(setValue)
})
return new Promise((resolve, reject) => {
finder.once('end', () => {
Promise.all(promises)
.then(() => {
return Object.keys(edits).map((file) => {
return fs.writeFile(file, prettify(edits[file]))
})
})
.then(resolve, reject)
})
})
}
function merge (modelsDir, outFilePath) {
if (typeof outFilePath === 'undefined') {
outFilePath = modelsDir
modelsDir = null
}
outFilePath = path.resolve(outFilePath)
modelsDir = path.resolve(modelsDir)
const outDir = path.dirname(outFilePath)
return fs.readdir(path.resolve(modelsDir)).then((files) => {
files = files.filter((file) => (/\.json$/).test(file))
const models = files.map(file => {
const model = require(path.join(modelsDir, file))
return {
id: model.id,
relPath: path.relative(outDir, path.join(modelsDir, file))
}
})
const contents = genModelsFile(models)
return fs.writeFile(outFilePath, contents)
})
}
function toFilePath (dir, id) {
return path.join(dir, `${id}.json`)
}
function parseValueFileName (file) {
const result = VALUE_FILENAME_REGEX.exec(file)
if (!result) return null
const [modelId, propPath] = result.slice(1)
return {
modelId,
propPath
}
}
function prettify (obj) {
return JSON.stringify(obj, null, 2)
}
function genModelsFile (models) {
const getters = models.map(
({ id, relPath }) => ` get '${id}' () { return require('./${relPath}') }`
)
return `/* eslint-disable brace-style */
const models = {
${getters.join(',\n')}
}
module.exports = models
`
}