@vendure/cli
Version:
A modern, headless ecommerce framework
112 lines • 6.24 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.addUiExtensionsCommand = void 0;
exports.addUiExtensions = addUiExtensions;
const prompts_1 = require("@clack/prompts");
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const cli_command_1 = require("../../../shared/cli-command");
const package_json_ref_1 = require("../../../shared/package-json-ref");
const shared_prompts_1 = require("../../../shared/shared-prompts");
const vendure_config_ref_1 = require("../../../shared/vendure-config-ref");
const vendure_plugin_ref_1 = require("../../../shared/vendure-plugin-ref");
const ast_utils_1 = require("../../../utilities/ast-utils");
const add_ui_extension_static_prop_1 = require("./codemods/add-ui-extension-static-prop/add-ui-extension-static-prop");
const update_admin_ui_plugin_init_1 = require("./codemods/update-admin-ui-plugin-init/update-admin-ui-plugin-init");
exports.addUiExtensionsCommand = new cli_command_1.CliCommand({
id: 'add-ui-extensions',
category: 'Plugin: UI',
description: 'Set up Admin UI extensions',
run: options => addUiExtensions(options),
});
async function addUiExtensions(options) {
const providedVendurePlugin = options === null || options === void 0 ? void 0 : options.plugin;
const { project } = await (0, shared_prompts_1.analyzeProject)({ providedVendurePlugin, config: options === null || options === void 0 ? void 0 : options.config });
const isNonInteractive = (options === null || options === void 0 ? void 0 : options.isNonInteractive) === true;
let vendurePlugin = providedVendurePlugin;
if (!vendurePlugin && (options === null || options === void 0 ? void 0 : options.pluginName)) {
const pluginClasses = (0, ast_utils_1.getPluginClasses)(project);
const foundPlugin = pluginClasses.find(p => p.getName() === options.pluginName);
if (!foundPlugin) {
const availablePlugins = pluginClasses.map(p => p.getName()).filter(Boolean);
throw new Error(`Plugin "${options.pluginName}" not found. Available plugins:\n` +
availablePlugins.map(name => ` - ${name}`).join('\n'));
}
vendurePlugin = new vendure_plugin_ref_1.VendurePluginRef(foundPlugin);
}
if (isNonInteractive && !vendurePlugin) {
throw new Error('Plugin must be specified when running in non-interactive mode');
}
vendurePlugin = vendurePlugin !== null && vendurePlugin !== void 0 ? vendurePlugin : (await (0, shared_prompts_1.selectPlugin)(project, 'Add UI extensions cancelled'));
const packageJson = new package_json_ref_1.PackageJson(project);
if (vendurePlugin.hasUiExtensions()) {
(0, prompts_1.outro)('This plugin already has UI extensions configured');
return { project, modifiedSourceFiles: [] };
}
(0, add_ui_extension_static_prop_1.addUiExtensionStaticProp)(vendurePlugin);
prompts_1.log.success('Updated the plugin class');
const installSpinner = (0, prompts_1.spinner)();
const packageManager = packageJson.determinePackageManager();
const packageJsonFile = packageJson.locatePackageJsonWithVendureDependency();
prompts_1.log.info(`Detected package manager: ${packageManager}`);
if (!packageJsonFile) {
(0, prompts_1.cancel)(`Could not locate package.json file with a dependency on Vendure.`);
process.exit(1);
}
prompts_1.log.info(`Detected package.json: ${packageJsonFile}`);
installSpinner.start(`Installing dependencies using ${packageManager}...`);
try {
const version = packageJson.determineVendureVersion();
await packageJson.installPackages([
{
pkg: '@vendure/ui-devkit',
isDevDependency: true,
version,
},
{
pkg: '@types/react',
isDevDependency: true,
},
]);
}
catch (e) {
prompts_1.log.error(`Failed to install dependencies: ${e.message}.`);
}
installSpinner.stop('Dependencies installed');
const pluginDir = vendurePlugin.getPluginDir().getPath();
const providersFileDest = path_1.default.join(pluginDir, 'ui', 'providers.ts');
if (!fs_extra_1.default.existsSync(providersFileDest)) {
(0, ast_utils_1.createFile)(project, path_1.default.join(__dirname, 'templates/providers.template.ts'), providersFileDest);
}
const routesFileDest = path_1.default.join(pluginDir, 'ui', 'routes.ts');
if (!fs_extra_1.default.existsSync(routesFileDest)) {
(0, ast_utils_1.createFile)(project, path_1.default.join(__dirname, 'templates/routes.template.ts'), routesFileDest);
}
prompts_1.log.success('Created UI extension scaffold');
const vendureConfig = new vendure_config_ref_1.VendureConfigRef(project, options === null || options === void 0 ? void 0 : options.config);
if (!vendureConfig) {
prompts_1.log.warning(`Could not find the VendureConfig declaration in your project. You will need to manually set up the compileUiExtensions function.`);
}
else {
const pluginClassName = vendurePlugin.name;
const pluginPath = (0, ast_utils_1.getRelativeImportPath)({
to: vendurePlugin.classDeclaration.getSourceFile(),
from: vendureConfig.sourceFile,
});
const updated = (0, update_admin_ui_plugin_init_1.updateAdminUiPluginInit)(vendureConfig, { pluginClassName, pluginPath });
if (updated) {
prompts_1.log.success('Updated VendureConfig file');
}
else {
prompts_1.log.warning(`Could not update \`AdminUiPlugin.init()\` options.`);
(0, prompts_1.note)(`You will need to manually set up the compileUiExtensions function,\nadding ` +
`the \`${pluginClassName}.ui\` object to the \`extensions\` array.`, 'Info');
}
}
await project.save();
return { project, modifiedSourceFiles: [vendurePlugin.classDeclaration.getSourceFile()] };
}
//# sourceMappingURL=add-ui-extensions.js.map