pwabuilder-lib
Version:
PWA Builder Core Library
113 lines (91 loc) • 3.28 kB
JavaScript
// App manifest must contain the following fields (if publishing to Firefox Marketplace):
// - name
// - description
// - launch_path(for Packaged Apps)
// - icons (1 icon of 128x128 required, 1 icon of 512x512 recommended)
// - developer
// - default_locale (if locales is defined)
// - type (for privileged and internal(certified) apps)
// App manifest must contain the following fields (if NOT publishing to Firefox Marketplace):
// - name
// - description
// - icons (1 icon of 128x128 required, 1 icon of 512x512 recommended)
var c = require('../../constants');
function convertToBase(manifestInfo, callback) {
if (!manifestInfo || !manifestInfo.content) {
return callback(new Error('Manifest content is empty or not initialized.'));
}
var originalManifest = manifestInfo.content;
var manifest = {
'start_url': originalManifest.launch_path || '/',
'name': originalManifest.description,
'short_name': originalManifest.name
};
var icons = [];
for (var size in originalManifest.icons) {
if (originalManifest.icons.hasOwnProperty(size)) {
icons.push({
'sizes' : size + 'x' + size,
'src': originalManifest.icons[size]
});
}
}
manifest.icons = icons;
var convertedManifestInfo = {
'content': manifest,
'format': c.BASE_MANIFEST_FORMAT
};
return callback(undefined, convertedManifestInfo);
}
var requiredRootProperties = ['name', 'version', 'app'];
var validRootProperties = ['name', 'description', 'version', 'app',
'background_page', 'icons', 'key',
'minimum_chrome_version', 'offline_enabled',
'permissions', 'update_url'];
var validAppProperties = ['urls', 'launch'];
var validAppLaunchProperties = ['web_url', 'container', 'height', 'width'];
function matchFormat(manifestObj) {
var lowercasePropName;
// check required fields
for (var i = 0; i < requiredRootProperties.length; i++) {
if (!manifestObj.hasOwnProperty(requiredRootProperties[i])) {
return false;
}
}
if (!manifestObj.app.hasOwnProperty('launch') ||
!manifestObj.app.launch.hasOwnProperty('web_url')) {
return false;
}
for (var prop in manifestObj) {
if (manifestObj.hasOwnProperty(prop)) {
lowercasePropName = prop.toLowerCase();
if (validRootProperties.indexOf(lowercasePropName) === -1) {
return false;
}
}
if (lowercasePropName === 'app') {
for (var appProp in manifestObj.app) {
if (manifestObj.app.hasOwnProperty(appProp)) {
if (validAppProperties.indexOf(appProp) === -1) {
return false;
}
if (appProp === 'launch') {
for (var appLaunchProp in manifestObj.app.launch) {
if (manifestObj.app.launch.hasOwnProperty(appLaunchProp)) {
if (validAppLaunchProperties.indexOf(appLaunchProp) === -1) {
return false;
}
}
}
}
}
}
}
}
return true;
}
module.exports = {
convertToBase: convertToBase,
matchFormat: matchFormat
};
;