a2r
Version:
A2R Framework
136 lines (135 loc) • 6.44 kB
JavaScript
;
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;