UNPKG

@cause-911/core

Version:

Run `npm install @cause-911/core --save` to add this library to your project

153 lines 17.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ export class OperatingSystem { constructor() { this.name = 'unknown'; this.version = 'unknown'; this.agent = (typeof (navigator) === 'object' ? navigator.userAgent.toLowerCase() : ''); this.detect(); } /** * @return {?} */ toString() { return `OS: ${this.name} (${this.version})`; } /** * @private * @return {?} */ detect() { /** @type {?} */ const os = [ { name: 'iOS', pattern: /iphone|ipad|ipod/ }, { name: 'Android', pattern: /android/ }, { name: 'Blackberry', pattern: /blackberry/ }, { name: 'Windows', pattern: /win/ }, { name: 'Chrome OS', pattern: /cros/ }, { name: 'Mac OS', pattern: /mac/ }, { name: 'Linux', pattern: /linux|x11/ }, { name: 'Open BSD', pattern: /openbsd/ }, { name: 'Unix', pattern: /unix/ }, { name: 'Sun OS', pattern: /sunos/ }, { name: 'beOS', pattern: /beos/ }, { name: 'QNX', pattern: /qnx/ }, { name: 'os2', pattern: /os\/2/ } ]; for (let i = 0, j = os.length; i < j; i++) { if (this.agent.match(os[i].pattern)) { this.name = os[i].name; break; } } this.detectVersion(); } /** * @private * @return {?} */ detectVersion() { if (this.name === 'Windows') { if (this.agent.match(/phone/)) { this.detectVersionWindowsPhone(); } else { this.detectVersionWindows(); } } else if (this.name === 'Mac OS') { this.detectVersionMac(); } else if (this.name === 'Android') { /** @type {?} */ const androidVersion = this.agent.match(/android ([0-9\.]+)/); this.version = (androidVersion ? ' ' + androidVersion[1] : ''); } else if (this.name === 'iOS') { /** @type {?} */ const iOSVersion = this.agent.match(/os ([0-9\_]+)/); this.version = (iOSVersion ? ' ' + iOSVersion[1].replace('_', '.') : ''); } } /** * @private * @return {?} */ detectVersionWindows() { this.name = 'Windows'; /** @type {?} */ const windows = [ { name: '10', pattern: /windows nt 10.0|windows 10.0/ }, { name: '10 Technical Preview', pattern: /windows nt 6.4/ }, { name: '8.1', pattern: /windows nt 6.3|windows 8.1/ }, { name: '8', pattern: /windows nt 6.2|windows 8.0|wow64/ }, { name: '7 / Server 2008 RC2', pattern: /windows nt 6.1|windows 7/ }, { name: 'Vista', pattern: /windows nt 6.0/ }, { name: 'Server 2003', pattern: /windows nt 5.2/ }, { name: 'XP', pattern: /windows nt 5.1|windows xp/ }, { name: '2000', pattern: /windows nt 5.0|windows 2000/ }, { name: 'NT 4.0', pattern: /windows nt 4.0|winnt4.0|winnt|windows nt/ }, { name: 'CE', pattern: /windows ce/ }, { name: 'ME', pattern: /windows me/ }, { name: '98', pattern: /windows 98|win98/ }, { name: '95', pattern: /windows 95|win95|windows_95/ }, { name: '3.11', pattern: /win16/ } ]; for (let i = 0, j = windows.length; i < j; i++) { if (this.agent.match(windows[i].pattern)) { this.version = windows[i].name; break; } } } /** * @private * @return {?} */ detectVersionWindowsPhone() { this.name = 'Windows Phone'; /** @type {?} */ const windows = [ { name: '10', pattern: /windows phone 10/ }, { name: '8.1', pattern: /windows phone 8.1/ }, { name: '8', pattern: /windows phone 8/ }, { name: '7.5', pattern: /windows phone os 7.5/ }, { name: '7', pattern: /windows phone os 7/ }, ]; for (let i = 0, j = windows.length; i < j; i++) { if (this.agent.match(windows[i].pattern)) { this.version = windows[i].name; break; } } } /** * @private * @return {?} */ detectVersionMac() { if (this.agent.match(/mac os x/)) { /** @type {?} */ const macVersion = this.agent.match(/mac os x ([0-9\_]+)/); this.name = 'Mac OS X'; this.version = (macVersion ? ' ' + macVersion[1].replace('_', '.') : ''); } else if (this.agent.match(/macppc|macintel|mac_powerpc|macintosh/)) { this.name = 'Mac OS'; } } } if (false) { /** @type {?} */ OperatingSystem.prototype.name; /** @type {?} */ OperatingSystem.prototype.version; /** * @type {?} * @private */ OperatingSystem.prototype.agent; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW5nLXN5c3RlbS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjYXVzZS05MTEvY29yZS8iLCJzb3VyY2VzIjpbImxpYi9zaGFyZWQvY2xhc3Nlcy9vcGVyYXRpbmctc3lzdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxNQUFNLE9BQU8sZUFBZTtJQU14QjtRQUxBLFNBQUksR0FBRyxTQUFTLENBQUM7UUFDakIsWUFBTyxHQUFHLFNBQVMsQ0FBQztRQUVaLFVBQUssR0FBRyxDQUFDLE9BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFDO1FBR3ZGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDOzs7O0lBRUQsUUFBUTtRQUNKLE9BQU8sT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQztJQUNoRCxDQUFDOzs7OztJQUVPLE1BQU07O2NBQ0osRUFBRSxHQUFHO1lBQ1AsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBQztZQUMxQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBQztZQUNyQyxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBQztZQUMzQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQztZQUNqQyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBQztZQUNwQyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQztZQUNoQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBQztZQUNyQyxFQUFDLElBQUksRUFBRSxVQUFV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bnQiOlsiZXhwb3J0IGNsYXNzIE9wZXJhdGluZ1N5c3RlbSB7XG4gICAgbmFtZSA9ICd1bmtub3duJztcbiAgICB2ZXJzaW9uID0gJ3Vua25vd24nO1xuXG4gICAgcHJpdmF0ZSBhZ2VudCA9ICh0eXBlb2YobmF2aWdhdG9yKSA9PT0gJ29iamVjdCcgPyBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkgOiAnJyApO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZGV0ZWN0KCk7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBPUzogJHt0aGlzLm5hbWV9ICgke3RoaXMudmVyc2lvbn0pYDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRldGVjdCgpIHtcbiAgICAgICAgY29uc3Qgb3MgPSBbXG4gICAgICAgICAgICB7bmFtZTogJ2lPUycsIHBhdHRlcm46IC9pcGhvbmV8aXBhZHxpcG9kL30sXG4gICAgICAgICAgICB7bmFtZTogJ0FuZHJvaWQnLCBwYXR0ZXJuOiAvYW5kcm9pZC99LFxuICAgICAgICAgICAge25hbWU6ICdCbGFja2JlcnJ5JywgcGF0dGVybjogL2JsYWNrYmVycnkvfSxcbiAgICAgICAgICAgIHtuYW1lOiAnV2luZG93cycsIHBhdHRlcm46IC93aW4vfSxcbiAgICAgICAgICAgIHtuYW1lOiAnQ2hyb21lIE9TJywgcGF0dGVybjogL2Nyb3MvfSxcbiAgICAgICAgICAgIHtuYW1lOiAnTWFjIE9TJywgcGF0dGVybjogL21hYy99LFxuICAgICAgICAgICAge25hbWU6ICdMaW51eCcsIHBhdHRlcm46IC9saW51eHx4MTEvfSxcbiAgICAgICAgICAgIHtuYW1lOiAnT3BlbiBCU0QnLCBwYXR0ZXJuOiAvb3BlbmJzZC99LFxuICAgICAgICAgICAge25hbWU6ICdVbml4JywgcGF0dGVybjogL3VuaXgvfSxcbiAgICAgICAgICAgIHtuYW1lOiAnU3VuIE9TJywgcGF0dGVybjogL3N1bm9zL30sXG4gICAgICAgICAgICB7bmFtZTogJ2JlT1MnLCBwYXR0ZXJuOiAvYmVvcy99LFxuICAgICAgICAgICAge25hbWU6ICdRTlgnLCBwYXR0ZXJuOiAvcW54L30sXG4gICAgICAgICAgICB7bmFtZTogJ29zMicsIHBhdHRlcm46IC9vc1xcLzIvfVxuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gb3MubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hZ2VudC5tYXRjaChvc1tpXS5wYXR0ZXJuKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG9zW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRldGVjdFZlcnNpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRldGVjdFZlcnNpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLm5hbWUgPT09ICdXaW5kb3dzJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWdlbnQubWF0Y2goL3Bob25lLykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRldGVjdFZlcnNpb25XaW5kb3dzUGhvbmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXRlY3RWZXJzaW9uV2luZG93cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmFtZSA9PT0gJ01hYyBPUycpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0ZWN0VmVyc2lvbk1hYygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmFtZSA9PT0gJ0FuZHJvaWQnKSB7XG4gICAgICAgICAgICBjb25zdCBhbmRyb2lkVmVyc2lvbiA9IHRoaXMuYWdlbnQubWF0Y2goL2FuZHJvaWQgKFswLTlcXC5dKykvKTtcblxuICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gKGFuZHJvaWRWZXJzaW9uID8gJyAnICsgYW5kcm9pZFZlcnNpb25bMV0gOiAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5uYW1lID09PSAnaU9TJykge1xuICAgICAgICAgICAgY29uc3QgaU9TVmVyc2lvbiA9IHRoaXMuYWdlbnQubWF0Y2goL29zIChbMC05XFxfXSspLyk7XG5cbiAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IChpT1NWZXJzaW9uID8gJyAnICsgaU9TVmVyc2lvblsxXS5yZXBsYWNlKCdfJywgJy4nKSA6ICcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGV0ZWN0VmVyc2lvbldpbmRvd3MoKSB7XG4gICAgICAgIHRoaXMubmFtZSA9ICdXaW5kb3dzJztcblxuICAgICAgICBjb25zdCB3aW5kb3dzID0gW1xuICAgICAgICAgICAge25hbWU6ICcxMCcsIHBhdHRlcm46IC93aW5kb3dzIG50IDEwLjB8d2luZG93cyAxMC4wL30sXG4gICAgICAgICAgICB7bmFtZTogJzEwIFRlY2huaWNhbCBQcmV2aWV3JywgcGF0dGVybjogL3dpbmRvd3MgbnQgNi40L30sXG4gICAgICAgICAgICB7bmFtZTogJzguMScsIHBhdHRlcm46IC93aW5kb3dzIG50IDYuM3x3aW5kb3dzIDguMS99LFxuICAgICAgICAgICAge25hbWU6ICc4JywgcGF0dGVybjogL3dpbmRvd3MgbnQgNi4yfHdpbmRvd3MgOC4wfHdvdzY0L30sXG4gICAgICAgICAgICB7bmFtZTogJzcgLyBTZXJ2ZXIgMjAwOCBSQzInLCBwYXR0ZXJuOiAvd2luZG93cyBudCA2LjF8d2luZG93cyA3L30sXG4gICAgICAgICAgICB7bmFtZTogJ1Zpc3RhJywgcGF0dGVybjogL3dpbmRvd3MgbnQgNi4wL30sXG4gICAgICAgICAgICB7bmFtZTogJ1NlcnZlciAyMDAzJywgcGF0dGVybjogL3dpbmRvd3MgbnQgNS4yL30sXG4gICAgICAgICAgICB7bmFtZTogJ1hQJywgcGF0dGVybjogL3dpbmRvd3MgbnQgNS4xfHdpbmRvd3MgeHAvfSxcbiAgICAgICAgICAgIHtuYW1lOiAnMjAwMCcsIHBhdHRlcm46IC93aW5kb3dzIG50IDUuMHx3aW5kb3dzIDIwMDAvfSxcbiAgICAgICAgICAgIHtuYW1lOiAnTlQgNC4wJywgcGF0dGVybjogL3dpbmRvd3MgbnQgNC4wfHdpbm50NC4wfHdpbm50fHdpbmRvd3MgbnQvfSxcbiAgICAgICAgICAgIHtuYW1lOiAnQ0UnLCBwYXR0ZXJuOiAvd2luZG93cyBjZS99LFxuICAgICAgICAgICAge25hbWU6ICdNRScsIHBhdHRlcm46IC93aW5kb3dzIG1lL30sXG4gICAgICAgICAgICB7bmFtZTogJzk4JywgcGF0dGVybjogL3dpbmRvd3MgOTh8d2luOTgvfSxcbiAgICAgICAgICAgIHtuYW1lOiAnOTUnLCBwYXR0ZXJuOiAvd2luZG93cyA5NXx3aW45NXx3aW5kb3dzXzk1L30sXG4gICAgICAgICAgICB7bmFtZTogJzMuMTEnLCBwYXR0ZXJuOiAvd2luMTYvfVxuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gd2luZG93cy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFnZW50Lm1hdGNoKHdpbmRvd3NbaV0ucGF0dGVybikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB3aW5kb3dzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRldGVjdFZlcnNpb25XaW5kb3dzUGhvbmUoKSB7XG4gICAgICAgIHRoaXMubmFtZSA9ICdXaW5kb3dzIFBob25lJztcblxuICAgICAgICBjb25zdCB3aW5kb3dzID0gW1xuICAgICAgICAgICAge25hbWU6ICcxMCcsIHBhdHRlcm46IC93aW5kb3dzIHBob25lIDEwL30sXG4gICAgICAgICAgICB7bmFtZTogJzguMScsIHBhdHRlcm46IC93aW5kb3dzIHBob25lIDguMS99LFxuICAgICAgICAgICAge25hbWU6ICc4JywgcGF0dGVybjogL3dpbmRvd3MgcGhvbmUgOC99LFxuICAgICAgICAgICAge25hbWU6ICc3LjUnLCBwYXR0ZXJuOiAvd2luZG93cyBwaG9uZSBvcyA3LjUvfSxcbiAgICAgICAgICAgIHtuYW1lOiAnNycsIHBhdHRlcm46IC93aW5kb3dzIHBob25lIG9zIDcvfSxcbiAgICAgICAgXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IHdpbmRvd3MubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hZ2VudC5tYXRjaCh3aW5kb3dzW2ldLnBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gd2luZG93c1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXRlY3RWZXJzaW9uTWFjKCkge1xuICAgICAgICBpZiAodGhpcy5hZ2VudC5tYXRjaCgvbWFjIG9zIHgvKSkge1xuICAgICAgICAgICAgY29uc3QgbWFjVmVyc2lvbiA9IHRoaXMuYWdlbnQubWF0Y2goL21hYyBvcyB4IChbMC05XFxfXSspLyk7XG5cbiAgICAgICAgICAgIHRoaXMubmFtZSA9ICdNYWMgT1MgWCc7XG4gICAgICAgICAgICB0aGlzLnZlcnNpb24gPSAobWFjVmVyc2lvbiA/ICcgJyArIG1hY1ZlcnNpb25bMV0ucmVwbGFjZSgnXycsICcuJykgOiAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hZ2VudC5tYXRjaCgvbWFjcHBjfG1hY2ludGVsfG1hY19wb3dlcnBjfG1hY2ludG9zaC8pKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAnTWFjIE9TJztcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==