diff options
Diffstat (limited to 'StoneIsland/plugins/cordova-plugin-androidx-adapter/apply.js')
| -rw-r--r-- | StoneIsland/plugins/cordova-plugin-androidx-adapter/apply.js | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/StoneIsland/plugins/cordova-plugin-androidx-adapter/apply.js b/StoneIsland/plugins/cordova-plugin-androidx-adapter/apply.js new file mode 100644 index 00000000..7dc44b85 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-androidx-adapter/apply.js @@ -0,0 +1,101 @@ +var PLUGIN_NAME = "cordova-plugin-androidx-adapter"; +var ARTIFACT_MAPPINGS_FILE = "artifact-mappings.json"; +var CLASS_MAPPINGS_FILE = "class-mappings.json"; +var SRC_PATH = "./platforms/android/app/src/main"; +var BUILD_GRADLE_PATH = "./platforms/android/app/build.gradle"; +var PROJECT_PROPERTIES_PATH = "./platforms/android/project.properties"; +var MANIFEST_PATH = "./platforms/android/app/src/main/AndroidManifest.xml"; +var TARGET_FILE_REGEX = /(\.java|\.xml)/; + +var deferral, fs, path, now, recursiveDir; + +function log(message) { + console.log(PLUGIN_NAME + ": " + message); +} + +function onFatalException(ex){ + log("EXCEPTION: " + ex.toString()); + deferral.resolve(); // resolve instead of reject so build doesn't fail +} + +function run() { + try { + fs = require('fs'); + path = require('path'); + recursiveDir = require("recursive-readdir"); + now = require("performance-now") + } catch (e) { + throw("Failed to load dependencies: " + e.toString()); + } + + var startTime = now(); + + var artifactMappings = JSON.parse(fs.readFileSync(path.join(__dirname, '.', ARTIFACT_MAPPINGS_FILE)).toString()), + buildGradle = fs.readFileSync(BUILD_GRADLE_PATH).toString(), + projectProperties = fs.readFileSync(PROJECT_PROPERTIES_PATH).toString(), + androidManifest = fs.readFileSync(MANIFEST_PATH).toString(); + + // Replace artifacts in build.gradle, project.properties & AndroidManifest.xml + for(var oldArtifactName in artifactMappings){ + var newArtifactName = artifactMappings[oldArtifactName], + artifactRegExpStr = sanitiseForRegExp(oldArtifactName) + ':[0-9.+]+'; + buildGradle = buildGradle.replace(new RegExp(artifactRegExpStr, 'gm'), newArtifactName); + projectProperties = projectProperties.replace(new RegExp(artifactRegExpStr, 'gm'), newArtifactName); + } + fs.writeFileSync(BUILD_GRADLE_PATH, buildGradle, 'utf8'); + fs.writeFileSync(PROJECT_PROPERTIES_PATH, projectProperties, 'utf8'); + + var classMappings = JSON.parse(fs.readFileSync(path.join(__dirname, '.', CLASS_MAPPINGS_FILE)).toString()); + + // Replace class/package names in AndroidManifest.xml + for (var oldClassName in classMappings){ + androidManifest = androidManifest.replace(new RegExp(oldClassName, 'g'), classMappings[oldClassName]); + } + fs.writeFileSync(MANIFEST_PATH, androidManifest, 'utf8'); + + // Replace class/package names in source code + recursiveDir(SRC_PATH, [function(file, stats){ + if(stats.isDirectory()){ + return false; + } + return !file.match(TARGET_FILE_REGEX); + }], attempt(function(err, files){ + if(err) throw err; + + for(var filePath of files){ + var fileContents = fs.readFileSync(filePath).toString(); + for (var oldClassName in classMappings){ + fileContents = fileContents.replace(new RegExp(oldClassName, 'g'), classMappings[oldClassName]); + } + fs.writeFileSync(filePath, fileContents, 'utf8'); + } + log("Processed " + files.length + " source files in " + parseInt(now() - startTime) + "ms"); + deferral.resolve(); + })); +} + +function sanitiseForRegExp(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); +} + +function attempt(fn) { + return function () { + try { + fn.apply(this, arguments); + } catch (e) { + onFatalException(e); + } + } +} + +module.exports = function (ctx) { + try{ + deferral = require('q').defer(); + }catch(e){ + e.message = 'Unable to load node module dependency \'q\': '+e.message; + onFatalException(e); + throw e; + } + attempt(run)(); + return deferral.promise; +}; |
