@lenne.tech/cli
Version:
lenne.Tech CLI: lt
364 lines • 35.1 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 block to another Nuxt project',
name: 'add',
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
const { parameters } = toolbox;
const blockName = parameters.first;
yield addBlock(toolbox, blockName);
process.exit();
return 'add';
}),
};
function getConfigForBlock(fileName, toolbox) {
return __awaiter(this, void 0, void 0, function* () {
const { print } = toolbox;
const configSpinner = print.spin('Checking the config for block...');
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 getComponentsInfo(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 getComponentsInfo(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 getBlockInfo(path) {
return __awaiter(this, void 0, void 0, function* () {
const githubApiUrl = `https://api.github.com/repos/lenneTech/nuxt-base-components/contents/blocks${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 addBlock(toolbox, blockName) {
return __awaiter(this, void 0, void 0, function* () {
const { print, prompt } = toolbox;
try {
const compSpinner = print.spin('Load block selection from GitHub...');
const possibleBlocks = yield getBlockInfo();
compSpinner.succeed('Blocks selection successfully loaded from GitHub');
if (possibleBlocks.length > 0) {
let selectedBlock = '';
if (!blockName) {
const response = yield prompt.ask({
choices: possibleBlocks,
message: 'Which block would you like to add?',
name: 'blockType',
type: 'select',
});
selectedBlock = response.blockType;
}
else {
const foundComponent = possibleBlocks.find(e => e.name.toLowerCase() === `${blockName.toLowerCase()}.vue` || e.name.toLowerCase() === blockName.toLowerCase());
selectedBlock = foundComponent.name;
}
const selectedFile = possibleBlocks.find(e => e.name.toLowerCase() === selectedBlock.toLowerCase());
if ((selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.type) === 'dir') {
print.success(`The directory ${selectedFile.name} has been selected.`);
const directoryFiles = yield getBlockInfo(selectedFile.name);
if (directoryFiles.length > 0) {
for (const file of directoryFiles) {
yield copyBlock({
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 block ${selectedFile.name} was selected.`);
yield copyBlock(selectedFile, toolbox);
}
}
else {
print.error('No block found on GitHub.');
}
}
catch (error) {
print.error(`Error when adding/selecting the block: ${error.message}`);
}
});
}
function copyBlock(file, toolbox) {
return __awaiter(this, void 0, void 0, function* () {
const { print } = toolbox;
const apiUrl = `https://raw.githubusercontent.com/lenneTech/nuxt-base-components/main/blocks/${file.name}`;
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
try {
const config = yield getConfigForBlock(file.name, toolbox);
if (config) {
yield processConfig(config, toolbox);
}
const compSpinner = print.spin(`Load block ${file.name} from GitHub...`);
const response = yield axios_1.default.get(apiUrl);
compSpinner.succeed(`Block ${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, 'pages'))) {
targetDirectory = path.resolve(cwd, 'pages');
}
else {
const directories = glob.sync('*/pages', { cwd });
if (directories.length > 0) {
targetDirectory = path.join(cwd, directories[0]);
}
else {
targetDirectory = cwd;
}
}
const targetName = file.name.replace(/([a-z])([A-Z])/g, '$1-$2')
.toLowerCase()
.replace(/^block-/, '');
const targetPath = path.join(targetDirectory, `${targetName}`);
// check if block already exists
if (fs.existsSync(targetPath)) {
print.info(`The block ${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') {
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 block ${targetName} to ${targetPath}...`);
fs.writeFileSync(targetPath, sourceCode);
spinner.succeed(`The block ${targetName} 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 block ${file.name}: ${error.message}`);
reject(error);
}
}));
});
}
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 getConfigForBlock(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}`);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2Jsb2Nrcy9hZGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxpQ0FBMEI7QUFDMUIseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QixxQ0FBcUQ7QUFDckQsNkJBQTZCO0FBSTdCLE1BQU0sbUJBQW1CLEdBQW1CO0lBQzFDLFdBQVcsRUFBRSwrQ0FBK0M7SUFDNUQsSUFBSSxFQUFFLEtBQUs7SUFDWCxHQUFHLEVBQUUsQ0FBTyxPQUErQixFQUFFLEVBQUU7UUFDN0MsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUMvQixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ25DLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNuQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQTtDQUNGLENBQUM7QUFFRixTQUFlLGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsT0FBK0I7O1FBQ2hGLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDMUIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBRXJFLE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxj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