GT2/GT2-iOS/node_modules/xdl/build/detach/IosIcons.js

261 lines
9.8 KiB
JavaScript
Raw Normal View History

2018-02-12 17:26:06 +00:00
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.setGetImageDimensionsFunction = exports.setResizeImageFunction = exports.getImageDimensionsMacOSAsync = exports.createAndWriteIconsToPathAsync = undefined;
let _saveDefaultIconToPathAsync = (() => {
var _ref = _asyncToGenerator(function* (context, path) {
if (context.type === 'user') {
if (context.data.exp.icon) {
yield (0, (_ExponentTools || _load_ExponentTools()).saveImageToPathAsync)(context.data.projectPath, context.data.exp.icon, path);
} else {
throw new Error('Cannot save icon because app.json has no exp.icon key.');
}
} else {
if (context.data.manifest.ios && context.data.manifest.ios.iconUrl) {
yield (0, (_ExponentTools || _load_ExponentTools()).saveUrlToPathAsync)(context.data.manifest.ios.iconUrl, path);
} else if (context.data.manifest.iconUrl) {
yield (0, (_ExponentTools || _load_ExponentTools()).saveUrlToPathAsync)(context.data.manifest.iconUrl, path);
} else {
throw new Error('Cannot save icon because manifest has no iconUrl or ios.iconUrl key.');
}
}
return;
});
return function _saveDefaultIconToPathAsync(_x, _x2) {
return _ref.apply(this, arguments);
};
})();
/**
* 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.
*/
let createAndWriteIconsToPathAsync = (() => {
var _ref2 = _asyncToGenerator(function* (context, destinationIconPath) {
if (process.platform !== 'darwin' && _resizeImageAsync === _resizeImageWithSipsAsync) {
console.warn('`sips` utility may or may not work outside of macOS');
}
let defaultIconFilename = 'exp-icon.png';
try {
yield _saveDefaultIconToPathAsync(context, _path.default.join(destinationIconPath, defaultIconFilename));
} catch (e) {
defaultIconFilename = null;
console.warn(e.message);
}
const iconSizes = [1024, 20, 29, 40, 60, 76, 83.5];
yield Promise.all(iconSizes.map((() => {
var _ref3 = _asyncToGenerator(function* (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!
yield Promise.all(iconResolutions.map((() => {
var _ref4 = _asyncToGenerator(function* (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`;
yield (0, (_ExponentTools || _load_ExponentTools()).saveUrlToPathAsync)(manifest.ios[iconKey], `${destinationIconPath}/${rawIconFilename}`);
}
}
if (!rawIconFilename) {
// use default iconUrl
usesDefault = true;
if (defaultIconFilename) {
rawIconFilename = defaultIconFilename;
} else {
console.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;
yield (0, (_ExponentTools || _load_ExponentTools()).spawnAsyncThrowError)('/bin/cp', [rawIconFilename, iconFilename], {
stdio: 'inherit',
cwd: destinationIconPath
});
try {
yield _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 = yield getImageDimensionsMacOSAsync(destinationIconPath, iconFilename);
if (!dims || dims.length < 2 || dims[0] !== dims[1]) {
if (!dims) {
throw new Error(`Unable to read the dimensions of ${iconFilename}`);
} else {
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
yield (0, (_ExponentTools || _load_ExponentTools()).spawnAsyncThrowError)('/bin/rm', [_path.default.join(destinationIconPath, rawIconFilename)]);
}
});
return function (_x6) {
return _ref4.apply(this, arguments);
};
})()));
});
return function (_x5) {
return _ref3.apply(this, arguments);
};
})()));
// clean up default icon
if (defaultIconFilename) {
yield (0, (_ExponentTools || _load_ExponentTools()).spawnAsyncThrowError)('/bin/rm', [_path.default.join(destinationIconPath, defaultIconFilename)]);
}
return;
});
return function createAndWriteIconsToPathAsync(_x3, _x4) {
return _ref2.apply(this, arguments);
};
})();
/**
* @return array [ width, height ] or null if that fails for some reason.
*/
let getImageDimensionsMacOSAsync = (() => {
var _ref5 = _asyncToGenerator(function* (dirname, basename) {
if (process.platform !== 'darwin') {
console.warn('`sips` utility may or may not work outside of macOS');
}
let dimensions = null;
try {
dimensions = yield _getImageDimensionsAsync(basename, dirname);
} catch (_) {}
return dimensions;
});
return function getImageDimensionsMacOSAsync(_x7, _x8) {
return _ref5.apply(this, arguments);
};
})();
let _resizeImageWithSipsAsync = (() => {
var _ref6 = _asyncToGenerator(function* (iconSizePx, iconFilename, destinationIconPath) {
return (0, (_ExponentTools || _load_ExponentTools()).spawnAsyncThrowError)('sips', ['-Z', iconSizePx, iconFilename], {
stdio: ['ignore', 'ignore', 'inherit'], // only stderr
cwd: destinationIconPath
});
});
return function _resizeImageWithSipsAsync(_x9, _x10, _x11) {
return _ref6.apply(this, arguments);
};
})();
let _getImageDimensionsWithSipsAsync = (() => {
var _ref7 = _asyncToGenerator(function* (basename, dirname) {
let childProcess = yield (0, (_ExponentTools || _load_ExponentTools()).spawnAsyncThrowError)('sips', ['-g', 'pixelWidth', '-g', 'pixelHeight', basename], {
cwd: dirname
});
// stdout looks something like 'pixelWidth: 1200\n pixelHeight: 800'
const components = childProcess.stdout.split(/(\s+)/);
return components.map(function (c) {
return parseInt(c, 10);
}).filter(function (n) {
return !isNaN(n);
});
});
return function _getImageDimensionsWithSipsAsync(_x12, _x13) {
return _ref7.apply(this, arguments);
};
})();
// Allow us to swap out the default implementations of image functions
var _path = _interopRequireDefault(require('path'));
var _ExponentTools;
function _load_ExponentTools() {
return _ExponentTools = require('./ExponentTools');
}
var _StandaloneContext;
function _load_StandaloneContext() {
return _StandaloneContext = _interopRequireDefault(require('./StandaloneContext'));
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
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;
}
let _resizeImageAsync = _resizeImageWithSipsAsync;
let _getImageDimensionsAsync = _getImageDimensionsWithSipsAsync;
// Allow users to provide an alternate implementation for our image resize function.
// This is used internally in order to use sharp instead of sips in standalone builder.
function setResizeImageFunction(fn) {
_resizeImageAsync = fn;
}
// Allow users to provide an alternate implementation for our image dimensions function.
// This is used internally in order to use sharp instead of sips in standalone builder.
function setGetImageDimensionsFunction(fn) {
_getImageDimensionsAsync = fn;
}
exports.createAndWriteIconsToPathAsync = createAndWriteIconsToPathAsync;
exports.getImageDimensionsMacOSAsync = getImageDimensionsMacOSAsync;
exports.setResizeImageFunction = setResizeImageFunction;
exports.setGetImageDimensionsFunction = setGetImageDimensionsFunction;
//# sourceMappingURL=../__sourcemaps__/detach/IosIcons.js.map