sharec-schema
Version:
Utilities for configuration files merge
65 lines (52 loc) • 1.9 kB
JavaScript
// @ts-check
// TODO: move to parsers
const trim = require('lodash.trim')
const identity = require('lodash.identity')
const last = require('lodash.last')
const head = require('lodash.head')
/**
* @typedef {import('../').ParsedCommand} ParsedCommand
* @typedef {import('../').SchemaParams<string>} SchemaStringParams
* @typedef {import('../').SchemaParams<ParsedCommand>} SchemaCommandsParams
*/
/**
* Parse given object with raw cli-commands and returns parsed ones
* for next merge
* schema params
* @param {SchemaStringParams} params
* @returns {SchemaCommandsParams}
*/
function commandsToMap(params) {
return Object.keys(params).reduce((acc, key) => {
const parsedCommand = new Map()
if (!params[key]) {
return Object.assign(acc, {
[key]: undefined,
})
}
const splittedCommand = params[key].split(/([&|]{1,2}|;)/).map(trim)
for (let i = 0; i < splittedCommand.length; i++) {
const command = splittedCommand[i]
const splittedSubcommand = command.split(/([A-Z0-9_-]+=\S+)\s/).filter(identity)
const subcommandWithArgs = last(splittedSubcommand).split(' ')
const subcommand = head(subcommandWithArgs).trim()
const args = subcommandWithArgs.slice(1)
const env = splittedSubcommand.slice(0, splittedSubcommand.length - 1)
const parsedSubcommand = new Map([['separator', null]])
if (splittedCommand[i + 1]) {
parsedSubcommand.set('separator', splittedCommand[i + 1])
}
parsedSubcommand.set('env', env.map(trim))
parsedSubcommand.set('args', args.map(trim))
if (!parsedCommand.has(subcommand)) {
parsedCommand.set(subcommand, [])
}
parsedCommand.set(subcommand, parsedCommand.get(subcommand).concat(parsedSubcommand))
i++
}
return Object.assign(acc, {
[key]: parsedCommand,
})
}, {})
}
module.exports = commandsToMap