react-native-svg-app-icon
Version:
App icon generator for React Native projects
157 lines (141 loc) • 4.17 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.generate = generate;
var fse = _interopRequireWildcard(require("fs-extra"));
var path = _interopRequireWildcard(require("path"));
var input = _interopRequireWildcard(require("./input"));
var output = _interopRequireWildcard(require("./output"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
const iosIcons = [{
idiom: "iphone",
scale: 2,
size: 20
}, {
idiom: "iphone",
scale: 3,
size: 20
}, {
idiom: "iphone",
scale: 2,
size: 29
}, {
idiom: "iphone",
scale: 3,
size: 29
}, {
idiom: "iphone",
scale: 2,
size: 40
}, {
idiom: "iphone",
scale: 3,
size: 40
}, {
idiom: "iphone",
scale: 2,
size: 60
}, {
idiom: "iphone",
scale: 3,
size: 60
}, {
idiom: "ipad",
scale: 1,
size: 20
}, {
idiom: "ipad",
scale: 2,
size: 20
}, {
idiom: "ipad",
scale: 1,
size: 29
}, {
idiom: "ipad",
scale: 2,
size: 29
}, {
idiom: "ipad",
scale: 1,
size: 40
}, {
idiom: "ipad",
scale: 2,
size: 40
}, {
idiom: "ipad",
scale: 1,
size: 76
}, {
idiom: "ipad",
scale: 2,
size: 76
}, {
idiom: "ipad",
scale: 2,
size: 83.5
}, {
idiom: "ios-marketing",
scale: 1,
size: 1024,
flattenAlpha: true
}];
async function* generate(config, fileInput) {
const fullConfig = await getConfig(config);
yield* generateImages(fullConfig, fileInput);
yield* generateManifest(fullConfig);
}
async function getConfig(config) {
return {
iosOutputPath: config.iosOutputPath || (await getIconsetDir()),
force: config.force || false
};
}
async function getIconsetDir() {
for (const fileName of await fse.readdir("ios")) {
const testPath = path.join("ios", fileName, "Images.xcassets");
if ((await fse.pathExists(testPath)) && (await fse.stat(testPath)).isDirectory) {
return path.join(testPath, "AppIcon.appiconset");
}
}
throw new Error("No Images.xcassets found under ios/ subdirectories");
}
async function* generateImages(config, fileInput) {
yield* output.genaratePngs({ ...input.mapInput(fileInput, inputData => ({
baseImage: inputData.backgroundImageData,
operations: [{
type: "composite",
file: inputData.foregroundImageData.data
}, {
type: "remove-alpha"
}]
})),
cropSize: input.inputContentSize
}, iosIcons.map(icon => ({
filePath: path.join(config.iosOutputPath, getIconFilename(icon)),
flattenAlpha: icon.flattenAlpha,
outputSize: icon.size * icon.scale,
force: config.force
})));
}
async function* generateManifest(config) {
const fileName = path.join(config.iosOutputPath, "Contents.json");
yield* output.ensureFileContents(fileName, {
images: iosIcons.map(icon => ({
filename: getIconFilename(icon),
idiom: icon.idiom,
scale: `${icon.scale}x`,
size: `${icon.size}x${icon.size}`
})),
info: {
author: "react-native-svg-app-icon",
version: 1
}
}, config);
}
function getIconFilename(icon) {
return `${icon.idiom}-${icon.size}@${icon.scale}x.png`;
}
;