UNPKG

@vendure/cli

Version:

A modern, headless ecommerce framework

181 lines 7.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.analyzeProject = analyzeProject; exports.selectPlugin = selectPlugin; exports.selectEntity = selectEntity; exports.selectMultiplePluginClasses = selectMultiplePluginClasses; exports.selectServiceRef = selectServiceRef; exports.getServices = getServices; const prompts_1 = require("@clack/prompts"); const add_service_1 = require("../commands/add/service/add-service"); const constants_1 = require("../constants"); const ast_utils_1 = require("../utilities/ast-utils"); const utils_1 = require("../utilities/utils"); const service_ref_1 = require("./service-ref"); const vendure_plugin_ref_1 = require("./vendure-plugin-ref"); async function analyzeProject(options) { const providedVendurePlugin = options.providedVendurePlugin; let project = providedVendurePlugin === null || providedVendurePlugin === void 0 ? void 0 : providedVendurePlugin.classDeclaration.getProject(); let tsConfigPath; if (!providedVendurePlugin) { const projectSpinner = (0, prompts_1.spinner)(); const tsConfigFile = await (0, ast_utils_1.selectTsConfigFile)(); projectSpinner.start('Analyzing project...'); await (0, utils_1.pauseForPromptDisplay)(); const { project: _project, tsConfigPath: _tsConfigPath } = await (0, ast_utils_1.getTsMorphProject)({ compilerOptions: { rootDir: './src', }, }, tsConfigFile); project = _project; tsConfigPath = _tsConfigPath; projectSpinner.stop('Project analyzed'); } return { project: project, tsConfigPath, config: options.config }; } async function selectPlugin(project, cancelledMessage) { const pluginClasses = (0, ast_utils_1.getPluginClasses)(project); if (pluginClasses.length === 0) { (0, prompts_1.cancel)(constants_1.Messages.NoPluginsFound); process.exit(0); } const targetPlugin = await (0, utils_1.withInteractiveTimeout)(async () => { return await (0, prompts_1.select)({ message: 'To which plugin would you like to add the feature?', options: pluginClasses.map(c => ({ value: c, label: c.getName(), })), maxItems: 10, }); }); if ((0, prompts_1.isCancel)(targetPlugin)) { (0, prompts_1.cancel)(cancelledMessage); process.exit(0); } return new vendure_plugin_ref_1.VendurePluginRef(targetPlugin); } async function selectEntity(plugin) { const entities = plugin.getEntities(); if (entities.length === 0) { throw new Error(constants_1.Messages.NoEntitiesFound); } const targetEntity = await (0, utils_1.withInteractiveTimeout)(async () => { return await (0, prompts_1.select)({ message: 'Select an entity', options: entities .filter(e => !e.isTranslation()) .map(e => ({ value: e, label: e.name, })), maxItems: 10, }); }); if ((0, prompts_1.isCancel)(targetEntity)) { (0, prompts_1.cancel)('Cancelled'); process.exit(0); } return targetEntity; } async function selectMultiplePluginClasses(project, cancelledMessage) { const pluginClasses = (0, ast_utils_1.getPluginClasses)(project); if (pluginClasses.length === 0) { (0, prompts_1.cancel)(constants_1.Messages.NoPluginsFound); process.exit(0); } const selectAll = await (0, utils_1.withInteractiveTimeout)(async () => { return await (0, prompts_1.select)({ message: 'To which plugin would you like to add the feature?', options: [ { value: 'all', label: 'All plugins', }, { value: 'specific', label: 'Specific plugins (you will be prompted to select the plugins)', }, ], }); }); if ((0, prompts_1.isCancel)(selectAll)) { (0, prompts_1.cancel)(cancelledMessage); process.exit(0); } if (selectAll === 'all') { return pluginClasses.map(pc => new vendure_plugin_ref_1.VendurePluginRef(pc)); } const targetPlugins = await (0, utils_1.withInteractiveTimeout)(async () => { return await (0, prompts_1.multiselect)({ message: 'Select one or more plugins (use ↑, ↓, space to select)', options: pluginClasses.map(c => ({ value: c, label: c.getName(), })), }); }); if ((0, prompts_1.isCancel)(targetPlugins)) { (0, prompts_1.cancel)(cancelledMessage); process.exit(0); } return targetPlugins.map(pc => new vendure_plugin_ref_1.VendurePluginRef(pc)); } async function selectServiceRef(project, plugin, canCreateNew = true) { const serviceRefs = getServices(project).filter(sr => { return sr.classDeclaration .getSourceFile() .getDirectoryPath() .includes(plugin.getSourceFile().getDirectoryPath()); }); if (serviceRefs.length === 0 && !canCreateNew) { throw new Error(constants_1.Messages.NoServicesFound); } const result = await (0, utils_1.withInteractiveTimeout)(async () => { return await (0, prompts_1.select)({ message: 'Which service contains the business logic for this API extension?', maxItems: 8, options: [ ...(canCreateNew ? [ { value: 'new', label: `Create new generic service`, }, ] : []), ...serviceRefs.map(sr => { const features = sr.crudEntityRef ? `CRUD service for ${sr.crudEntityRef.name}` : `Generic service`; const label = `${sr.name}: (${features})`; return { value: sr, label, }; }), ], }); }); if ((0, prompts_1.isCancel)(result)) { (0, prompts_1.cancel)('Cancelled'); process.exit(0); } if (result === 'new') { return add_service_1.addServiceCommand.run({ type: 'basic', plugin }).then(r => r.serviceRef); } else { return result; } } function getServices(project) { const servicesSourceFiles = project.getSourceFiles().filter(sf => { return (sf.getDirectory().getPath().endsWith('/services') || sf.getDirectory().getPath().endsWith('/service')); }); return servicesSourceFiles .flatMap(sf => sf.getClasses()) .filter(classDeclaration => classDeclaration.getDecorator('Injectable')) .map(classDeclaration => new service_ref_1.ServiceRef(classDeclaration)); } //# sourceMappingURL=shared-prompts.js.map