@whook/whook
Version:
Build strong and efficient REST web services.
99 lines (90 loc) • 2.68 kB
text/typescript
import { autoService } from 'knifecycle';
import os from 'node:os';
import { noop } from '../libs/utils.js';
import { type LogService } from 'common-services';
import { type WhookConfig } from '../services/BASE_URL.js';
import {
WHOOK_DEFAULT_PLUGINS,
WHOOK_PROJECT_PLUGIN_NAME,
type WhookPluginName,
} from '../services/WHOOK_RESOLVED_PLUGINS.js';
import {
type WhookCommandHandler,
type WhookCommandDefinition,
} from '../types/commands.js';
import { type WhookCommandsDefinitionsService } from '../services/COMMANDS_DEFINITIONS.js';
export const definition = {
name: 'ls',
description: 'Print available commands',
example: `whook ls`,
arguments: [
{
name: 'verbose',
description: 'Output extra information',
schema: {
type: 'boolean',
},
},
],
} as const satisfies WhookCommandDefinition;
async function initLsCommand({
CONFIG,
WHOOK_PLUGINS = WHOOK_DEFAULT_PLUGINS,
COMMANDS_DEFINITIONS,
log = noop,
EOL = os.EOL,
}: {
CONFIG: WhookConfig;
WHOOK_PLUGINS?: WhookPluginName[];
COMMANDS_DEFINITIONS: WhookCommandsDefinitionsService;
log?: LogService;
EOL?: typeof os.EOL;
}): Promise<WhookCommandHandler<{ verbose?: boolean }>> {
return async (args) => {
const {
namedArguments: { verbose },
} = args;
const pluginsDefinitions = await Promise.all(
WHOOK_PLUGINS.map(async (pluginName) => {
const plugin =
pluginName === WHOOK_PROJECT_PLUGIN_NAME
? CONFIG.name || 'project'
: pluginName;
const definitions = Object.keys(COMMANDS_DEFINITIONS)
.filter(
(name) => COMMANDS_DEFINITIONS[name].pluginName === pluginName,
)
.map((name) => {
const definition = COMMANDS_DEFINITIONS[name].module.definition;
return { name, definition };
});
if (!definitions.length) {
log('debug', `✅ - No commands folder for "${pluginName}".`);
}
return {
plugin,
commands: definitions,
};
}),
);
pluginsDefinitions.forEach(({ plugin, commands }) => {
log(
'info',
`${EOL}${EOL}# Provided by "${plugin}": ${
commands.length === 0 ? 'none' : `${commands.length} commands`
}${verbose ? EOL : ''}`,
);
commands.forEach(({ name, definition }) => {
log(
'info',
`- ${name}: ${definition.description}${
verbose && definition.example
? `${EOL}$ ${definition.example}${EOL}`
: ''
}`,
);
});
});
};
}
export default autoService(initLsCommand);