nativescript
Version:
Command-line interface for building NativeScript projects
98 lines • 5.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AndroidResourcesMigrationService = void 0;
const path = require("path");
const constants = require("../constants");
const os_1 = require("os");
const yok_1 = require("../common/yok");
class AndroidResourcesMigrationService {
constructor($fs, $errors, $logger, $devicePlatformsConstants) {
this.$fs = $fs;
this.$errors = $errors;
this.$logger = $logger;
this.$devicePlatformsConstants = $devicePlatformsConstants;
}
canMigrate(platformString) {
return (platformString.toLowerCase() ===
this.$devicePlatformsConstants.Android.toLowerCase());
}
hasMigrated(appResourcesDir) {
return this.$fs.exists(path.join(appResourcesDir, AndroidResourcesMigrationService.ANDROID_DIR, constants.SRC_DIR, constants.MAIN_DIR));
}
async migrate(appResourcesDir, backupLocation) {
const originalAppResources = path.join(appResourcesDir, AndroidResourcesMigrationService.ANDROID_DIR);
const appResourcesDestination = path.join(appResourcesDir, AndroidResourcesMigrationService.ANDROID_DIR_TEMP);
const appResourcesBackup = path.join(backupLocation || appResourcesDir, AndroidResourcesMigrationService.ANDROID_DIR_OLD);
try {
await this.tryMigrate(originalAppResources, appResourcesDestination, appResourcesBackup);
this.$logger.info(`Successfully updated your project's application resources '/Android' directory structure.${os_1.EOL}The previous version of your Android application resources has been renamed to '/${AndroidResourcesMigrationService.ANDROID_DIR_OLD}'`);
}
catch (error) {
try {
this.recover(originalAppResources, appResourcesDestination, appResourcesBackup);
this.$logger.info("Failed to update resources. They should be in their initial state.");
}
catch (err) {
this.$logger.trace(err);
this.$logger.info(`Failed to update resources.${os_1.EOL} Backup of original content is inside "${appResourcesBackup}".${os_1.EOL}If "${originalAppResources} is missing copy from backup folder."`);
}
finally {
this.$errors.fail(error.message);
}
}
}
async tryMigrate(originalAppResources, appResourcesDestination, appResourcesBackup) {
const appMainSourceSet = path.join(appResourcesDestination, constants.SRC_DIR, constants.MAIN_DIR);
const appResourcesMainSourceSetResourcesDestination = path.join(appMainSourceSet, constants.RESOURCES_DIR);
this.$fs.ensureDirectoryExists(appResourcesDestination);
this.$fs.ensureDirectoryExists(appMainSourceSet);
// create /java, /res and /assets in the App_Resources/Android/src/main directory
this.$fs.ensureDirectoryExists(appResourcesMainSourceSetResourcesDestination);
this.$fs.ensureDirectoryExists(path.join(appMainSourceSet, "java"));
this.$fs.ensureDirectoryExists(path.join(appMainSourceSet, constants.ASSETS_DIR));
const isDirectory = (source) => this.$fs.getLsStats(source).isDirectory();
const getAllFiles = (source) => this.$fs.readDirectory(source).map((name) => path.join(source, name));
const getDirectories = (files) => files.filter(isDirectory);
const getFiles = (files) => files.filter((file) => !isDirectory(file));
this.$fs.copyFile(path.join(originalAppResources, constants.APP_GRADLE_FILE_NAME), path.join(appResourcesDestination, constants.APP_GRADLE_FILE_NAME));
const appResourcesFiles = getAllFiles(originalAppResources);
const resourceDirectories = getDirectories(appResourcesFiles);
const resourceFiles = getFiles(appResourcesFiles);
resourceDirectories.forEach((dir) => {
if (path.basename(dir) !== "libs") {
// don't copy /App_Resources/Android/libs into the src/main/res/libs directory
this.$fs.copyFile(dir, appResourcesMainSourceSetResourcesDestination);
}
else {
// copy App_Resources/Android/libs to App_ResourcesNew/Android/libs
this.$fs.copyFile(dir, path.join(appResourcesDestination));
}
});
resourceFiles.forEach((file) => {
const fileName = path.basename(file);
if (fileName !== constants.MANIFEST_FILE_NAME) {
// don't copy AndroidManifest into /App_Resources/Android as it needs to be inside src/main/
this.$fs.copyFile(file, path.join(appResourcesDestination, fileName));
}
});
this.$fs.copyFile(path.join(originalAppResources, constants.MANIFEST_FILE_NAME), path.join(appMainSourceSet, constants.MANIFEST_FILE_NAME));
// rename the legacy app_resources to ANDROID_DIR_OLD
this.$fs.rename(originalAppResources, appResourcesBackup);
// move the new, updated app_resources to App_Resources/Android, as the de facto resources
this.$fs.rename(appResourcesDestination, originalAppResources);
}
recover(originalAppResources, appResourcesDestination, appResourcesBackup) {
if (!this.$fs.exists(originalAppResources)) {
this.$fs.rename(appResourcesBackup, originalAppResources);
}
if (this.$fs.exists(appResourcesDestination)) {
this.$fs.deleteDirectory(appResourcesDestination);
}
}
}
exports.AndroidResourcesMigrationService = AndroidResourcesMigrationService;
AndroidResourcesMigrationService.ANDROID_DIR = "Android";
AndroidResourcesMigrationService.ANDROID_DIR_TEMP = "Android-Updated";
AndroidResourcesMigrationService.ANDROID_DIR_OLD = "Android-Pre-v4";
yok_1.injector.register("androidResourcesMigrationService", AndroidResourcesMigrationService);
//# sourceMappingURL=android-resources-migration-service.js.map