@hyext/builder-neorn
Version:
neo react-native builder for hyext
107 lines (106 loc) • 4.65 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());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_extra_1 = __importDefault(require("fs-extra"));
const ramda_1 = __importDefault(require("ramda"));
const path_1 = __importDefault(require("path"));
const child_process_1 = require("child_process");
const ora_1 = __importDefault(require("ora"));
const generateFiles_1 = __importDefault(require("./generateFiles"));
const utils_1 = require("../lib/utils");
const getProviderByHostId_1 = __importDefault(require("../infoProvider/getProviderByHostId"));
function installDep(projectRoot, dependencies) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
const installation = child_process_1.spawn('npm', [
'install',
'--save',
'--save-exact',
'--loglevel',
'--no-fund',
'error',
...Object.entries(dependencies).map(([k, v]) => `${k}@${v}`),
], {
cwd: projectRoot,
stdio: 'ignore',
shell: process.platform === 'win32',
});
installation.on('close', code => {
if (code === 0) {
resolve();
}
else {
reject();
}
});
});
});
}
function createProject(options) {
return __awaiter(this, void 0, void 0, function* () {
const { projectRoot, hostId } = options;
const buildTypes = options.buildTypes.filter(({ platform }) => platform.toLowerCase() === 'app');
const infoProvider = getProviderByHostId_1.default(hostId)({
projectRoot,
dependencies: {},
isDev: true
});
if (!buildTypes || buildTypes.length <= 0) {
utils_1.logger.error('请至少选择一个 app 类型的终端');
process.exit(1);
}
/*
* 当前阶段只装 latest 是不行的, 有些sdk只有beta才是62
* const dependencies = buildTypes.reduce((acc: any, cur) => {
* acc[cur.npmPackageName] = 'latest'
* return acc
* }, {})
*/
const dependencies = infoProvider.shouldInstallSDKVer;
// remove name from package.json
// if not metro will complain about duplicate package
const pkgAbsPath = path_1.default.resolve(projectRoot, 'package.json');
const pkgContent = fs_extra_1.default.readJsonSync(pkgAbsPath);
fs_extra_1.default.writeFileSync(pkgAbsPath, JSON.stringify(ramda_1.default.omit(['name'], pkgContent), null, 2));
utils_1.logger.info(`\n初始化项目目录 ${projectRoot}`);
// create .gitignore
const ignoreFilePath = path_1.default.resolve(projectRoot, '.gitignore');
if (!fs_extra_1.default.existsSync(ignoreFilePath)) {
fs_extra_1.default.writeFileSync(ignoreFilePath, 'node_modules');
}
// create project from template
generateFiles_1.default({ projectRoot, buildTypes });
const spinner = ora_1.default(`正在安装SDK: ${JSON.stringify(dependencies)}`).start();
try {
yield installDep(projectRoot, dependencies);
spinner.succeed('SDK 安装完毕.');
}
catch (err) {
spinner.fail('SDK 安装失败.');
throw err;
}
utils_1.logger.info(`\n初始化项目目录完成`);
return {
config: {
hostId,
host: 'localhost',
buildConfig: buildTypes.map(({ extType }) => ({
entry: `${extType}.js`,
extType,
})),
},
};
});
}
exports.default = createProject;