expo-splash-screen
Version:
Provides a module to allow keeping the native Splash Screen visible until you choose to hide it.
188 lines (187 loc) • 7.46 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.withIosSplashAssets = void 0;
exports.buildContentsJsonImages = buildContentsJsonImages;
const image_utils_1 = require("@expo/image-utils");
const config_plugins_1 = require("expo/config-plugins");
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const IMAGE_CACHE_NAME = 'splash-ios';
const IMAGESET_PATH = 'Images.xcassets/SplashScreenLogo.imageset';
const LEGACY_IMAGESET_PATH = 'Images.xcassets/SplashScreenLegacy.imageset';
const PNG_FILENAME = 'image';
const DARK_PNG_FILENAME = 'dark_image';
const TABLET_PNG_FILENAME = 'tablet_image';
const DARK_TABLET_PNG_FILENAME = 'dark_tablet_image';
const darkAppearances = [{ appearance: 'luminosity', value: 'dark' }];
const withIosSplashAssets = (config, splash) => {
return (0, config_plugins_1.withDangerousMod)(config, [
'ios',
async (config) => {
const iosNamedProjectRoot = config_plugins_1.IOSConfig.Paths.getSourceRoot(config.modRequest.projectRoot);
await configureImageAssets({
projectRoot: config.modRequest.projectRoot,
iosNamedProjectRoot,
image: splash.image,
darkImage: splash.dark?.image,
tabletImage: splash.tabletImage,
darkTabletImage: splash.dark?.tabletImage,
imageWidth: splash.imageWidth,
enableFullScreenImage: splash.enableFullScreenImage_legacy,
});
return config;
},
]);
};
exports.withIosSplashAssets = withIosSplashAssets;
/**
* Creates imageset containing image for Splash/Launch Screen.
*/
async function configureImageAssets({ projectRoot, iosNamedProjectRoot, image, darkImage, tabletImage, darkTabletImage, imageWidth, enableFullScreenImage, }) {
const imagePath = enableFullScreenImage ? LEGACY_IMAGESET_PATH : IMAGESET_PATH;
const imageSetPath = path_1.default.resolve(iosNamedProjectRoot, imagePath);
// remove legacy imageSet if it is not used
if (!enableFullScreenImage) {
const legacyImageSetPath = path_1.default.resolve(iosNamedProjectRoot, LEGACY_IMAGESET_PATH);
await fs_1.default.promises.rm(legacyImageSetPath, { force: true, recursive: true });
}
// ensure old SplashScreen imageSet is removed
await fs_1.default.promises.rm(imageSetPath, { force: true, recursive: true });
if (!image) {
return;
}
await writeContentsJsonAsync({
assetPath: imageSetPath,
image: PNG_FILENAME,
darkImage: darkImage ? DARK_PNG_FILENAME : undefined,
tabletImage: tabletImage ? TABLET_PNG_FILENAME : undefined,
darkTabletImage: darkTabletImage ? DARK_TABLET_PNG_FILENAME : undefined,
});
await copyImageFiles({
projectRoot,
iosNamedProjectRoot,
image,
darkImage,
tabletImage,
darkTabletImage,
imageWidth,
enableFullScreenImage,
});
}
async function copyImageFiles({ projectRoot, iosNamedProjectRoot, image, darkImage, tabletImage, darkTabletImage, imageWidth, enableFullScreenImage, }) {
await generateImagesAssetsAsync({
async generateImageAsset(item, fileName) {
await Promise.all([
{ ratio: 1, suffix: '' },
{ ratio: 2, suffix: '@2x' },
{ ratio: 3, suffix: '@3x' },
].map(async ({ ratio, suffix }) => {
const size = imageWidth * ratio;
// Using this method will cache the images in `.expo` based on the properties used to generate them.
// this method also supports remote URLs and using the global sharp instance.
const { source } = await (0, image_utils_1.generateImageAsync)({ projectRoot, cacheType: IMAGE_CACHE_NAME }, {
src: item,
width: enableFullScreenImage ? undefined : size,
height: enableFullScreenImage ? undefined : size,
});
// Write image buffer to the file system.
// const assetPath = join(iosNamedProjectRoot, IMAGESET_PATH, filename);
await fs_1.default.promises.writeFile(path_1.default.resolve(iosNamedProjectRoot, enableFullScreenImage ? LEGACY_IMAGESET_PATH : IMAGESET_PATH, `${fileName}${suffix}.png`), source);
}));
},
anyItem: image,
darkItem: darkImage,
tabletItem: tabletImage,
darkTabletItem: darkTabletImage,
});
}
async function generateImagesAssetsAsync({ generateImageAsset, anyItem, darkItem, tabletItem, darkTabletItem, }) {
const items = [
[anyItem, PNG_FILENAME],
[darkItem, DARK_PNG_FILENAME],
[tabletItem, TABLET_PNG_FILENAME],
[darkTabletItem, DARK_TABLET_PNG_FILENAME],
].filter((tuple) => tuple[0] != null);
await Promise.all(items.map(([item, fileName]) => generateImageAsset(item, fileName)));
}
function buildContentsJsonImages({ image, darkImage, tabletImage, darkTabletImage, }) {
// Phone light
const images = [
{
idiom: 'universal',
filename: `${image}.png`,
scale: '1x',
},
{
idiom: 'universal',
filename: `${image}@2x.png`,
scale: '2x',
},
{
idiom: 'universal',
filename: `${image}@3x.png`,
scale: '3x',
},
];
// Phone dark
if (darkImage) {
images.push({
idiom: 'universal',
appearances: darkAppearances,
scale: '1x',
filename: `${darkImage}.png`,
}, {
idiom: 'universal',
appearances: darkAppearances,
scale: '2x',
filename: `${darkImage}@2x.png`,
}, {
idiom: 'universal',
appearances: darkAppearances,
scale: '3x',
filename: `${darkImage}@3x.png`,
});
}
// Tablet light
if (tabletImage) {
images.push({
idiom: 'ipad',
filename: `${tabletImage}.png`,
scale: '1x',
}, {
idiom: 'ipad',
scale: '2x',
filename: `${tabletImage}@2x.png`,
});
}
// Tablet dark
if (darkTabletImage) {
images.push({
idiom: 'ipad',
appearances: darkAppearances,
filename: `${darkTabletImage}.png`,
scale: '1x',
}, {
idiom: 'ipad',
appearances: darkAppearances,
filename: `${darkTabletImage}@2x.png`,
scale: '2x',
});
}
return images;
}
async function writeContentsJsonAsync({ assetPath, image, darkImage, tabletImage, darkTabletImage, }) {
const images = buildContentsJsonImages({ image, darkImage, tabletImage, darkTabletImage });
await fs_1.default.promises.mkdir(assetPath, { recursive: true });
await fs_1.default.promises.writeFile(path_1.default.join(assetPath, 'Contents.json'), JSON.stringify({
images,
info: {
version: 1,
// common practice is for the tool that generated the icons to be the "author"
author: 'expo',
},
}, null, 2), 'utf8');
}