nativescript
Version:
Command-line interface for building NativeScript projects
146 lines • 8.01 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.CocoaPodsPlatformManager = void 0;
const os_1 = require("os");
const path = require("path");
const semver = require("semver");
const _ = require("lodash");
const constants_1 = require("../constants");
const yok_1 = require("../common/yok");
class CocoaPodsPlatformManager {
constructor($logger) {
this.$logger = $logger;
}
addPlatformSection(projectData, podfilePlatformData, projectPodfileContent) {
const platformSectionData = this.getPlatformSectionData(projectPodfileContent);
if (platformSectionData && platformSectionData.podfilePlatformData) {
const shouldReplacePlatformSection = this.shouldReplacePlatformSection(projectData, platformSectionData.podfilePlatformData, podfilePlatformData);
if (shouldReplacePlatformSection) {
this.$logger.warn(`Multiple identical platforms with different versions have been detected during the processing of podfiles. The current platform's content "${platformSectionData.podfilePlatformData.content}" from ${platformSectionData.podfilePlatformData.path} will be replaced with "${podfilePlatformData.content}" from ${podfilePlatformData.path}`);
const newSection = this.buildPlatformSection(podfilePlatformData);
projectPodfileContent = projectPodfileContent.replace(platformSectionData.platformSectionContent, newSection.trim());
}
}
else {
projectPodfileContent =
projectPodfileContent.trim() +
os_1.EOL +
os_1.EOL +
this.buildPlatformSection(podfilePlatformData);
}
return projectPodfileContent;
}
removePlatformSection(moduleName, projectPodfileContent, podfilePath) {
const platformSectionData = this.getPlatformSectionData(projectPodfileContent);
if (platformSectionData &&
platformSectionData.podfilePlatformData &&
platformSectionData.podfilePlatformData.path === podfilePath) {
const podfileContentRegExp = new RegExp(`# Begin Podfile - ([\\s\\S]*?)# End Podfile`, "mg");
const allPodfiles = projectPodfileContent.match(podfileContentRegExp) || [];
const selectedPlatformData = this.selectPlatformDataFromProjectPodfile(allPodfiles);
const newPlatformSection = selectedPlatformData
? this.buildPlatformSection(selectedPlatformData)
: "";
const regExp = new RegExp(`${platformSectionData.platformSectionContent}\\r?\\n`, "mg");
projectPodfileContent = projectPodfileContent.replace(regExp, newPlatformSection);
}
return projectPodfileContent;
}
replacePlatformRow(podfileContent, podfilePath) {
let podfilePlatformData = null;
const platformRowRegExp = new RegExp(`^\\s*?(platform\\b\\s*?\\:\\s*?ios\\b(?:,\\s*?['"](.+)['"])?)`, "gm");
const replacedContent = podfileContent.replace(platformRowRegExp, (substring, firstGroup, secondGroup) => {
podfilePlatformData = {
content: firstGroup,
version: secondGroup,
path: podfilePath,
};
return `# ${substring.trim()}`;
});
return { replacedContent, podfilePlatformData };
}
getPlatformSectionData(projectPodfileContent) {
const platformSectionRegExp = new RegExp(`${this.getPlatformSectionHeader()} ([\\s\\S]*?)with[\\s\\S]*?\\n([\\s\\S]*?(?:,\\s*?['"](.+)['"])?)\\n${this.getPlatformSectionFooter()}`, "m");
const match = platformSectionRegExp.exec(projectPodfileContent);
let result = null;
if (match && match[0]) {
result = {
platformSectionContent: match[0],
podfilePlatformData: {
path: match[1].trim(),
content: match[2],
version: match[3],
},
};
}
return result;
}
selectPlatformDataFromProjectPodfile(allPodfiles) {
const platformRowRegExp = new RegExp(`^\\s*?#\\s*?(platform\\b\\s*?\\:\\s*?ios\\b(?:,\\s*?['"](.+)['"])?)`, "m");
const podfilePathRegExp = new RegExp(`# Begin Podfile - ([\\s\\S]*?)${os_1.EOL}`);
let selectedPlatformData = null;
_.each(allPodfiles, (podfileContent) => {
const platformMatch = platformRowRegExp.exec(podfileContent);
const podfilePathMatch = podfilePathRegExp.exec(podfileContent) || [];
// platform without version -> select it with highest priority
if (platformMatch && platformMatch[0] && !platformMatch[2]) {
selectedPlatformData = {
version: null,
content: platformMatch[1],
path: podfilePathMatch[1],
};
return false;
}
// platform with version
if (platformMatch && platformMatch[0] && platformMatch[2]) {
if (!selectedPlatformData ||
semver.gt(semver.coerce(platformMatch[2]), semver.coerce(selectedPlatformData.version))) {
selectedPlatformData = {
version: platformMatch[2],
content: platformMatch[1],
path: podfilePathMatch[1],
};
}
}
});
return selectedPlatformData;
}
shouldReplacePlatformSection(projectData, oldPodfilePlatformData, currentPodfilePlatformData) {
// The selected platform should be replaced in the following cases:
// 1. When the pod file is from App_Resources and the selected platform is not from App_Resources
// 2. When the pod file is from App_Resources, the selected platform is also from App_Resources
// and the pod's version is greater than the selected one
// 3. When the pod file doesn't have platform's version -> `platform :ios`
// 4. When the pod file has a version greater than the selected platform's version
const appResourcesPodfilePath = path.join(projectData.getAppResourcesDirectoryPath(), "iOS", constants_1.PODFILE_NAME);
const isFromAppResources = oldPodfilePlatformData.path !== appResourcesPodfilePath &&
currentPodfilePlatformData.path === appResourcesPodfilePath;
const isFromAppResourcesWithGreaterPlatformVersion = oldPodfilePlatformData.path === appResourcesPodfilePath &&
currentPodfilePlatformData.path === appResourcesPodfilePath &&
semver.gt(semver.coerce(currentPodfilePlatformData.version), semver.coerce(oldPodfilePlatformData.version));
const isPodfileWithGreaterPlatformVersion = !currentPodfilePlatformData.version ||
(oldPodfilePlatformData.version &&
semver.gt(semver.coerce(currentPodfilePlatformData.version), semver.coerce(oldPodfilePlatformData.version)));
const result = isFromAppResources ||
isFromAppResourcesWithGreaterPlatformVersion ||
isPodfileWithGreaterPlatformVersion;
return result;
}
buildPlatformSection(podfilePlatformData) {
let result = `${this.getPlatformSectionHeader()} ${podfilePlatformData.path} with`;
if (podfilePlatformData.version) {
result += ` ${podfilePlatformData.version}`;
}
result += `${os_1.EOL}${podfilePlatformData.content}${os_1.EOL}${this.getPlatformSectionFooter()}${os_1.EOL}`;
return result;
}
getPlatformSectionHeader() {
return "# NativeScriptPlatformSection";
}
getPlatformSectionFooter() {
return "# End NativeScriptPlatformSection";
}
}
exports.CocoaPodsPlatformManager = CocoaPodsPlatformManager;
yok_1.injector.register("cocoaPodsPlatformManager", CocoaPodsPlatformManager);
//# sourceMappingURL=cocoapods-platform-manager.js.map
;