UNPKG

@hyext/builder-neorn

Version:

neo react-native builder for hyext

207 lines (206 loc) 8.39 kB
"use strict"; 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 }; };