UNPKG

a2r

Version:
136 lines (135 loc) 6.44 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = __importDefault(require("path")); const execa_1 = __importDefault(require("execa")); const telemetry_1 = require("@a2r/telemetry"); const fs_1 = require("@a2r/fs"); const getProjectPath_1 = __importDefault(require("./getProjectPath")); const getCleanProjectName_1 = __importDefault(require("./getCleanProjectName")); const copyFilesFromTemplate_1 = __importDefault(require("./copyFilesFromTemplate")); const colors_1 = require("./colors"); const settings_1 = require("./settings"); const getLatestVersion_1 = __importDefault(require("./getLatestVersion")); const mergePackageJson_1 = __importDefault(require("./mergePackageJson")); const settings_2 = require("../settings"); /** * Adds component project to solution * @param project Project type * @param destination Destination folder */ const add = async (info) => { const { options } = info; const { type: project, dest: destination, base: baseProjectPath } = options; const templateFolder = settings_2.templatesFolders[project]; if (templateFolder) { if (!destination) { telemetry_1.out.warn(`Destination folder has not been provided, using ${project}`); } const projectPath = await (0, getProjectPath_1.default)(); const destFolder = destination || project; const destPath = path_1.default.resolve(projectPath, destFolder); let proceed = true; if (await (0, fs_1.exists)(destPath)) { telemetry_1.out.error(`Can't add project. Folder ${(0, colors_1.fullPath)(destPath)} already exists`); proceed = false; } const baseProject = path_1.default.resolve(projectPath, baseProjectPath || ''); if (proceed && project === 'electron') { if (!baseProjectPath) { telemetry_1.out.error('Electron projects needs a base project path (Next project)'); proceed = false; } if (proceed && !(await (0, fs_1.exists)(baseProject))) { telemetry_1.out.error(`Provided base project path (${(0, colors_1.fullPath)(baseProject)}) for Electron project doesn't exist`); proceed = false; } } if (proceed) { (0, colors_1.log)(`Adding ${project} project at ${(0, colors_1.fullPath)(destPath)}...`); await (0, copyFilesFromTemplate_1.default)(project, destPath); const cleanProjectName = await (0, getCleanProjectName_1.default)(projectPath); const packageJsonPath = path_1.default.resolve(destPath, 'package.json'); const packageJsonContent = await (0, fs_1.readFile)(packageJsonPath, 'utf8'); const packageJsonInfo = JSON.parse(packageJsonContent); packageJsonInfo.name = destFolder; if (project === 'electron') { packageJsonInfo.productName = destFolder; } await (0, fs_1.writeFile)(packageJsonPath, JSON.stringify(packageJsonInfo, null, 2)); if (project === 'electron') { await (0, mergePackageJson_1.default)(packageJsonPath, path_1.default.resolve(baseProject, 'package.json')); const tsConfigPath = path_1.default.resolve(destPath, 'renderer', 'tsconfig.json'); const tsConfigContent = await (0, fs_1.readFile)(tsConfigPath, 'utf8'); const tsConfigInfo = JSON.parse(tsConfigContent); tsConfigInfo.compilerOptions.rootDirs = [ './', `../../${baseProjectPath}`, ]; await (0, fs_1.writeFile)(tsConfigPath, JSON.stringify(tsConfigInfo, null, 2)); } (0, colors_1.log)(`Running ${(0, colors_1.terminalCommand)(`npm install`)}...`); await (0, execa_1.default)('npm', ['install'], { stdout: process.stdout, stderr: process.stderr, cwd: destPath, }); const latestVersion = await (0, getLatestVersion_1.default)(); (0, colors_1.log)(`Installing ${colors_1.framework} as a project dev dependency...`); await (0, execa_1.default)('npm', ['install', `a2r@${latestVersion}`, '--save-dev'], { stdout: process.stdout, stderr: process.stderr, cwd: destPath, }); const projectInfo = { type: project, path: destFolder, }; if (project === 'next') { projectInfo.dockerBase = settings_2.defaultDockerImage; projectInfo.dockerName = `${cleanProjectName}-${destFolder}`; projectInfo.dockerWorkingDir = settings_2.defaultDockerWorkDir; } if (project === 'electron') { projectInfo.baseProject = baseProjectPath; } await (0, settings_1.addProject)(projectInfo); (0, colors_1.log)(`Project created at ${(0, colors_1.fullPath)(destPath)}`); } } else { telemetry_1.out.error(`Unknown option: ${project}. Available options are ${Object.keys(settings_2.templatesFolders) .map((s) => `'${s}'`) .join(', ')}`); } }; const command = { run: add, name: 'add', description: `Creates project in solution ('next', 'expo' or 'electron') at desired destination folder`, args: [ { name: 'type', typeLabel: '{underline next}|{underline electron}', description: `Project type. Current available options are: 'next' and 'electron'. Support for 'expo' is coming soon`, type: String, required: true, }, { name: 'dest', typeLabel: '{underline folder name}', description: 'Project destination. Folder name where new project will be created at', type: String, required: true, }, { name: 'base', typeLabel: '{underline folder name}', description: 'Project base. Required for Electron project. Folder name containing Next.js project to use as base', type: String, } ], }; exports.default = command;