Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions packages/devextreme/js/__internal/core/utils/browser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { extend } from '@js/core/utils/extend';
import { getNavigator } from '@js/core/utils/window';

export type BrowserName = 'webkit' | 'chrome' | 'mozilla' | 'safari' | 'unknown';

export type BrowserInfo = Partial<Record<BrowserName, boolean>> & {
version?: string;
};

export type Browser = BrowserInfo & {
_fromUA: (userAgent: string) => BrowserInfo;
};

const navigator = getNavigator();

const webkitRegExp = /(webkit)[ /]([\w.]+)/;
const mozillaRegExp = /(mozilla)(?:.*? rv:([\w.]+))/;

const browserFromUA = (userAgent: string): BrowserInfo => {
const ua = userAgent.toLowerCase();

const result: BrowserInfo = {};
const matches = webkitRegExp.exec(ua)
?? (!ua.includes('compatible') ? mozillaRegExp.exec(ua) : null)
?? [];
let browserName = matches[1] as BrowserName | undefined;
let browserVersion = matches[2] as string | undefined;

if (browserName === 'webkit') {
result.webkit = true;

if (ua.includes('chrome') || ua.includes('crios')) {
browserName = 'chrome';
browserVersion = /(?:chrome|crios)\/(\d+\.\d+)/.exec(ua)?.[1];
} else if (ua.includes('fxios')) {
browserName = 'mozilla';
browserVersion = /fxios\/(\d+\.\d+)/.exec(ua)?.[1];
} else if (ua.includes('safari') && /version|phantomjs/.test(ua)) {
browserName = 'safari';
browserVersion = /(?:version|phantomjs)\/([0-9.]+)/.exec(ua)?.[1];
} else {
browserName = 'unknown';
browserVersion = /applewebkit\/([0-9.]+)/.exec(ua)?.[1];
}
}

if (browserName) {
result[browserName] = true;
result.version = browserVersion;
}

return result;
};

const browser: Browser = extend({ _fromUA: browserFromUA }, browserFromUA(navigator.userAgent));

export { browser };
51 changes: 0 additions & 51 deletions packages/devextreme/js/__internal/core/utils/m_browser.ts

This file was deleted.

34 changes: 0 additions & 34 deletions packages/devextreme/js/__internal/core/utils/m_version.ts

This file was deleted.

36 changes: 36 additions & 0 deletions packages/devextreme/js/__internal/core/utils/version.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
export type Version = string | number | (string | number)[];

function toParts(value: Version): number[] {
if (typeof value === 'number') {
return [value];
}

const parts = typeof value === 'string' ? value.split('.') : value;

return parts.map((part) => parseInt(String(part || 0), 10));
}

export function compare(x: Version, y: Version, maxLevel?: number): number {
const xParts = toParts(x);
const yParts = toParts(y);

let length = Math.max(xParts.length, yParts.length);

if (maxLevel !== undefined && isFinite(maxLevel)) {
length = Math.min(length, maxLevel);
}

for (let i = 0; i < length; i += 1) {
const xItem = xParts[i] ?? 0;
const yItem = yParts[i] ?? 0;

if (xItem < yItem) {
return -1;
}
if (xItem > yItem) {
return 1;
}
}

return 0;
}
2 changes: 1 addition & 1 deletion packages/devextreme/js/__internal/core/widget/widget.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ class Widget<
const device = devices.real();
const { platform } = device;
const { version } = device;
return platform === 'ios' && compareVersions(version, '13.3') <= 0;
return platform === 'ios' && compareVersions(version ?? [], '13.3') <= 0;
},
options: {
useResizeObserver: false,
Expand Down
2 changes: 1 addition & 1 deletion packages/devextreme/js/__internal/integration/jquery.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* eslint-disable import/first */
import errors from '@ts/core/utils/m_error';
import { compare as compareVersions } from '@ts/core/utils/m_version';
import { compare as compareVersions } from '@ts/core/utils/version';
// eslint-disable-next-line import/no-extraneous-dependencies
import jQuery from 'jquery';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { DeferredObj } from '@js/core/utils/deferred';
import { setStrategy } from '@ts/core/utils/m_deferred';
import { compare as compareVersion } from '@ts/core/utils/m_version';
import { compare as compareVersion } from '@ts/core/utils/version';
// eslint-disable-next-line import/no-extraneous-dependencies
import jQuery from 'jquery';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { each } from '@ts/core/utils/m_iterator';
import { isNumeric } from '@ts/core/utils/m_type';
import { compare as compareVersion } from '@ts/core/utils/m_version';
import { compare as compareVersion } from '@ts/core/utils/version';
import registerEvent from '@ts/events/core/event_registrator';
import hookTouchProps from '@ts/events/core/hook_touch_props';
import { setEventFixMethod } from '@ts/events/utils/index';
Expand Down
2 changes: 1 addition & 1 deletion packages/devextreme/js/__internal/integration/knockout.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* eslint-disable import/first */
import errors from '@ts/core/utils/m_error';
import { compare as compareVersion } from '@ts/core/utils/m_version';
import { compare as compareVersion } from '@ts/core/utils/version';
// eslint-disable-next-line import/no-extraneous-dependencies
import ko from 'knockout';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { afterCleanData, cleanData, strategyChanging } from '@ts/core/element_data';
import { compare as compareVersion } from '@ts/core/utils/m_version';
import { compare as compareVersion } from '@ts/core/utils/version';
// eslint-disable-next-line import/no-extraneous-dependencies
import ko from 'knockout';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* eslint-disable func-names */
import { strategyChanging } from '@ts/core/element_data';
import { compare as compareVersion } from '@ts/core/utils/m_version';
import { compare as compareVersion } from '@ts/core/utils/version';
// eslint-disable-next-line import/no-extraneous-dependencies
import ko from 'knockout';

Expand Down
2 changes: 1 addition & 1 deletion packages/devextreme/js/core/utils/browser.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
// deprecated
import { browser } from '../../__internal/core/utils/m_browser';
import { browser } from '../../__internal/core/utils/browser';
export default browser;
2 changes: 1 addition & 1 deletion packages/devextreme/js/core/utils/version.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// deprecated
export { compare } from '../../__internal/core/utils/m_version';
export { compare } from '../../__internal/core/utils/version';
Loading