@releai/default-groups
Version:
Default config groups parser
107 lines (92 loc) • 2.82 kB
JavaScript
const utils = require("./utils")
const converters = require("./converters")
const { declare } = require("@releai/helper-plugin-utils")
/**
* Destruct given groups into matching objects.
*
* @param {object} payload - Command payload.
* @param {object} metadata - Additional required resources.
* @returns {Array.<object>}
*/
const destructGroups = async (payload, metadata) => {
if (payload.yamlData) {
// destruct all operations and collect promises
const promises = payload.yamlData.map(async (doc) => {
switch (doc.type) {
case "Operation":
return await destructOperations(doc, metadata)
default:
return doc
}
})
// update paylaod yaml data
payload.yamlData = (await Promise.all(promises)).flat()
} else {
throw new Error("unable to destruct groups. missing payload config")
}
}
/**
* Destruct given operations into matching objects.
*
* @param {object} doc - Config document.
* @param {object} metadata - Additional required resources.
*/
const destructOperations = async (doc, metadata) => {
// get group
const group = (await converters(doc, metadata)).find(g => {
// check if all filters matches
const filterMatcher = g.filters.map(filter => {
return utils.checkFilter(filter)
})
// if not include false, there is a match
return !filterMatcher.includes(false)
})
// check if group exists
if (group) {
return group.ungroup
} else {
return doc
}
}
/**
* Group operation objects into a single config.
*
* @param {object} payload - Command payload.
*/
const groupOperations = async (payload, metadata) => {
const operationsAsMap = utils.configAsMapByKey(payload.operations)
// check if operations exists
if (payload.operations && payload.operations.length) {
// group all operations
const promises = payload.operations.map(async (doc) => {
// get group
const group = (await converters(doc, metadata)).find((g) => g.filters.reduce((filter => utils.checkFilter(filter))))
// check if group exists
if (group) {
// get all relevant operations by next_operation __rb_internal
const operationsToGroup = utils.getOperationsToGroup(doc, operationsAsMap)
// return grouped document
return group.group(operationsToGroup)
} else if (doc.key.startsWith("__rb_internal")) {
return null
} else {
return doc
}
})
// pudate the operations payload
payload.operations = (await Promise.all(promises)).flat().filter(elem => !!elem)
}
}
/**
* Export default plugin callback
*/
module.exports = declare((api) => {
// handler group destructuring on apply
api.apply.on("load", destructGroups)
// handler group destructuring on delete
api.delete.on("load", destructGroups)
// handler group structuing on list
api.operation.list.on("load", groupOperations)
// return api
return api
})