"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createAndWriteIconsToPathAsync = createAndWriteIconsToPathAsync;
function _path() {
const data = _interopRequireDefault(require("path"));
_path = function () {
return data;
};
return data;
}
function _ExponentTools() {
const data = require("./ExponentTools");
_ExponentTools = function () {
return data;
};
return data;
}
function _ImageUtils() {
const data = require("../tools/ImageUtils");
_ImageUtils = function () {
return data;
};
return data;
}
function _Logger() {
const data = _interopRequireDefault(require("./Logger"));
_Logger = function () {
return data;
};
return data;
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getAppleIconQualifier(iconSize, iconResolution) {
let iconQualifier;
if (iconResolution !== 1) {
// e.g. "29x29@3x"
iconQualifier = `${iconSize}x${iconSize}@${iconResolution}x`;
} else {
iconQualifier = `${iconSize}x${iconSize}`;
}
if (iconSize === 76 || iconSize === 83.5) {
// ipad sizes require ~ipad at the end
iconQualifier = `${iconQualifier}~ipad`;
}
return iconQualifier;
}
async function _saveDefaultIconToPathAsync(context, path) {
if (context.type === 'user') {
const data = context.data;
if (data.exp.icon) {
await (0, _ExponentTools().saveImageToPathAsync)(data.projectPath, data.exp.icon, path);
} else {
throw new Error('Cannot save icon because app.json has no exp.icon key.');
}
} else {
const data = context.data;
if (data.manifest.ios && data.manifest.ios.iconUrl) {
await (0, _ExponentTools().saveUrlToPathAsync)(data.manifest.ios.iconUrl, path);
} else if (data.manifest.iconUrl) {
await (0, _ExponentTools().saveUrlToPathAsync)(data.manifest.iconUrl, path);
} else {
throw new Error('Cannot save icon because manifest has no iconUrl or ios.iconUrl key.');
}
}
}
/**
* Based on keys in the given context.config,
* ensure that the proper iOS icon images exist -- assuming Info.plist already
* points at them under CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles.
*
* This only works on MacOS (as far as I know) because it uses the sips utility.
*/
async function createAndWriteIconsToPathAsync(context, destinationIconPath) {
let defaultIconFilename = 'exp-icon.png';
try {
await _saveDefaultIconToPathAsync(context, _path().default.join(destinationIconPath, defaultIconFilename));
} catch (e) {
defaultIconFilename = null;
_Logger().default.warn(e.message);
}
const iconSizes = [1024, 20, 29, 40, 60, 76, 83.5];
await Promise.all(iconSizes.map(async iconSize => {
let iconResolutions;
if (iconSize === 76) {
// iPad has 1x and 2x icons for this size only
iconResolutions = [1, 2];
} else if (iconSize === 1024) {
// marketing icon is weird
iconResolutions = [1];
} else if (iconSize === 83.5) {
iconResolutions = [2];
} else {
iconResolutions = [2, 3];
} // We need to wait for all of these to finish!
await Promise.all(iconResolutions.map(async iconResolution => {
let iconQualifier = _getAppleIconQualifier(iconSize, iconResolution);
let iconKey = `iconUrl${iconQualifier}`;
let rawIconFilename;
let usesDefault = false;
if (context.type === 'service') {
// TODO(nikki): Support local paths for these icons
const manifest = context.data.manifest;
if (manifest.ios && manifest.ios.hasOwnProperty(iconKey)) {
// manifest specifies an image just for this size/resolution, use that
rawIconFilename = `exp-icon${iconQualifier}.png`;
await (0, _ExponentTools().saveUrlToPathAsync)(manifest.ios[iconKey], `${destinationIconPath}/${rawIconFilename}`);
}
}
if (!rawIconFilename) {
// use default iconUrl
usesDefault = true;
if (defaultIconFilename) {
rawIconFilename = defaultIconFilename;
} else {
_Logger().default.warn(`Project does not specify ios.${iconKey} nor a default iconUrl. Bundle will use the Expo logo.`);
return;
}
}
let iconFilename = `AppIcon${iconQualifier}.png`;
let iconSizePx = iconSize * iconResolution;
await (0, _ExponentTools().spawnAsyncThrowError)('/bin/cp', [rawIconFilename, iconFilename], {
stdio: 'inherit',
cwd: destinationIconPath
});
try {
await (0, _ImageUtils().resizeImageAsync)(iconSizePx, iconFilename, destinationIconPath);
} catch (e) {
throw new Error(`Failed to resize image: ${iconFilename}. (${e})`);
} // reject non-square icons (because Apple will if we don't)
const dims = await (0, _ImageUtils().getImageDimensionsAsync)(destinationIconPath, iconFilename);
if (!dims) {
throw new Error(`Unable to read the dimensions of ${iconFilename}`);
} else if (dims.width !== dims.height) {
throw new Error(`iOS icons must be square, the dimensions of ${iconFilename} are ${dims}`);
}
if (!usesDefault) {
// non-default icon used, clean up the downloaded version
await (0, _ExponentTools().spawnAsyncThrowError)('/bin/rm', [_path().default.join(destinationIconPath, rawIconFilename)]);
}
}));
})); // clean up default icon
if (defaultIconFilename) {
await (0, _ExponentTools().spawnAsyncThrowError)('/bin/rm', [_path().default.join(destinationIconPath, defaultIconFilename)]);
}
}
//# sourceMappingURL=../__sourcemaps__/detach/IosIcons.js.map