UNPKG

@qodalis/cli-core

Version:

Core Angular CLI for @qodalis extensions.

134 lines 20.3 kB
import { CliForegroundColor } from '../models'; export class ObjectDescriber { static describe(obj, options) { const { filter } = options || {}; const processors = []; const keys = Object.keys(obj); const functions = keys.filter((key) => typeof obj[key] === 'function'); for (const func of functions) { const funcValue = obj[func]; const args = this.getFunctionArguments(funcValue); if (filter) { const shouldInclude = filter({ funcName: func, func: funcValue, args, }); if (!shouldInclude) { continue; } } const supportsMultipleArgs = args.length > 1; const supportsDynamicArgs = this.supportsDynamicArgs(funcValue); if (args.length === 0 && !supportsDynamicArgs) { continue; } if (args.length > 0 && args.some((arg) => arg === 'function' || arg === 'func')) { continue; } const processor = { command: func, description: `A command that executes the function ${func} with the provided arguments`, allowUnlistedCommands: true, valueRequired: true, parameters: [ { name: 'debug', description: 'Debug', type: 'boolean', required: false, }, ], processCommand: async (command, context) => { const debug = command.args['debug']; if (debug) { context.writer.writeln('Executing command: ' + func); context.writer.writeln('Arguments: ' + JSON.stringify(command.args)); context.writer.writeln('Function: ' + funcValue.toString()); } const argsToCallF = []; if (supportsMultipleArgs) { for (const arg of args.slice(1)) { argsToCallF.push(command.args[arg]); } } if (supportsDynamicArgs) { const delimiter = command.args['delimiter'] || ','; argsToCallF.push(...command.value.split(delimiter)); } if (debug) { context.writer.writeln('Arguments after processing: ' + JSON.stringify(argsToCallF)); } const result = supportsDynamicArgs && args.length === 0 ? funcValue(...argsToCallF) : funcValue(command.value, ...argsToCallF); context.writer.write(context.writer.wrapInColor('Result: ', CliForegroundColor.Yellow)); if (result === null) { context.writer.writeln('null'); } else if (result === undefined) { context.writer.writeln('undefined'); } else if (typeof result === 'boolean') { context.writer.writeln(result.toString()); } else if (typeof result === 'number') { context.writer.writeln(result.toString()); } else if (Array.isArray(result)) { context.writer.writeJson(result); } else if (typeof result === 'string') { context.writer.writeln(result); } else if (typeof result === 'object') { context.writer.writeJson(result); } else { context.writer.writeln(result?.toString()); } context.process.output(result?.toString()); }, writeDescription: (context) => { context.writer.writeln(func); }, }; if (supportsDynamicArgs) { processor.parameters?.push({ name: 'delimiter', description: 'Delimiter', type: 'string', required: false, }); } if (supportsMultipleArgs) { processor.parameters?.push(...args.slice(1).map((arg) => ({ name: arg, description: arg, type: 'string', required: false, }))); } processors.push(processor); } return processors; } static supportsDynamicArgs(func) { const funcStr = func.toString(); return funcStr.includes('arguments'); } static getFunctionArguments(func) { const funcStr = func.toString(); const args = funcStr.match(/\(([^)]*)\)/); if (!args) { return []; } return args[1] .split(',') .map((arg) => arg.trim()) .filter((arg) => arg !== ''); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWRlc2NyaWJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi91dGlscy9vYmplY3QtZGVzY3JpYmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxrQkFBa0IsRUFBcUIsTUFBTSxXQUFXLENBQUM7QUFFbEUsTUFBTSxPQUFPLGVBQWU7SUFDeEIsTUFBTSxDQUFDLFFBQVEsQ0FDWCxHQUFRLEVBQ1IsT0FNQztRQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBRWpDLE1BQU0sVUFBVSxHQUEyQixFQUFFLENBQUM7UUFFOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQztRQUV2RSxLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsRUFBRTtZQUMxQixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRWxELElBQUksTUFBTSxFQUFFO2dCQUNSLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztvQkFDekIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsSUFBSTtpQkFDUCxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLGFBQWEsRUFBRTtvQkFDaEIsU0FBUztpQkFDWjthQUNKO1lBRUQsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUU3QyxNQUFNLG1CQUFtQixHQUFHLElB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LENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElDbGlDb21tYW5kUHJvY2Vzc29yLCBJQ2xpRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ2xpRm9yZWdyb3VuZENvbG9yLCBDbGlQcm9jZXNzQ29tbWFuZCB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3REZXNjcmliZXIge1xuICAgIHN0YXRpYyBkZXNjcmliZShcbiAgICAgICAgb2JqOiBhbnksXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBmaWx0ZXI/OiAobzoge1xuICAgICAgICAgICAgICAgIGZ1bmNOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgZnVuYzogYW55O1xuICAgICAgICAgICAgICAgIGFyZ3M6IHN0cmluZ1tdO1xuICAgICAgICAgICAgfSkgPT4gYm9vbGVhbjtcbiAgICAgICAgfSxcbiAgICApOiBJQ2xpQ29tbWFuZFByb2Nlc3NvcltdIHtcbiAgICAgICAgY29uc3QgeyBmaWx0ZXIgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgY29uc3QgcHJvY2Vzc29yczogSUNsaUNvbW1hbmRQcm9jZXNzb3JbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuXG4gICAgICAgIGNvbnN0IGZ1bmN0aW9ucyA9IGtleXMuZmlsdGVyKChrZXkpID0+IHR5cGVvZiBvYmpba2V5XSA9PT0gJ2Z1bmN0aW9uJyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBmdW5jIG9mIGZ1bmN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgZnVuY1ZhbHVlID0gb2JqW2Z1bmNdO1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuZ2V0RnVuY3Rpb25Bcmd1bWVudHMoZnVuY1ZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZEluY2x1ZGUgPSBmaWx0ZXIoe1xuICAgICAgICAgICAgICAgICAgICBmdW5jTmFtZTogZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgZnVuYzogZnVuY1ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFzaG91bGRJbmNsdWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3VwcG9ydHNNdWx0aXBsZUFyZ3MgPSBhcmdzLmxlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1cHBvcnRzRHluYW1pY0FyZ3MgPSB0aGlzLnN1cHBvcnRzRHluYW1pY0FyZ3MoZnVuY1ZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwICYmICFzdXBwb3J0c0R5bmFtaWNBcmdzKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICBhcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnZnVuY3Rpb24nIHx8IGFyZyA9PT0gJ2Z1bmMnKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NvcjogSUNsaUNvbW1hbmRQcm9jZXNzb3IgPSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogZnVuYyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYEEgY29tbWFuZCB0aGF0IGV4ZWN1dGVzIHRoZSBmdW5jdGlvbiAke2Z1bmN9IHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50c2AsXG4gICAgICAgICAgICAgICAgYWxsb3dVbmxpc3RlZENvbW1hbmRzOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGVidWcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdEZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlYnVnID0gY29tbWFuZC5hcmdzWydkZWJ1ZyddIGFzIGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCdFeGVjdXRpbmcgY29tbWFuZDogJyArIGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQXJndW1lbnRzOiAnICsgSlNPTi5zdHJpbmdpZnkoY29tbWFuZC5hcmdzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGdW5jdGlvbjogJyArIGZ1bmNWYWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3NUb0NhbGxGOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c011bHRpcGxlQXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncy5zbGljZSgxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NUb0NhbGxGLnB1c2goY29tbWFuZC5hcmdzW2FyZ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRzRHluYW1pY0FyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGltaXRlciA9IGNvbW1hbmQuYXJnc1snZGVsaW1pdGVyJ10gfHwgJywnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1RvQ2FsbEYucHVzaCguLi5jb21tYW5kLnZhbHVlIS5zcGxpdChkZWxpbWl0ZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQXJndW1lbnRzIGFmdGVyIHByb2Nlc3Npbmc6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShhcmdzVG9DYWxsRiksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzRHluYW1pY0FyZ3MgJiYgYXJncy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZ1bmNWYWx1ZSguLi5hcmdzVG9DYWxsRilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZ1bmNWYWx1ZShjb21tYW5kLnZhbHVlLCAuLi5hcmdzVG9DYWxsRik7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cmFwSW5Db2xvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmVzdWx0OiAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaUZvcmVncm91bmRDb2xvci5ZZWxsb3csXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oJ251bGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbigndW5kZWZpbmVkJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKHJlc3VsdC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihyZXN1bHQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZUpzb24ocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZUpzb24ocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4ocmVzdWx0Py50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2Vzcy5vdXRwdXQocmVzdWx0Py50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IChjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKGZ1bmMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoc3VwcG9ydHNEeW5hbWljQXJncykge1xuICAgICAgICAgICAgICAgIHByb2Nlc3Nvci5wYXJhbWV0ZXJzPy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RlbGltaXRlcicsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRGVsaW1pdGVyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN1cHBvcnRzTXVsdGlwbGVBcmdzKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc29yLnBhcmFtZXRlcnM/LnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC4uLmFyZ3Muc2xpY2UoMSkubWFwKChhcmcpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhcmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYXJnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcm9jZXNzb3JzLnB1c2gocHJvY2Vzc29yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9jZXNzb3JzO1xuICAgIH1cblxuICAgIHN0YXRpYyBzdXBwb3J0c0R5bmFtaWNBcmdzKGZ1bmM6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmdW5jU3RyID0gZnVuYy50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gZnVuY1N0ci5pbmNsdWRlcygnYXJndW1lbnRzJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEZ1bmN0aW9uQXJndW1lbnRzKGZ1bmM6IGFueSk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgZnVuY1N0ciA9IGZ1bmMudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGZ1bmNTdHIubWF0Y2goL1xcKChbXildKilcXCkvKTtcbiAgICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyZ3NbMV1cbiAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAubWFwKChhcmc6IHN0cmluZykgPT4gYXJnLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGFyZzogc3RyaW5nKSA9PiBhcmcgIT09ICcnKTtcbiAgICB9XG59XG4iXX0=