UNPKG

nativescript

Version:

Command-line interface for building NativeScript projects

146 lines • 8.01 kB
"use strict"; 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