diff --git a/src/node/api.mjs b/src/node/api.mjs index 1f85dc12..322716e4 100644 --- a/src/node/api.mjs +++ b/src/node/api.mjs @@ -11,7 +11,7 @@ import SyncDish from "./SyncDish"; import NodeRecipe from "./NodeRecipe"; import OperationConfig from "./config/OperationConfig.json"; -import { sanitise } from "./apiUtils"; +import { sanitise, removeSubheadingsFromArray, sentenceToCamelCase } from "./apiUtils"; import ExludedOperationError from "../core/errors/ExcludedOperationError"; @@ -58,12 +58,7 @@ function transformArgs(originalArgs, newArgs) { // See Strings op for example. const allArgs = Object.assign([], originalArgs).map((a) => { if (Array.isArray(a.value)) { - a.value = a.value.filter((v) => { - if (typeof v === "string") { - return !v.match(/^\[[\s\S]*\]$/); // Matches anything surrounded in [ ] - } - return true; - }); + a.value = removeSubheadingsFromArray(a.value); } return a; }); @@ -187,6 +182,23 @@ export function wrap(OpClass) { // used in chef.help wrapped.opName = OpClass.name; + + /** */ + const addArgs = (op) => { + const result = {}; + op.args.forEach((a) => { + if (a.type === "option") { + result[sentenceToCamelCase(a.name)] = removeSubheadingsFromArray(a.value); + } else if (a.type === "toggleString") { + result[sentenceToCamelCase(a.name)] = removeSubheadingsFromArray(a.toggleValues); + } + }); + + return result; + }; + + wrapped.args = addArgs(opInstance); + return wrapped; } diff --git a/src/node/apiUtils.mjs b/src/node/apiUtils.mjs index 87658ce4..b2d88c8b 100644 --- a/src/node/apiUtils.mjs +++ b/src/node/apiUtils.mjs @@ -6,24 +6,61 @@ * @license Apache-2.0 */ + +/** + * someName => Somename + * + * @param {String} str = string to be altered + * @returns {String} + */ +const capitalise = function capitalise(str) { + // Don't edit names that start with 2+ caps + if (/^[A-Z0-9]{2,}/g.test(str)) { + return str; + } + // reserved. Don't change for now. + if (str === "Return") { + return str; + } + + return `${str.charAt(0).toUpperCase()}${str.substr(1).toLowerCase()}`; +}; + + /** * SomeName => someName * @param {String} name - string to be altered * @returns {String} decapitalised */ -export function decapitalise(name) { - // Don't decapitalise names that start with 2+ caps - if (/^[A-Z0-9]{2,}/g.test(name)) { - return name; +export function decapitalise(str) { + // Don't decapitalise str that start with 2+ caps + if (/^[A-Z0-9]{2,}/g.test(str)) { + return str; } // reserved. Don't change for now. - if (name === "Return") { - return name; + if (str === "Return") { + return str; } - return `${name.charAt(0).toLowerCase()}${name.substr(1)}`; + return `${str.charAt(0).toLowerCase()}${str.substr(1)}`; } + +/** + * Remove strings surrounded with [] from the given array. +*/ +export function removeSubheadingsFromArray(array) { + if (Array.isArray(array)) { + return array.filter((i) => { + if (typeof i === "string") { + return !i.match(/^\[[\s\S]*\]$/); + } + return true; + }); + } +} + + /** * Remove spaces, make lower case. * @param str @@ -31,3 +68,22 @@ export function decapitalise(name) { export function sanitise(str) { return str.replace(/ /g, "").toLowerCase(); } + + +/** + * sonething like this => somethingLikeThis + * ABC a sentence => ABCASentence +*/ +export function sentenceToCamelCase(str) { + return str.split(" ") + .map((s, index) => { + if (index === 0) { + return decapitalise(s); + } + return capitalise(s); + }) + .reduce((prev, curr) => `${prev}${curr}`, ""); +} + + +