@config-plugins/tv
Version:
Config plugin to reconfigure native directories for TV development if needed
68 lines (67 loc) • 3.17 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.removeTVSplashScreenModifications = exports.addTVSplashScreenModifications = exports.withTVSplashScreen = void 0;
const config_plugins_1 = require("expo/config-plugins");
const fs_1 = require("fs");
const path_1 = __importDefault(require("path"));
const utils_1 = require("./utils");
const pkg = require("../package.json");
/** Dangerously modifies or reverts changes needed for TV in SplashScreen.storyboard. */
const withTVSplashScreen = (config, params = {}) => {
const isTV = (0, utils_1.isTVEnabled)(params);
const verbose = (0, utils_1.showVerboseWarnings)(params);
return (0, config_plugins_1.withDangerousMod)(config, [
"ios",
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
async (config) => {
if (!config.modRequest.projectName) {
throw new Error(`The ${pkg.name}@${pkg.version} plugin requires a configured project name.`);
}
const file = path_1.default.join(config.modRequest.platformProjectRoot, config.modRequest.projectName, "SplashScreen.storyboard");
const contents = await fs_1.promises.readFile(file, "utf8");
const modifiedContents = isTV
? addTVSplashScreenModifications(contents)
: removeTVSplashScreenModifications(contents);
if (modifiedContents !== contents) {
if (verbose) {
config_plugins_1.WarningAggregator.addWarningIOS("splashscreen", `${pkg.name}@${pkg.version}:: modifying SplashScreen.storyboard for ${isTV ? "tvOS" : "iOS"}`);
}
await fs_1.promises.writeFile(file, modifiedContents, "utf-8");
}
return config;
},
]);
};
exports.withTVSplashScreen = withTVSplashScreen;
const splashScreenStringsForPhone = [
"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB",
'targetRuntime="iOS.CocoaTouch"',
'id="retina5_5"',
'<deployment identifier="iOS"/>',
];
const splashScreenStringsForTV = [
"com.apple.InterfaceBuilder.AppleTV.Storyboard",
'targetRuntime="AppleTV"',
'id="appleTV"',
'<deployment identifier="tvOS"/>',
];
function modifySource(src, originalStrings, replacementStrings) {
let modifiedSource = src;
originalStrings.forEach((s, i) => {
const original = new RegExp(`${s}`, "g");
const replacement = replacementStrings[i];
modifiedSource = modifiedSource.replace(original, replacement);
});
return modifiedSource;
}
function addTVSplashScreenModifications(src) {
return modifySource(src, splashScreenStringsForPhone, splashScreenStringsForTV);
}
exports.addTVSplashScreenModifications = addTVSplashScreenModifications;
function removeTVSplashScreenModifications(src) {
return modifySource(src, splashScreenStringsForTV, splashScreenStringsForPhone);
}
exports.removeTVSplashScreenModifications = removeTVSplashScreenModifications;