@smarterlabs/norman
Version:
A static data layer for modern web applications
93 lines (86 loc) • 1.92 kB
JavaScript
const deepMerge = require(`deepmerge`)
const { basename, join } = require(`path`)
const findByUID = require(`./find-by-uid`)
module.exports = function add(label, data, options) {
if (!data) return
options = {
...this.options.defaults,
...this.options.collections[label],
...options,
}
// If we're overriding the path
let fileName = label
if (options.path) {
if (typeof options.path == `function`) {
fileName = options.path(data)
}
else {
fileName = options.path
}
}
let { files, fileOptions, assets } = this
fileOptions[fileName] = options
// List documents
if (options.type == `list`) {
if (!files[fileName]) {
files[fileName] = []
}
// Merge item in list
if (options.uid) {
if (!(`merge` in options) || options.merge == true) {
options.merge = `shallow`
}
let index = findByUID(files[fileName], data, options.uid)
if (index > -1) {
if (options.merge == `shallow`) {
let obj = files[fileName][index]
for (let i in data) {
obj[i] = data[i]
}
}
else if (options.merge == `deep`) {
files[fileName][index] = deepMerge(files[fileName][index], data)
}
else {
files[fileName].push(data)
}
}
else {
files[fileName].push(data)
}
}
// Append to list
else {
files[fileName].push(data)
}
}
// Singleton documents
else if (options.type == `singleton`) {
if (options.merge === `shallow`) {
files[fileName] = {
...files[fileName],
...data,
}
}
else if (options.merge === `deep`) {
files[fileName] = deepMerge(files[fileName], data)
}
else {
files[fileName] = data
}
}
// Assets
else if (options.type == `asset`) {
let filePath = fileName
if (typeof data == `string`) {
data = {
fileName: basename(data),
url: data,
}
}
if (data.fileName && data.url) {
assets[join(filePath, data.fileName)] = data.url
}
}
return this
}