mx-jpush-expo
Version:
Expo 集成极光推送(JPush)一体化解决方案,支持 iOS/Android 厂商通道
154 lines • 6.36 kB
JavaScript
;
/**
* Android project/build.gradle 配置
* 添加厂商通道所需的 classpath 依赖
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.applyAndroidProjectBuildGradle = applyAndroidProjectBuildGradle;
exports.withAndroidProjectBuildGradle = withAndroidProjectBuildGradle;
const config_plugins_1 = require("expo/config-plugins");
const generateCode_1 = require("../utils/generateCode");
const sourceCode_1 = require("../utils/sourceCode");
const LEGACY_PROJECT_BUILD_TAGS = [
'jpush-buildscript-repositories',
'jpush-buildscript-classpaths',
'jpush-allprojects-repositories',
'jpush-huawei-maven-buildscript',
'jpush-honor-maven-buildscript',
'jpush-vendor-classpaths',
'jpush-huawei-maven-allprojects',
'jpush-honor-maven-allprojects',
];
function getProjectVendorFlags(vendorChannels) {
if (!vendorChannels) {
return {};
}
return Object.fromEntries(Object.entries(vendorChannels).map(([key, value]) => [
key,
Boolean(value?.enabled || value?.appId || value?.appKey),
]));
}
function getBuildscriptRepositories(vendorChannels) {
const flags = getProjectVendorFlags(vendorChannels);
const repositories = [];
if (flags.huawei) {
repositories.push(`maven { url 'https://developer.huawei.com/repo/' }`);
}
if (flags.honor) {
repositories.push(`maven { url 'https://developer.hihonor.com/repo' }`);
}
return repositories.join('\n ');
}
/**
* 获取厂商通道开启标记
*/
const getVendorClasspaths = (vendorChannels) => {
const isHuaweiEnabled = vendorChannels?.huawei?.enabled === true;
const isFcmEnabled = vendorChannels?.fcm?.enabled === true;
const classpaths = [];
if (isFcmEnabled) {
classpaths.push(`// Google Services for FCM`);
classpaths.push(`classpath 'com.google.gms:google-services:4.4.0'`);
}
if (isHuaweiEnabled) {
classpaths.push(`// Huawei AGConnect`);
classpaths.push(`classpath 'com.huawei.agconnect:agcp:1.9.3.302'`);
}
return classpaths.join('\n ');
};
/**
* 生成 allprojects repositories 仓库依赖
*/
const getAllprojectsRepositories = (vendorChannels) => {
const flags = getProjectVendorFlags(vendorChannels);
const repositories = [];
if (flags.huawei) {
repositories.push(`maven { url 'https://developer.huawei.com/repo/' }`);
}
if (flags.honor) {
repositories.push(`maven { url 'https://developer.hihonor.com/repo' }`);
}
return repositories.join('\n ');
};
function ensureProjectBuildscriptBlock(src) {
try {
let nextContents = (0, sourceCode_1.ensureTopLevelBlock)(src, 'buildscript');
nextContents = (0, sourceCode_1.ensureNestedBlock)(nextContents, /^\s*buildscript\s*\{/, 'repositories');
nextContents = (0, sourceCode_1.ensureNestedBlock)(nextContents, /^\s*buildscript\s*\{/, 'dependencies');
return nextContents;
}
catch (error) {
console.warn('[MX_JPush_Expo] 无法确保 buildscript 块结构:', error);
return src;
}
}
function ensureProjectAllprojectsBlock(src) {
try {
let nextContents = (0, sourceCode_1.ensureTopLevelBlock)(src, 'allprojects');
nextContents = (0, sourceCode_1.ensureNestedBlock)(nextContents, /^\s*allprojects\s*\{/, 'repositories');
return nextContents;
}
catch (error) {
console.warn('[MX_JPush_Expo] 无法确保 allprojects 块结构:', error);
return src;
}
}
function removeLegacyGeneratedSections(contents) {
return LEGACY_PROJECT_BUILD_TAGS.reduce((currentContents, tag) => {
return (0, generateCode_1.removeGeneratedContents)(currentContents, tag) ?? currentContents;
}, contents);
}
function applyAndroidProjectBuildGradle(contents, vendorChannels) {
let nextContents = removeLegacyGeneratedSections(contents);
const buildscriptRepositories = getBuildscriptRepositories(vendorChannels);
const buildscriptClasspaths = getVendorClasspaths(vendorChannels);
if (buildscriptRepositories || buildscriptClasspaths) {
nextContents = ensureProjectBuildscriptBlock(nextContents);
}
const allprojectsRepositories = getAllprojectsRepositories(vendorChannels);
if (allprojectsRepositories) {
nextContents = ensureProjectAllprojectsBlock(nextContents);
}
const buildscriptRepositoriesRange = (0, sourceCode_1.findNestedBlockRange)(nextContents, /^\s*buildscript\s*\{/, /^\s*repositories\s*\{/);
if (buildscriptRepositoriesRange) {
nextContents = (0, generateCode_1.syncGeneratedContentsAtLine)({
src: nextContents,
newSrc: buildscriptRepositories,
tag: 'jpush-buildscript-repositories',
lineIndex: buildscriptRepositoriesRange.startLine,
offset: 1,
comment: '//',
}).contents;
}
const buildscriptDependenciesRange = (0, sourceCode_1.findNestedBlockRange)(nextContents, /^\s*buildscript\s*\{/, /^\s*dependencies\s*\{/);
if (buildscriptDependenciesRange) {
nextContents = (0, generateCode_1.syncGeneratedContentsAtLine)({
src: nextContents,
newSrc: buildscriptClasspaths,
tag: 'jpush-buildscript-classpaths',
lineIndex: buildscriptDependenciesRange.startLine,
offset: 1,
comment: '//',
}).contents;
}
const allprojectsRepositoriesRange = (0, sourceCode_1.findNestedBlockRange)(nextContents, /^\s*allprojects\s*\{/, /^\s*repositories\s*\{/);
if (allprojectsRepositoriesRange) {
nextContents = (0, generateCode_1.syncGeneratedContentsAtLine)({
src: nextContents,
newSrc: allprojectsRepositories,
tag: 'jpush-allprojects-repositories',
lineIndex: allprojectsRepositoriesRange.startLine,
offset: 1,
comment: '//',
}).contents;
}
return nextContents;
}
function withAndroidProjectBuildGradle(config, props) {
return (0, config_plugins_1.withProjectBuildGradle)(config, (config) => {
const { vendorChannels } = props;
config.modResults.contents = applyAndroidProjectBuildGradle(config.modResults.contents, vendorChannels);
return config;
});
}
//# sourceMappingURL=projectBuildGradle.js.map