@lenne.tech/cli
Version:
lenne.Tech CLI: lt
280 lines • 26.9 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = require("axios");
const fs = require("fs");
const glob = require("glob");
const gluegun_1 = require("gluegun");
const path = require("path");
const AddComponentCommand = {
description: 'Adds a specific component to another Nuxt project',
name: 'add',
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
const { parameters } = toolbox;
const componentName = parameters.first;
yield addComponent(toolbox, componentName);
process.exit();
return 'add';
}),
};
function getConfigForComponent(fileName, toolbox) {
return __awaiter(this, void 0, void 0, function* () {
const { print } = toolbox;
const configSpinner = print.spin('Checking the config for component...');
const data = yield getConfig();
const name = fileName.split('.').slice(0, -1).join('.');
const rootName = name.split('/')[0];
configSpinner.succeed(`Config for ${rootName} loaded successfully`);
return data.config[rootName] || {};
});
}
function getConfig() {
return __awaiter(this, void 0, void 0, function* () {
const githubApiUrl = 'https://raw.githubusercontent.com/lenneTech/nuxt-base-components/main/config.json';
const response = yield axios_1.default.get(githubApiUrl);
if (response.status === 200) {
return response.data;
}
else {
throw new Error(`Error when retrieving the configuration from GitHub: ${response.statusText}`);
}
});
}
function processConfig(config, toolbox) {
return __awaiter(this, void 0, void 0, function* () {
if (config === null || config === void 0 ? void 0 : config.npm) {
const npmPackages = config.npm;
for (const npmPackage of npmPackages) {
yield installPackage(npmPackage, toolbox);
}
}
if (config === null || config === void 0 ? void 0 : config.composables) {
const composables = config.composables;
for (const composable of composables) {
yield copyComposable(composable, toolbox);
}
}
if (config === null || config === void 0 ? void 0 : config.components) {
const components = config.components;
for (const component of components) {
if (component.endsWith('/*')) {
const folderName = component.split('/')[0];
const directoryFiles = yield getFileInfo(folderName);
for (const file of directoryFiles) {
yield copyComponent({ name: `${folderName}/${file.name}`, type: 'dir' }, toolbox);
}
}
else {
yield copyComponent({ name: `${component}.vue`, type: 'file' }, toolbox);
}
}
}
});
}
function installPackage(packageName, toolbox) {
return __awaiter(this, void 0, void 0, function* () {
const { print, prompt, system } = toolbox;
const nameWithoutVersion = packageName.split('@')[0] || packageName;
const packageJsonPath = path.resolve(process.cwd(), 'package.json');
const packageJson = gluegun_1.filesystem.read(packageJsonPath, 'json');
const isInstalled = (packageJson.dependencies && packageJson.dependencies[nameWithoutVersion])
|| (packageJson.devDependencies && packageJson.devDependencies[nameWithoutVersion]);
if (!isInstalled) {
const confirm = yield prompt.confirm(`The npm package ${nameWithoutVersion} is required. Would you like to install it?`);
if (!confirm) {
return;
}
const installSpinner = print.spin(`Install npm package ${nameWithoutVersion}...`);
yield system.run(`npm install ${packageName} --save-exact`);
installSpinner.succeed(`npm package ${nameWithoutVersion} successfully installed`);
}
else {
print.info(`npm package ${nameWithoutVersion} is already installed`);
}
});
}
function copyComposable(composable, toolbox) {
return __awaiter(this, void 0, void 0, function* () {
const { print, prompt } = toolbox;
const apiUrl = `https://raw.githubusercontent.com/lenneTech/nuxt-base-components/main/composables/${composable}.ts`;
const response = yield axios_1.default.get(apiUrl);
if (response.status === 200) {
const sourceCode = response.data;
const cwd = process.cwd();
let targetDirectory;
if (fs.existsSync(path.resolve(cwd, 'composables'))) {
targetDirectory = path.resolve(cwd, 'composables');
}
else {
const directories = glob.sync('*/composables', { cwd });
if (directories.length > 0) {
targetDirectory = path.join(cwd, directories[0]);
}
else {
targetDirectory = cwd;
}
}
// check composable already exists
if (fs.existsSync(path.join(targetDirectory, `${composable}.ts`))) {
print.info(`The composable ${composable} already exists`);
return;
}
const confirm = yield prompt.confirm(`The composable ${composable} is required. Would you like to add it?`);
if (!confirm) {
return;
}
const targetPath = path.join(targetDirectory, `${composable}.ts`);
const spinner = print.spin(`Copy the composable ${composable} to ${targetPath}...`);
fs.writeFileSync(targetPath, sourceCode);
spinner.succeed(`The composable ${composable} was successfully copied to ${targetPath}`);
}
else {
print.error(`Error retrieving the file from GitHub: ${response.statusText}`);
}
});
}
function getFileInfo(path) {
return __awaiter(this, void 0, void 0, function* () {
const githubApiUrl = `https://api.github.com/repos/lenneTech/nuxt-base-components/contents/components${path ? `/${path}` : ''}`;
const response = yield axios_1.default.get(githubApiUrl);
if (response.status === 200) {
return response.data.map((file) => {
return {
name: file.name,
type: file.type,
};
});
}
else {
throw new Error(`Error when retrieving the file list from GitHub: ${response.statusText}`);
}
});
}
function addComponent(toolbox, componentName) {
return __awaiter(this, void 0, void 0, function* () {
const { print, prompt } = toolbox;
try {
const compSpinner = print.spin('Load component selection from GitHub...');
const possibleComponents = yield getFileInfo();
compSpinner.succeed('Components selection successfully loaded from GitHub');
if (possibleComponents.length > 0) {
let selectedComponent = '';
if (!componentName) {
const response = yield prompt.ask({
choices: possibleComponents,
message: 'Which component would you like to add?',
name: 'componentType',
type: 'select',
});
selectedComponent = response.componentType;
}
else {
const foundComponent = possibleComponents.find(e => e.name.toLowerCase() === `${componentName.toLowerCase()}.vue` || e.name.toLowerCase() === componentName.toLowerCase());
selectedComponent = foundComponent.name;
}
const selectedFile = possibleComponents.find(e => e.name.toLowerCase() === selectedComponent.toLowerCase());
if ((selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.type) === 'dir') {
print.success(`The directory ${selectedFile.name} has been selected.`);
const directoryFiles = yield getFileInfo(selectedFile.name);
if (directoryFiles.length > 0) {
for (const file of directoryFiles) {
yield copyComponent({
name: `${selectedFile.name}/${file.name}`,
type: 'dir',
}, toolbox);
}
print.success(`All files from the directory ${selectedFile.name} have been successfully copied.`);
}
else {
print.error(`The directory ${selectedFile.name} is empty.`);
}
}
else if ((selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.type) === 'file') {
print.success(`The component ${selectedFile.name} was selected.`);
yield copyComponent(selectedFile, toolbox);
}
}
else {
print.error('No components found on GitHub.');
}
}
catch (error) {
print.error(`Error when adding/selecting the component: ${error.message}`);
}
});
}
function copyComponent(file, toolbox) {
return __awaiter(this, void 0, void 0, function* () {
const { print } = toolbox;
const apiUrl = `https://raw.githubusercontent.com/lenneTech/nuxt-base-components/main/components/${file.name}`;
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
try {
const config = yield getConfigForComponent(file.name, toolbox);
if (config) {
yield processConfig(config, toolbox);
}
const compSpinner = print.spin(`Load component ${file.name} from GitHub...`);
const response = yield axios_1.default.get(apiUrl);
compSpinner.succeed(`Component ${file.name} successfully loaded from GitHub`);
if (response.status === 200) {
const sourceCode = response.data;
const cwd = process.cwd();
let targetDirectory;
if (fs.existsSync(path.resolve(cwd, 'components'))) {
targetDirectory = path.resolve(cwd, 'components');
}
else {
const directories = glob.sync('*/components', { cwd });
if (directories.length > 0) {
targetDirectory = path.join(cwd, directories[0]);
}
else {
targetDirectory = cwd;
}
}
const targetPath = path.join(targetDirectory, `${file.name}`);
// check if component already exists
if (fs.existsSync(targetPath)) {
print.info(`The component ${file.name} already exists`);
resolve(targetPath);
return;
}
if (!fs.existsSync(targetDirectory)) {
const targetDirSpinner = print.spin('Creating the target directory...');
fs.mkdirSync(targetDirectory, { recursive: true });
targetDirSpinner.succeed();
}
if (file.type === 'dir' || file.name.split('/').length > 1) {
const dirName = file.name.split('/')[0];
const dirPath = path.join(targetDirectory, dirName);
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath, { recursive: true });
}
}
const spinner = print.spin(`Copy the component ${file.name} to ${targetPath}...`);
fs.writeFileSync(targetPath, sourceCode);
spinner.succeed(`The component ${file.name} was successfully copied to ${targetPath}`);
resolve(targetPath);
}
else {
print.error(`Error retrieving the file from GitHub: ${response.statusText}`);
reject(response.statusText);
}
}
catch (error) {
print.error(`Error when copying the component ${file.name}: ${error.message}`);
reject(error);
}
}));
});
}
exports.default = AddComponentCommand;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbXBvbmVudHMvYWRkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsaUNBQTBCO0FBQzFCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IscUNBQXFEO0FBQ3JELDZCQUE2QjtBQUk3QixNQUFNLG1CQUFtQixHQUFtQjtJQUMxQyxXQUFXLEVBQUUsbURBQW1EO0lBQ2hFLElBQUksRUFBRSxLQUFLO0lBQ1gsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDL0IsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUN2QyxNQUFNLFlBQVksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUE7Q0FDRixDQUFDO0FBRUYsU0FBZSxxQkFBcUIsQ0FBQyxRQUFnQixFQUFFLE9BQStCOztRQUNwRixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQzFCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUV6RSxNQUFNLElBQUksR0FBRyxNQUFNLFNBQVMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBDLGFBQWEsQ0FBQyxPQUFPLENB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