atriusmaps-node-sdk
Version:
This project provides an API to Atrius Personal Wayfinder maps within a Node environment. See the README.md for more information
161 lines (135 loc) • 5.92 kB
JavaScript
;
var postprocMolUrlParms = require('../src/configs/postproc-mol-url-parms.js');
var postprocStateTracking = require('../src/configs/postproc-stateTracking.js');
var funcs = require('../src/utils/funcs.js');
function prepareSDKConfig (sc) {
const {
name, debug, headless, theme, defaultSearchTerms, venueId, accountId,
poiCategories, preserveStateInURL, supportURLDeepLinks, initState,
deepLinkParms, uiHide, renderDiv, parentConfig, desktopViewMinWidth,
forceDesktop, hostAppId, hostAppVersion, hostAppProperties, logFilter,
searchPlaceholder, dataFetch, engineName, dynamicPoisUrlBaseV1, plugins,
anaytics2ActiveFlag, enablePoiSelection, minZoom, maxZoom, noLangOptions,
pinnedLocation, pinnedLocationZoom, pinnedLocationFocusAtStart
} = sc;
const extendsConfig = parentConfig ? [parentConfig] : (headless ? ['sdkHeadless'] : ['sdkVisual']);
const trunc = (str, len) => str && str.length > len ? str.substring(0, len) : str;
const validateHostAppId = hostAppId => hostAppId ? trunc(hostAppId.toString(), 128) : undefined;
const validateHostAppVersion = hostAppVersion => hostAppVersion ? trunc(hostAppVersion.toString(), 128) : undefined;
const validateHostAppProperties = hostAppProperties => {
if (!hostAppProperties || typeof hostAppProperties !== 'object')
return undefined
const ret = { }; // lets build this back up ourselves to ensure its purity
const keys = Object.keys(hostAppProperties);
if (keys.length > 10)
keys.length = 10;
keys.forEach(key => {
let cleanKey = trunc(key.toString().replaceAll(/[^a-zA-Z0-9_]/g, ''), 128);
if (!cleanKey.match(/^[a-zA-Z]+/))
cleanKey = 'X' + cleanKey; // force to start with alpha char
let cleanVal = hostAppProperties[key];
if (cleanVal === null || cleanVal === undefined)
cleanVal = '';
cleanVal = trunc(cleanVal.toString(), 128);
ret[cleanKey] = cleanVal;
});
return ret
};
const config = {
name,
engineName,
extends: extendsConfig,
debug,
logFilter,
theme,
uiHide,
renderDiv,
configPostProc: [],
plugins: {
venueDataLoader: {
dataFetch,
venueId,
accountId
},
sdkServer: {
headless
},
analytics2: {
hostAppId: validateHostAppId(hostAppId),
hostAppVersion: validateHostAppVersion(hostAppVersion),
hostAppProperties: validateHostAppProperties(hostAppProperties)
}
},
uuid: typeof (document) !== 'undefined' && document && document.location ? document.location.host : 'unknown' // used in analytics
};
if (anaytics2ActiveFlag !== undefined)
config.plugins.analytics2.active = anaytics2ActiveFlag;
// return an object with the named property set to the specified value, unless the
// value is undefined, then return an empty object
const setIfDef = (name, value) => value !== undefined ? { [name]: value } : { };
if (!headless) {
config.plugins['online/headerOnline'] = { searchPlaceholder };
config.plugins.mapRenderer = {
...setIfDef('enablePoiSelection', enablePoiSelection),
viewLimits: {
...setIfDef('maxZoom', maxZoom),
...setIfDef('minZoom', minZoom)
}
};
config.plugins.userMenu = { noLangOptions };
if (pinnedLocation)
config.plugins['online/pinnedLocation'] = { location: pinnedLocation, zoom: pinnedLocationZoom, focusAtStart: pinnedLocationFocusAtStart };
}
config.plugins.searchService = defaultSearchTerms
? { defaultSearchTerms }
: { };
handleI18NParm(sc, 'defaultSearchTerms', config.plugins.searchService);
if (extendsConfig.includes('sdkVisual')) {
if (poiCategories)
config.plugins['online/homeView'] = { poiCategories };
else
config.plugins['online/homeView'] = { };
handleI18NParm(sc, 'poiCategories', config.plugins['online/homeView']);
}
// Allow *specific* additional plugins
// for now, this is just for internal use
if (plugins) {
if (plugins.draw)
config.plugins.draw = plugins.draw;
// To get flight status working, one needs 3 plugins. This is a bad design, there should just be one and it provides
// all 3 of these services. Lets migrate to a single plugin at some point - but until then, lets at least make it look
// like a single plugin for SDK users. The only plugin that currently has configurable properties is "flightStatus" - so
// lets let SDK users define that one and its single property (apiKey) and we'll just create the other two by default.
if (plugins.flightStatus) {
config.plugins.flightStatus = plugins.flightStatus;
config.plugins['online/flightDetails'] = { }; // these really shouldn't be separate plugins (!)
config.plugins['online/flightDetailsSearch'] = { }; // these really shouldn't be separate plugins (!)
}
}
if (preserveStateInURL) {
config.configPostProc.push('stateTracking');
config.plugins.deepLinking = { trackURL: true };
}
if (supportURLDeepLinks)
config.configPostProc.push('mol-url-parms');
if (initState)
postprocStateTracking.setStateFromStateString(config, atob(initState), true);
if (deepLinkParms)
postprocMolUrlParms.setDeepLinksForParms(config, new URLSearchParams(deepLinkParms), true);
if (desktopViewMinWidth !== undefined)
config.desktopViewMinWidth = desktopViewMinWidth;
if (forceDesktop)
config.desktopViewMinWidth = 0;
if (dynamicPoisUrlBaseV1) {
config.plugins.dynamicPois = {
urlBaseV1: dynamicPoisUrlBaseV1
};
}
return funcs.filterOb((k, v) => v !== undefined, config) // remove any undefined values
}
function handleI18NParm (sdkConfig, prefix, configDest) {
Object.keys(sdkConfig)
.filter(key => key.startsWith(prefix + '-'))
.forEach(key => (configDest[key] = sdkConfig[key]));
}
module.exports = prepareSDKConfig;