@rnv/engine-core
Version:
ReNative Engine Core
248 lines • 14.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var core_1 = require("@rnv/core");
var path_1 = tslib_1.__importDefault(require("path"));
var questionHelpers_1 = require("../questionHelpers");
var questionHelpers_2 = require("../questionHelpers");
var lodash_1 = require("lodash");
var getContext_1 = require("../../../getContext");
var mergeIntoProjectConfig = function (data, updateObj) {
var files = data.files;
files.project.renativeConfig = (0, lodash_1.merge)(files.project.renativeConfig, updateObj);
};
var mergeIntoProjectPackage = function (data, updateObj) {
var files = data.files;
files.project.packageJson = (0, lodash_1.merge)(files.project.packageJson, updateObj);
};
var Question = function (data) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var inputs, defaults, files, customTemplate, localTemplate, noTemplate, c, _a, templateVersion, projectTemplate, localTemplatePath, projectTemplates, projectTemplateKeys, options_1, defaultOverride_1, iRes, result, inputTemplateCustom, inputTemplateLocal, npmCacheDir, templateConfigPath, localTemplatePkgPath, pkg, nmTemplatePath_1, ignorePaths_1, copiedlocalTemplatePath, localPackageFilePath, localPackageFile, filePath, _b, nmDir, templateDir, renativeTemplateConfig, renativeConfig;
var _c, _d;
var _e;
return tslib_1.__generator(this, function (_f) {
switch (_f.label) {
case 0:
inputs = data.inputs, defaults = data.defaults, files = data.files;
customTemplate = { name: 'Custom Template (npm)...', value: { type: 'custom' } };
localTemplate = { name: 'Local Template...', value: { type: 'local' } };
noTemplate = { name: 'No Template (blank project)', value: { type: 'none' } };
c = (0, getContext_1.getContext)();
_a = c.program.opts(), templateVersion = _a.templateVersion, projectTemplate = _a.projectTemplate;
localTemplatePath = c.program.opts().localTemplatePath;
projectTemplates = c.buildConfig.projectTemplates || {};
projectTemplateKeys = Object.keys(projectTemplates);
inputs.template = {};
if (!(0, questionHelpers_1.checkInputValue)(projectTemplate)) return [3 /*break*/, 1];
inputs.template.packageName = projectTemplate;
return [3 /*break*/, 7];
case 1:
if (!!(0, questionHelpers_1.checkInputValue)(localTemplatePath)) return [3 /*break*/, 7];
options_1 = [];
projectTemplateKeys.forEach(function (k) {
var value = projectTemplates[k];
var option = {
name: "".concat(k, " ").concat((0, core_1.chalk)().grey("- ".concat(value.localPath || value.description))),
value: tslib_1.__assign(tslib_1.__assign({}, value), { type: 'existing', packageName: (value === null || value === void 0 ? void 0 : value.packageName) || k }),
};
options_1.push(option);
if (value.localPath) {
defaultOverride_1 = option.value;
}
});
options_1.push((0, core_1.inquirerSeparator)('Advanced:----------------'));
options_1.push(customTemplate);
options_1.push(localTemplate);
options_1.push(noTemplate);
return [4 /*yield*/, (0, core_1.inquirerPrompt)({
name: 'inputTemplate',
type: 'list',
message: 'What template to use?',
default: defaultOverride_1 || defaults.templateName,
loop: false,
choices: options_1,
})];
case 2:
iRes = _f.sent();
result = iRes.inputTemplate;
inputs.template.type = result.type;
if (!(result.type === 'custom')) return [3 /*break*/, 4];
return [4 /*yield*/, (0, core_1.inquirerPrompt)({
name: 'inputTemplateCustom',
type: 'input',
message: 'NPM package name:',
})];
case 3:
inputTemplateCustom = (_f.sent()).inputTemplateCustom;
inputs.template.packageName = inputTemplateCustom;
return [3 /*break*/, 7];
case 4:
if (!(result.type === 'local')) return [3 /*break*/, 6];
return [4 /*yield*/, (0, core_1.inquirerPrompt)({
name: 'inputTemplateLocal',
type: 'input',
message: 'Path (absolute):',
})];
case 5:
inputTemplateLocal = (_f.sent()).inputTemplateLocal;
localTemplatePath = inputTemplateLocal;
return [3 /*break*/, 7];
case 6:
if (result.type === 'none') {
// TODO: add support for no templates
return [2 /*return*/, Promise.reject('No templates NOT SUPPORTED YET')];
}
else if (result.type === 'existing') {
if (result.localPath) {
localTemplatePath = result.localPath;
}
else {
inputs.template.packageName = result.packageName;
}
}
_f.label = 7;
case 7:
npmCacheDir = path_1.default.join(c.paths.project.dir, core_1.RnvFolderName.dotRnv, core_1.RnvFolderName.npmCache);
if (!(0, questionHelpers_1.checkInputValue)(localTemplatePath)) return [3 /*break*/, 10];
if (!(0, core_1.fsExistsSync)(localTemplatePath)) {
return [2 /*return*/, Promise.reject("Local template path ".concat(localTemplatePath, " does not exist"))];
}
templateConfigPath = path_1.default.join(localTemplatePath, core_1.RnvFileName.renativeTemplate);
if (!(0, core_1.fsExistsSync)(templateConfigPath)) {
return [2 /*return*/, Promise.reject("Renative template config path ".concat(templateConfigPath, " does not exist. Are you sure the path provided is a correct template folder?"))];
}
localTemplatePkgPath = path_1.default.join(localTemplatePath, core_1.RnvFileName.package);
if (!(0, core_1.fsExistsSync)(localTemplatePath)) {
return [2 /*return*/, Promise.reject("Local template package ".concat(localTemplatePkgPath, " does not exist"))];
}
pkg = (0, core_1.readObjectSync)(localTemplatePkgPath);
(0, core_1.mkdirSync)(npmCacheDir);
if (!(pkg === null || pkg === void 0 ? void 0 : pkg.name)) {
return [2 /*return*/, Promise.reject("Invalid package ".concat(localTemplatePkgPath, " missing name field"))];
}
inputs.template.packageName = pkg.name;
inputs.template.version = pkg.version;
inputs.template.localPath = localTemplatePath;
projectTemplateKeys.find(function (tpl) {
var value = projectTemplates[tpl];
if (value.localPath === localTemplatePath && inputs.template) {
inputs.template.type = 'existing';
}
});
if (!inputs.template)
return [2 /*return*/];
nmTemplatePath_1 = path_1.default.join(npmCacheDir, pkg === null || pkg === void 0 ? void 0 : pkg.name);
(0, core_1.logInfo)("Found local template: ".concat(pkg.name, "@").concat(pkg.version));
(0, core_1.mkdirSync)(nmTemplatePath_1);
ignorePaths_1 = [
core_1.RnvFolderName.nodeModules,
'package-lock.json',
'yarn.lock',
core_1.RnvFolderName.platformBuilds,
'builds',
core_1.RnvFolderName.platformAssets,
core_1.RnvFolderName.secrets,
core_1.RnvFolderName.dotRnv,
];
(0, core_1.fsReaddirSync)(localTemplatePath).forEach(function (file) {
if (!ignorePaths_1.includes(file) && localTemplatePath) {
var sourcePath = path_1.default.join(localTemplatePath, file);
var destPath = path_1.default.join(nmTemplatePath_1, file);
if ((0, core_1.fsLstatSync)(sourcePath).isDirectory()) {
(0, core_1.copyFolderRecursiveSync)(sourcePath, nmTemplatePath_1);
}
else {
(0, core_1.copyFileSync)(sourcePath, destPath);
}
}
});
copiedlocalTemplatePath = "".concat(core_1.RnvFolderName.dotRnv, "/").concat(core_1.RnvFolderName.npmCache, "/").concat(inputs.template.packageName);
if (!(0, core_1.isYarnInstalled)()) {
localPackageFilePath = path_1.default.join("".concat(copiedlocalTemplatePath), 'package.json');
localPackageFile = (0, core_1.readObjectSync)(localPackageFilePath);
if (localPackageFile) {
delete localPackageFile.devDependencies;
(0, core_1.writeFileSync)(localPackageFilePath, localPackageFile);
}
}
filePath = "file:".concat(copiedlocalTemplatePath);
if (!inputs.template.packageName) {
return [2 /*return*/];
}
mergeIntoProjectPackage(data, {
devDependencies: (_c = {},
_c[(_e = inputs.template) === null || _e === void 0 ? void 0 : _e.packageName] = filePath,
_c),
});
mergeIntoProjectConfig(data, {
templateConfig: {
name: inputs.template.packageName,
version: filePath,
},
});
return [4 /*yield*/, (0, questionHelpers_2.saveProgressIntoProjectConfig)(data)];
case 8:
_f.sent();
return [4 /*yield*/, (0, core_1.executeAsync)("".concat((0, core_1.isYarnInstalled)() ? 'yarn' : 'npm install'), {
cwd: c.paths.project.dir,
})];
case 9:
_f.sent();
return [3 /*break*/, 17];
case 10:
if (!(0, questionHelpers_1.checkInputValue)(templateVersion)) return [3 /*break*/, 11];
inputs.template.version = templateVersion;
return [3 /*break*/, 14];
case 11:
if (!inputs.template.packageName) return [3 /*break*/, 13];
_b = inputs.template;
return [4 /*yield*/, (0, core_1.listAndSelectNpmVersion)(inputs.template.packageName)];
case 12:
_b.version = _f.sent();
return [3 /*break*/, 14];
case 13: return [2 /*return*/, Promise.reject('Template package name is required')];
case 14: return [4 /*yield*/, (0, core_1.executeAsync)("".concat((0, core_1.isYarnInstalled)() ? 'yarn' : 'npm', " add ").concat(inputs.template.packageName, "@").concat(inputs.template.version, " --dev"), {
cwd: c.paths.project.dir,
})];
case 15:
_f.sent();
if (inputs.template.packageName && inputs.template.version) {
// We update our in-memory package.json with the new template
mergeIntoProjectPackage(data, {
devDependencies: (_d = {},
_d[inputs.template.packageName] = inputs.template.version,
_d),
});
}
mergeIntoProjectConfig(data, {
templateConfig: {
name: inputs.template.packageName,
version: inputs.template.version,
},
});
return [4 /*yield*/, (0, questionHelpers_2.saveProgressIntoProjectConfig)(data)];
case 16:
_f.sent();
nmDir = path_1.default.join(c.paths.project.dir, 'node_modules');
if (!(0, core_1.fsExistsSync)(nmDir)) {
return [2 /*return*/, Promise.reject("".concat((0, core_1.isYarnInstalled)() ? 'yarn' : 'npm', " add ").concat(inputs.template.packageName, "@").concat(inputs.template.version, " : FAILED. this could happen if you have package.json accidentally created somewhere in parent directory"))];
}
_f.label = 17;
case 17:
if (!inputs.template.packageName) {
return [2 /*return*/];
}
templateDir = path_1.default.join(c.paths.project.dir, 'node_modules', inputs.template.packageName);
renativeTemplateConfig = (0, core_1.readObjectSync)(path_1.default.join(templateDir, core_1.RnvFileName.renativeTemplate)) || {};
if (renativeTemplateConfig) {
files.template.renativeTemplateConfig = renativeTemplateConfig;
}
renativeConfig = (0, core_1.readObjectSync)(path_1.default.join(templateDir, core_1.RnvFileName.renative));
if (renativeConfig) {
files.template.renativeConfig = renativeConfig;
}
return [2 /*return*/];
}
});
}); };
exports.default = Question;
//# sourceMappingURL=installTemplate.js.map