UNPKG

nativescript

Version:

Command-line interface for building NativeScript projects

122 lines 7.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PlatformController = void 0; const path = require("path"); const yok_1 = require("../common/yok"); class PlatformController { constructor($addPlatformService, $errors, $fs, $logger, $packageInstallationManager, $projectDataService, $platformsDataService, $projectChangesService, $mobileHelper) { this.$addPlatformService = $addPlatformService; this.$errors = $errors; this.$fs = $fs; this.$logger = $logger; this.$packageInstallationManager = $packageInstallationManager; this.$projectDataService = $projectDataService; this.$platformsDataService = $platformsDataService; this.$projectChangesService = $projectChangesService; this.$mobileHelper = $mobileHelper; } async addPlatform(addPlatformData, projectData) { const [platform, version] = addPlatformData.platform .toLowerCase() .split("@"); projectData !== null && projectData !== void 0 ? projectData : (projectData = this.$projectDataService.getProjectData(addPlatformData.projectDir)); const platformData = this.$platformsDataService.getPlatformData(platform, projectData); this.$logger.trace(`Creating NativeScript project for the ${platform} platform`); this.$logger.trace(`Path: ${platformData.projectRoot}`); this.$logger.trace(`Package: ${projectData.projectIdentifiers[platform]}`); this.$logger.trace(`Name: ${projectData.projectName}`); this.$logger.info("Copying template files..."); const packageToInstall = await this.getPackageToInstall(platformData, projectData, addPlatformData.frameworkPath, version); this.$logger.trace("Determined package to install is", packageToInstall); const installedPlatformVersion = await this.$addPlatformService.addPlatformSafe(projectData, platformData, packageToInstall, addPlatformData); this.$fs.ensureDirectoryExists(path.join(projectData.platformsDir, platform)); if (this.$mobileHelper.isAndroidPlatform(platform)) { const gradlePropertiesPath = path.resolve(platformData.projectRoot, "gradle.properties"); const commentHeader = "# App configuration"; const appPath = projectData.getAppDirectoryRelativePath(); const appResourcesPath = projectData.getAppResourcesRelativeDirectoryPath(); let gradlePropertiesContents = ""; if (this.$fs.exists(gradlePropertiesPath)) { gradlePropertiesContents = this.$fs .readFile(gradlePropertiesPath) .toString(); } if (!gradlePropertiesContents.includes(commentHeader)) { const dataToWrite = [ "", "", commentHeader, `appPath = ${appPath}`, `appResourcesPath = ${appResourcesPath}`, "", ].join("\n"); gradlePropertiesContents += dataToWrite; this.$logger.trace("Updated gradle.properties with project data..."); this.$fs.writeFile(gradlePropertiesPath, gradlePropertiesContents); } } this.$logger.info(`Platform ${platform} successfully added. v${installedPlatformVersion}`); } async addPlatformIfNeeded(addPlatformData, projectData) { if (addPlatformData.hostProjectPath) { this.$logger.trace("Not adding platform because --hostProjectPath is provided."); return; } const [platform] = addPlatformData.platform.toLowerCase().split("@"); projectData !== null && projectData !== void 0 ? projectData : (projectData = this.$projectDataService.getProjectData(addPlatformData.projectDir)); const platformData = this.$platformsDataService.getPlatformData(platform, projectData); const shouldAddPlatform = this.shouldAddPlatform(platformData, projectData, addPlatformData.nativePrepare); if (shouldAddPlatform) { await this.addPlatform(addPlatformData, projectData); } } async getPackageToInstall(platformData, projectData, frameworkPath, version) { let result = null; if (frameworkPath) { if (!this.$fs.exists(frameworkPath)) { this.$errors.fail(`Invalid frameworkPath: ${frameworkPath}. Please ensure the specified frameworkPath exists.`); } result = "file:" + path.resolve(frameworkPath); } else { const desiredRuntimePackage = this.$projectDataService.getRuntimePackage(projectData.projectDir, platformData.platformNameLowerCase); if (version) { desiredRuntimePackage.version = version; } if (!desiredRuntimePackage.version) { // if no version is explicitly added, then we use the latest desiredRuntimePackage.version = await this.$packageInstallationManager.getLatestCompatibleVersion(desiredRuntimePackage.name); } // const currentPlatformData = this.$projectDataService.getNSValue(projectData.projectDir, platformData.frameworkPackageName); // version = (currentPlatformData && currentPlatformData.version) || // await this.$packageInstallationManager.getLatestCompatibleVersion(platformData.frameworkPackageName); result = `${desiredRuntimePackage.name}@${desiredRuntimePackage.version}`; } return result; } shouldAddPlatform(platformData, projectData, nativePrepare) { const platformName = platformData.platformNameLowerCase; const hasPlatformDirectory = this.$fs.exists(path.join(projectData.platformsDir, platformName)); const shouldAddNativePlatform = !nativePrepare || !nativePrepare.skipNativePrepare; const prepareInfo = this.$projectChangesService.getPrepareInfo(platformData); const requiresNativePlatformAdd = prepareInfo && prepareInfo.nativePlatformStatus === "1" /* NativePlatformStatus.requiresPlatformAdd */; const shouldAddPlatform = !hasPlatformDirectory || (shouldAddNativePlatform && requiresNativePlatformAdd); if (hasPlatformDirectory && !shouldAddPlatform) { const platformDirectoryItemCount = this.$fs.readDirectory(path.join(projectData.platformsDir, platformName)).length; // 2 is a magic number to approximate a valid platform folder // any valid platform should contain at least 2 files/folders // we choose 2 to avoid false-positives due to system files like .DS_Store etc. if (platformDirectoryItemCount <= 2) { this.$logger.warn(`The platforms/${platformName} folder appears to be invalid. If the build fails, run 'ns clean' and rebuild the app.`, { wrapMessageWithBorders: true }); } } return !!shouldAddPlatform; } } exports.PlatformController = PlatformController; yok_1.injector.register("platformController", PlatformController); //# sourceMappingURL=platform-controller.js.map