in packages/fxa-shared/lib/user-agent.ts [85:156]
osVersion: safeReturnVersion(matches[5]),
deviceType: marshallDeviceType(matches[4]),
formFactor: safeReturnName(matches[4]),
};
}
const parsed = parse(userAgentString);
return {
browser: safeReturnName(getFamily(parsed.ua)),
browserVersion: safeReturnVersion(parsed.ua.toVersionString()),
os: safeReturnName(getFamily(parsed.os)),
osVersion: safeReturnVersion(parsed.os.toVersionString()),
deviceType: getDeviceType(parsed) || null,
formFactor: safeReturnName(getFormFactor(parsed)),
};
};
export const isToVersionStringSupported = (
result: ParsedUserAgentProperties
): boolean => {
if (!result) {
result = parse(
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0'
);
}
if (!result || !result.os || !result.ua) {
return false;
}
if (typeof result.os.toVersionString !== 'function') {
return false;
}
if (typeof result.ua.toVersionString !== 'function') {
return false;
}
return true;
};
function safeReturnString(str: string, regex: RegExp): string | null {
return regex.test(str) ? str : null;
}
function safeReturnName(str: string): string | null {
return safeReturnString(str, VALID_FAMILY_OR_NAME);
}
function safeReturnVersion(str: string): string | null {
return safeReturnString(str, VALID_VERSION);
}
function safeFamily(parent: ParsedUa) {
if (!VALID_FAMILY_OR_NAME.test(parent.family as string)) {
parent.family = null;
}
}
function safeVersion(parent: ParsedOs) {
if (
parent &&
parent.toVersionString &&
!VALID_VERSION.test(parent.toVersionString())
) {
parent.major = parent.minor = parent.patch = parent.patchMinor = null;
}
}
function getFamily(data: ParsedUa | ParsedOs | ParsedDevice) {
return data.family && data.family !== 'Other' ? data.family : '';
}
function getDeviceType(data: ParsedUserAgentProperties) {
if (getFamily(data.device) || isMobileOS(data)) {
if (isTablet(data)) {