audit-resolve-core
Version:
Core modules for audit-resolve.json file and logic of its processing
79 lines (71 loc) • 2.18 kB
JavaScript
const debug = require('debug')('audit-resolve-core')
const argv = require('../arguments')
const Djv = require('djv')
const path = require('path')
const fs = require('fs')
const FILE = require('./FILE')
const { printV1MigrationNotes } = require('../views/main')
const versions = {
0: require('./versions/v0'),
1: require('./versions/v1')
}
function defaultFilePath (pathOverride) {
return pathOverride || path.resolve(argv.get().prefix || '.', FILE.FILENAME)
}
function resolutionFilePath (pathOverride) {
const filePath1 = defaultFilePath(pathOverride)
if (fs.existsSync(filePath1)) {
return filePath1
}
const filePath2 = path.resolve(argv.get().prefix || '.', FILE.FILENAME_DEPRECATED)
if (fs.existsSync(filePath2)) {
printV1MigrationNotes()
return filePath2
}
throw Error(`Could not find the resolutions file. Expected ${filePath1}`)
}
function validate (JSONSchema, data) {
const env = new Djv()
env.addSchema('resolve', JSONSchema)
const result = env.validate('resolve', data)
if (result) {
throw Error(`Invalid audit-resolve file. ${JSON.stringify(result, null, 2)}`)
}
}
function readAndValidate (pathOverride) {
const filePath = resolutionFilePath(pathOverride)
debug('loading from ', filePath)
const rawdata = fs.readFileSync(filePath)
const data = JSON.parse(rawdata)
let version = 0
if (data.version) {
version = +data.version
}
if (!versions[version]) {
throw Error(`Unrecognized ${FILE.FILENAME} content version ${version}`)
}
validate(versions[version].schema, data)
return data
}
function parseResolutionsData (data) {
const version = +data.version
return versions[version].extract(data)
}
module.exports = {
load (pathOverride) {
const data = readAndValidate(pathOverride)
return parseResolutionsData(data)
},
save ({ decisions, rules }, pathOverride) {
const wrappedData = {
decisions,
rules,
version: 1
}
validate(versions[1].schema, wrappedData)
fs.writeFileSync(defaultFilePath(pathOverride), JSON.stringify(wrappedData, null, 2))
},
validateResolveFile (pathOverride) {
return readAndValidate(pathOverride)
}
}