@hyext/builder-neorn
Version:
neo react-native builder for hyext
207 lines (206 loc) • 8.39 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.huyaextProviderFactory = exports.getShouldInstallSDKVersions = void 0;
const ramda_1 = __importDefault(require("ramda"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const utils_1 = require("../lib/utils");
const baseProvider_1 = require("./baseProvider");
const DEPRECATED_AUDIENCE_SDK = 'hyext-rn-sdk';
const DEPRECATED_STREAMER_SDK = 'hyliveext-rn-sdk';
const AUDIENCE_SDK = '@hyext/hyext-rn-sdk';
const STREAMER_SDK = '@hyext/hyliveext-rn-sdk';
const modernSDKInfos = {
'0.62.2': {
min: {
// [AUDIENCE_SDK]: '1.13.1-beta.4',
// [STREAMER_SDK]: '1.13.0-beta',
[AUDIENCE_SDK]: '2.0.0',
[STREAMER_SDK]: '2.0.0',
},
},
'0.58.5': {
max: {
[AUDIENCE_SDK]: '1.13.0',
[STREAMER_SDK]: '1.14.0',
},
},
};
const deprecatedSDKInfos = {
'0.62.2': {
min: {
[DEPRECATED_AUDIENCE_SDK]: '2.0.0',
[DEPRECATED_STREAMER_SDK]: '2.0.0',
},
},
'0.58.5': {
max: {
[DEPRECATED_AUDIENCE_SDK]: '1.9.6',
[DEPRECATED_STREAMER_SDK]: '1.10.0',
},
},
};
const getSDKRoleFromExtType = (extType) => {
if (extType.startsWith('app_')) {
return 'audience';
}
if (extType.startsWith('zs_')) {
return 'streamer';
}
throw new Error(`unknown extType: ${extType}, can't extract userRole from it`);
};
const getPkgSDKVersions = (dependencies) => {
const SDKVersion = ramda_1.default.pick([
AUDIENCE_SDK,
STREAMER_SDK,
], dependencies);
const deprecatedSDKVersion = ramda_1.default.pick([
DEPRECATED_STREAMER_SDK,
DEPRECATED_AUDIENCE_SDK,
], dependencies);
// 同时存在两种sdk, 直接报错
if (Object.keys(SDKVersion).length > 0 && Object.keys(deprecatedSDKVersion).length > 0) {
throw new Error(`请安装正确的SDK名称: ${AUDIENCE_SDK}, ${STREAMER_SDK}`);
}
if (Object.keys(SDKVersion).length > 0) {
return SDKVersion;
}
if (Object.keys(deprecatedSDKVersion).length > 0) {
return deprecatedSDKVersion;
}
// 什么也没装, 返回一个默认的版本
return modernSDKInfos['0.62.2'].min;
};
const updatePkgVersion = (newVer, origin) => {
// 如果开发者声明了老的非@hyext的依赖, 直接用新版的代替
if (ramda_1.default.intersection(Object.keys(origin), [DEPRECATED_AUDIENCE_SDK, DEPRECATED_STREAMER_SDK]).length > 0) {
return newVer;
}
// const filtedNewVer = R.pick(Object.keys(pkgVersion), newVer)
return ramda_1.default.mergeLeft(newVer, origin || {});
};
const getBaseModulesPath = (projectRoot, dependencies, RNVersion, extType) => {
const SDKName = getSDKNameByExtType(dependencies, RNVersion, extType);
const baseModulesPath = require.resolve(`${SDKName}/baseModules`, { paths: [projectRoot] });
return baseModulesPath;
};
const getBaseModules = (projectRoot, dependencies, RNVersion, extType) => {
const baseModulesPath = getBaseModulesPath(projectRoot, dependencies, RNVersion, extType);
if (fs_extra_1.default.existsSync(baseModulesPath)) {
return new Set(fs_extra_1.default.readFileSync(baseModulesPath)
.toString()
.split('\n'));
}
return new Set();
};
const getSDKNameByExtType = (dependencies, RNVersion, extType) => {
const shouldInstallSDKVer = exports.getShouldInstallSDKVersions(dependencies, RNVersion);
const userType = utils_1.getUserTypeFromExtType(extType);
switch (userType) {
case 'audience':
return shouldInstallSDKVer[AUDIENCE_SDK] ? AUDIENCE_SDK : DEPRECATED_AUDIENCE_SDK;
case 'streamer':
return shouldInstallSDKVer[STREAMER_SDK] ? STREAMER_SDK : DEPRECATED_STREAMER_SDK;
default:
throw new Error(`未知类型: ${extType}`);
}
};
const isDepreacted = (dependencies) => {
const keys = Object.keys(dependencies);
return keys.includes(DEPRECATED_AUDIENCE_SDK) || keys.includes(DEPRECATED_STREAMER_SDK);
};
exports.getShouldInstallSDKVersions = (dependencies, RNVersion, isDev = true) => {
const pkgSDKVersions = getPkgSDKVersions(dependencies);
if (!utils_1.isExactlyVersions(pkgSDKVersions)) {
utils_1.logger.error(`SDK 依赖请写精确版本号: ${JSON.stringify(pkgSDKVersions)}`);
process.exit(1);
}
const SDKInfos = isDepreacted(pkgSDKVersions) ? deprecatedSDKInfos : modernSDKInfos;
switch (RNVersion) {
case '0.58.5':
return utils_1.isLE(pkgSDKVersions, SDKInfos['0.58.5'].max)
? pkgSDKVersions
: updatePkgVersion(SDKInfos['0.58.5'].max, pkgSDKVersions);
default:
return utils_1.isGE(pkgSDKVersions, SDKInfos['0.62.2'].min)
? pkgSDKVersions
: updatePkgVersion(SDKInfos['0.62.2'].min, pkgSDKVersions);
}
};
const getSDKVerByExtType = (dependencies, RNVersion, extType) => {
const shouldInstallSDKVer = exports.getShouldInstallSDKVersions(dependencies, RNVersion);
const userType = utils_1.getUserTypeFromExtType(extType);
// FIXME app 上线后不再 hardcode 版本号
/*
* if (RNVersion === '0.62.2') {
* return '0.0.622'
* }
*/
switch (userType) {
case 'audience':
return shouldInstallSDKVer[AUDIENCE_SDK] || shouldInstallSDKVer[DEPRECATED_AUDIENCE_SDK];
case 'streamer':
return shouldInstallSDKVer[STREAMER_SDK] || shouldInstallSDKVer[DEPRECATED_STREAMER_SDK];
default:
return '1.9.9';
// throw new Error('未知类型')
}
};
const validateSDKVersion = (dependencies, RNVersion, isDev) => {
const pkgSDKVersions = getPkgSDKVersions(dependencies);
if (!utils_1.isExactlyVersions(pkgSDKVersions)) {
utils_1.logger.error(`SDK 依赖请写精确版本号: ${JSON.stringify(pkgSDKVersions)}`);
process.exit(1);
/*
* return {
* isValid: false,
* message: `SDK 依赖请写精确版本号: ${JSON.stringify(pkgSDKVersions)}`,
* }
*/
}
const shouldInstallSDKVer = exports.getShouldInstallSDKVersions(dependencies, RNVersion);
if (!ramda_1.default.equals(shouldInstallSDKVer, pkgSDKVersions)) {
return {
isValid: !isDev,
message: `项目所声明的SDK依赖不满足RN版本: ${RNVersion}. \n请安装版本: ${JSON.stringify(shouldInstallSDKVer)}`,
};
}
return {
isValid: true,
};
};
exports.huyaextProviderFactory = (options) => {
const { projectRoot, buildConfig, dependencies = {}, RNVersion = '0.62.2', isDev = true } = options;
const baseProvider = baseProvider_1.baseProviderFactory(options);
return {
hostId: 'huyaext',
isBuildConfigValid: true,
SDKVersionValidation: validateSDKVersion(dependencies, RNVersion, isDev),
SDKAlias: {
'open-sdk': [
DEPRECATED_AUDIENCE_SDK,
DEPRECATED_STREAMER_SDK,
AUDIENCE_SDK,
STREAMER_SDK,
]
},
shouldInstallSDKVer: exports.getShouldInstallSDKVersions(dependencies, RNVersion),
projectConfig: ramda_1.default.merge({
ignore: [
...baseProvider.projectConfig.ignore,
'node_modules/hyext-rn-sdk/**',
'node_modules/hyliveext-rn-sdk/**',
'node_modules/@hyext/hyext-rn-sdk/**',
'node_modules/@hyext/hyliveext-rn-sdk/**',
],
}, baseProvider.projectConfig),
getBaseModulesPath: (extType) => getBaseModulesPath(projectRoot, dependencies, RNVersion, extType),
getBaseModules: (extType) => getBaseModules(projectRoot, dependencies, RNVersion, extType),
getSDKVerByExtType: (extType) => getSDKVerByExtType(dependencies, RNVersion, extType),
// groupBuildConfigFn: (config: NeoBuildConfigItem) => getSDKRoleFromExtType(config.extType)
// 同时构建多个的话效率反而下降了
groupBuildConfigFn: (config) => config.extType
};
};