Files
datasheet-server/src/lib/blueprinters.js
2021-05-17 16:01:18 +12:00

72 lines
1.7 KiB
JavaScript

import path from 'path'
import fs from 'fs'
import R from 'ramda'
const defaultBlueprint = {
name: null,
sheet: {
name: null,
id: null
},
resources: {}
}
const defaultResource = {
data: []
}
function buildDesaturated (sheetId, sheetName, tab, resources) {
const bp = R.clone(defaultBlueprint)
bp.sheet.name = sheetName
bp.sheet.id = sheetId
bp.name = tab
bp.resources = resources.reduce((acc, r) => {
acc[r] = null
return acc
}, {})
return bp
}
const buildBlueprinter = R.curry((datafierName, datafier, sheetId, sheetName, tabName, data) => {
const bp = R.clone(defaultBlueprint)
bp.sheet = {
name: sheetName,
id: sheetId
}
bp.name = tabName
bp.resources[datafierName] = R.clone(defaultResource)
bp.resources[datafierName].data = datafier(data)
return bp
})
// import all default exports from 'blueprinters' folder
const allBps = {}
const REL_PATH_TO_BPS = '../blueprinters'
const normalizedPath = path.join(__dirname, REL_PATH_TO_BPS)
fs.readdirSync(normalizedPath).forEach(file => {
const bpName = file.replace('.js', '')
const datafier = require(`${REL_PATH_TO_BPS}/${file}`).default
allBps[bpName] = buildBlueprinter(bpName, datafier)
})
function transformerFromSchema (datafierName, schema) {
// TODO: enact schema
const datafier = data => data
return buildBlueprinter(datafierName, datafier)
}
function blueprinterWithSchema (name, blueprinter, schema) {
return transformerFromSchema(name, schema)
}
// NB: revert to ES5 'module.exports' required to make blueprinters from
// each file in blueprinters folder available for granular import from here.
module.exports = Object.assign({
defaultBlueprint,
defaultResource,
buildDesaturated,
blueprinterWithSchema
}, allBps)