UNPKG

@rnv/engine-core

Version:
248 lines 14.2 kB
"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