rfg-config
Version:
Post data generator for RealFaviconGenerator API
155 lines (124 loc) • 5.73 kB
JavaScript
const fs = require('fs');
const PLATFORM_OPTIONS = require('./config/platform-options.json');
const ANDROID_BASE_SIZE = 36;
const IOS_BASE_SIZE = 57;
const IOS_STARTUP_BASE_SIZE = 320;
const COAST_BASE_SIZE = 228;
const FIREFOX_BASE_SIZE = 60;
function each (object, handler) {
Object.keys(object).forEach(key => handler(object[key], key));
}
function preparePlatformOptions (platform, options, baseOptions) {
if (typeof options !== 'object') {
options = {};
}
each(options, (value, key) => {
const platformOptionsRef = PLATFORM_OPTIONS[key];
if (typeof platformOptionsRef === 'undefined' || platformOptionsRef.platforms.indexOf(platform) === -1) {
delete options[key];
}
});
each(PLATFORM_OPTIONS, ({ platforms, defaultTo }, key) => {
if (typeof options[key] === 'undefined' && platforms.indexOf(platform) !== -1) {
options[key] = defaultTo;
}
});
if (typeof options.background === 'boolean') {
if (platform === 'android' && !options.background) {
options.background = 'transparent';
} else {
options.background = baseOptions.background;
}
}
if (platform === 'android' && options.background !== 'transparent') {
options.disableTransparency = true;
}
return options;
}
function processSrc (src) {
let masterPictureObject = {};
if (/^https?:\/\//i.test(src)) {
masterPictureObject.type = 'url';
masterPictureObject.url = src;
}
else {
masterPictureObject.type = 'inline';
masterPictureObject.content = fs.readFileSync(src, { encoding: null }).toString('base64');
}
return masterPictureObject;
}
module.exports = {
defaultConf: require('./config/default'),
createPost (src, options) {
let postData = require('./config/request');
postData.master_picture = processSrc(src);
postData.files_location.path = options.path;
if (options.icons.android) {
const androidOptions = preparePlatformOptions('android', options.icons.android, options);
postData.favicon_design.android_chrome.theme_color = options.background;
postData.favicon_design.android_chrome.manifest.name = options.appName;
postData.favicon_design.android_chrome.manifest.display = options.display;
postData.favicon_design.android_chrome.manifest.orientation = options.orientation;
if (androidOptions.shadow) {
postData.favicon_design.android_chrome.picture_aspect = 'shadow';
} else if (androidOptions.offset > 0 && androidOptions.background) {
postData.favicon_design.android_chrome.picture_aspect = 'background_and_margin';
postData.favicon_design.android_chrome.background_color = androidOptions.background;
postData.favicon_design.android_chrome.margin = Math.round(ANDROID_BASE_SIZE / 100 * androidOptions.offset);
}
} else {
delete postData.favicon_design['android_chrome'];
}
if (options.icons.appleIcon) {
const appleIconOptions = preparePlatformOptions('appleIcon', options.icons.appleIcon, options);
postData.favicon_design.ios.background_color = appleIconOptions.background;
postData.favicon_design.ios.margin = Math.round(IOS_BASE_SIZE / 100 * appleIconOptions.offset);
} else {
delete postData.favicon_design['ios'];
}
if (options.icons.appleIcon && options.icons.appleStartup) {
const appleStartupOptions = preparePlatformOptions('appleStartup', options.icons.appleStartup, options);
postData.favicon_design.ios.startup_image.background_color = appleStartupOptions.background;
postData.favicon_design.ios.startup_image.margin = Math.round(IOS_STARTUP_BASE_SIZE / 100 * appleStartupOptions.offset);
} else if (postData.favicon_design.ios) {
delete postData.favicon_design.ios['startup_image'];
}
if (options.icons.coast) {
const coastOptions = preparePlatformOptions('coast', options.icons.coast, options);
postData.favicon_design.coast.background_color = coastOptions.background;
postData.favicon_design.coast.margin = Math.round(COAST_BASE_SIZE / 100 * coastOptions.offset);
} else {
delete postData.favicon_design['coast'];
}
if (!options.icons.favicons) {
delete postData.favicon_design['desktop_browser'];
}
if (options.icons.firefox) {
const firefoxOptions = preparePlatformOptions('firefox', options.icons.firefox, options);
postData.favicon_design.firefox_app.background_color = firefoxOptions.background;
postData.favicon_design.firefox_app.margin = Math.round(FIREFOX_BASE_SIZE / 100 * firefoxOptions.offset);
postData.favicon_design.firefox_app.manifest.app_name = options.appName;
postData.favicon_design.firefox_app.manifest.app_description = options.appDescription;
postData.favicon_design.firefox_app.manifest.developer_name = options.developerName;
postData.favicon_design.firefox_app.manifest.developer_url = options.developerURL;
} else {
delete postData.favicon_design['firefox_app'];
}
if (options.icons.windows) {
const windowsOptions = preparePlatformOptions('windows', options.icons.windows, options);
postData.favicon_design.windows.background_color = windowsOptions.background;
} else {
delete postData.favicon_design['windows'];
}
if (options.icons.yandex) {
const yandexOptions = preparePlatformOptions('yandex', options.icons.yandex, options);
postData.favicon_design.yandex_browser.background_color = yandexOptions.background;
postData.favicon_design.yandex_browser.manifest.version = options.version;
} else {
delete postData.favicon_design['yandex_browser'];
}
return {
favicon_generation: postData
};
}
};