@flatbiz/device 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1 @@
1
+ # @flatbiz/device
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020-2021 Yingchun Tian
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1 +1,50 @@
1
- ### 项目描述等
1
+ ## @flatbiz/device
2
+
3
+ 增强 H5 设备信息采集能力:`deviceInfo` 支持自定义/自动获取 IP、屏幕分辨率字符串,并合并 UA 解析结果;补充 Vitest 单测与 Vite 本地演示。
4
+
5
+ ### Breaking Changes
6
+
7
+ - **`deviceInfo` 改为异步 API**:由同步函数改为 `async`,返回 `Promise<FlatbizDevice>`,调用方需使用 `await deviceInfo()` 或 `.then()`
8
+ - **移除 `utils` 模块**:`getDeviceId` 统一从 `helper-get-deviceId` 导出,不再通过 `src/utils.ts`
9
+
10
+ ### Features
11
+
12
+ - 新增 **`DeviceInfoOptions`** 可选参数:
13
+ - **`ip`**:传入服务端下发的 IP,优先于自动获取
14
+ - **`autoGetIp`**:为 `true` 时通过 `https://api.ipify.org?format=json` 拉取公网 IP(默认 `false`)
15
+ - **`isDebug`**:为 `true` 时在控制台输出非浏览器环境或解析失败等错误信息(默认 `false`)
16
+ - 新增返回字段 **`ip`**、**`screenSize`**(格式 `{width}x{height}`,如 `390x844`)
17
+ - 非浏览器环境(`typeof window === 'undefined'`)安全返回 `{}`,避免 SSR/Node 直接调用抛错
18
+ - 新增 helpers:`getIp`、`getWindowSize`;`getDeviceId` 独立为 `helper-get-deviceId`
19
+ - 开发体验:补充 Vitest 单元测试;`yarn demo`(Vite)可本地预览 `public/index.html`
20
+
21
+ ### `deviceInfo()` 返回字段
22
+
23
+ **H5 终端(`FlatbizDeviceInfo`)**
24
+
25
+ - `ip`、`deviceId`、`language`
26
+ - `screenWidth`、`screenHeight`、`screenSize`、`screenDensity`
27
+ - `networkType`、`timezone`、`timezoneOffset`、`systemDate`、`systemTime`
28
+ - `colorDepth`、`touchSupport`、`plugins`、`pluginNum`、`cookiesEnable`
29
+
30
+ **UA 解析(`FlatbizUaParserResult`)**
31
+
32
+ - `userAgent`、`browserName`、`browserVersion`
33
+ - `engineName`、`engineVersion`
34
+ - `osName`、`osVersion`、`cpuModel`
35
+ - `deviceType`、`deviceVendor`、`deviceModel`
36
+
37
+ ### Usage
38
+
39
+ ```ts
40
+ import { deviceInfo } from '@flatbiz/device';
41
+
42
+ // 自定义 IP(推荐由服务端下发)
43
+ const info = await deviceInfo({ ip: '203.0.113.1' });
44
+
45
+ // 自动获取公网 IP
46
+ const info2 = await deviceInfo({ autoGetIp: true });
47
+
48
+ // 调试模式
49
+ const info3 = await deviceInfo({ isDebug: true });
50
+ ```
@@ -0,0 +1,5 @@
1
+ import type { FlatbizDeviceInfo } from '../types/types-device.js';
2
+ export declare const getDeviceInfoH5: (options: {
3
+ ip?: string;
4
+ autoGetIp?: boolean;
5
+ }) => Promise<FlatbizDeviceInfo>;
@@ -0,0 +1,37 @@
1
+ import { getDeviceId } from './helper-get-deviceId.js';
2
+ import { getIntl } from './helper-get-intl.js';
3
+ import { getIp } from './helper-get-ip.js';
4
+ import { getLanguage } from './helper-get-language.js';
5
+ import { getNetwork } from './helper-get-network.js';
6
+ import { getPlugins } from './helper-get-plugins.js';
7
+ import { getTouchSupport } from './helper-get-touch-support.js';
8
+ import { getWindowSize } from './helper-get-window-size.js';
9
+ /* 获取H5设备信息 */
10
+ export const getDeviceInfoH5 = async (options) => {
11
+ const { ip: customIp = '', autoGetIp } = options || {};
12
+ const navigator = window.navigator;
13
+ const intl = getIntl();
14
+ const plugins = getPlugins(navigator);
15
+ const networkType = getNetwork(navigator);
16
+ const language = getLanguage(navigator);
17
+ const touchSupport = getTouchSupport();
18
+ const deviceId = getDeviceId();
19
+ const windowSize = getWindowSize();
20
+ const ip = autoGetIp ? await getIp() : customIp;
21
+ return {
22
+ ...windowSize,
23
+ ip,
24
+ deviceId,
25
+ networkType,
26
+ language,
27
+ touchSupport,
28
+ cookiesEnable: navigator.cookieEnabled,
29
+ colorDepth: window.screen.colorDepth,
30
+ plugins: plugins.plugins,
31
+ pluginNum: plugins.pluginNum,
32
+ timezoneOffset: intl.timezoneOffset,
33
+ timezone: intl.timezone,
34
+ systemDate: intl.systemDate,
35
+ systemTime: intl.systemTime,
36
+ };
37
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 获取设备 ID
3
+ * @returns 设备 ID
4
+ * - 如果设备 ID 不存在,则生成一个设备 ID 并返回
5
+ * - 如果设备 ID 存在,则返回设备 ID
6
+ */
7
+ export declare const getDeviceId: () => string;
@@ -0,0 +1,34 @@
1
+ const storageKey = 'flatbiz_device';
2
+ const localStorageCache = {
3
+ set: (key, value) => {
4
+ localStorage.setItem(`${storageKey}_${key}`, value);
5
+ },
6
+ get: (key) => {
7
+ return localStorage.getItem(`${storageKey}_${key}`);
8
+ },
9
+ remove: (key) => {
10
+ localStorage.removeItem(`${storageKey}_${key}`);
11
+ },
12
+ };
13
+ const getUuid = () => {
14
+ return 'xxxxxxxx4xxxyxxx'.replace(/[xy]/g, function (c) {
15
+ const r = (Math.random() * 16) | 0, v = c == 'x' ? r : (r & 0x3) | 0x8;
16
+ return v.toString(16);
17
+ });
18
+ };
19
+ /**
20
+ * 获取设备 ID
21
+ * @returns 设备 ID
22
+ * - 如果设备 ID 不存在,则生成一个设备 ID 并返回
23
+ * - 如果设备 ID 存在,则返回设备 ID
24
+ */
25
+ export const getDeviceId = () => {
26
+ const cacheKey = 'ftbzdid';
27
+ const deviceId = localStorageCache.get(cacheKey);
28
+ if (!deviceId) {
29
+ const uuid = getUuid();
30
+ localStorageCache.set(cacheKey, uuid);
31
+ return uuid;
32
+ }
33
+ return deviceId;
34
+ };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 获取当前时区信息
3
+ * @returns { timezoneOffset: number; timezone: string }
4
+ * - timezoneOffset: 当前时区偏移(分钟,东八区可能是 -480)
5
+ * - timezone: 当前时区(如 Asia/Shanghai)
6
+ * - systemDate: 系统日期(如 2026/05/16)
7
+ * - systemTime: 系统时间(如 10:00:00)
8
+ */
9
+ export declare const getIntl: () => {
10
+ timezoneOffset: number;
11
+ timezone: string;
12
+ systemDate: string;
13
+ systemTime: string;
14
+ };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 获取当前时区信息
3
+ * @returns { timezoneOffset: number; timezone: string }
4
+ * - timezoneOffset: 当前时区偏移(分钟,东八区可能是 -480)
5
+ * - timezone: 当前时区(如 Asia/Shanghai)
6
+ * - systemDate: 系统日期(如 2026/05/16)
7
+ * - systemTime: 系统时间(如 10:00:00)
8
+ */
9
+ export const getIntl = () => {
10
+ let timezone = '';
11
+ if (window.Intl && window.Intl.DateTimeFormat) {
12
+ timezone = new window.Intl.DateTimeFormat().resolvedOptions().timeZone;
13
+ }
14
+ const date = new Date();
15
+ const year = date.getFullYear();
16
+ const month = date.getMonth();
17
+ const day = date.getDate();
18
+ const hour = date.getHours();
19
+ const minutes = date.getMinutes();
20
+ const seconds = date.getSeconds();
21
+ const systemDate = `${year}/${month + 1}/${day}`;
22
+ const systemTime = `${hour}:${minutes}:${seconds}`;
23
+ return {
24
+ timezoneOffset: new Date().getTimezoneOffset(),
25
+ timezone,
26
+ systemDate,
27
+ systemTime,
28
+ };
29
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 获取 IP 地址
3
+ * @returns IP 地址
4
+ */
5
+ export declare const getIp: () => Promise<string>;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 获取 IP 地址
3
+ * @returns IP 地址
4
+ */
5
+ export const getIp = async () => {
6
+ try {
7
+ const res = await fetch('https://api.ipify.org?format=json');
8
+ const data = await res.json();
9
+ return data.ip;
10
+ }
11
+ catch {
12
+ return '';
13
+ }
14
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 获取当前语言
3
+ * @param navigator - navigator 对象
4
+ * @returns 语言(如 zh-CN/en-US)
5
+ */
6
+ export declare const getLanguage: (navigator: Navigator) => string;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 获取当前语言
3
+ * @param navigator - navigator 对象
4
+ * @returns 语言(如 zh-CN/en-US)
5
+ */
6
+ export const getLanguage = (navigator) => {
7
+ const language = navigator['browserLanguage'] || navigator.language;
8
+ const arr = language.split('-');
9
+ if (arr[1]) {
10
+ arr[1] = arr[1].toUpperCase();
11
+ }
12
+ return arr.join('_');
13
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 获取网络状况
3
+ * @param navigator - navigator 对象
4
+ * @returns 网络类型(如 wifi、4g、5g 等)
5
+ */
6
+ export declare const getNetwork: (navigator: Navigator) => string;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 获取网络状况
3
+ * @param navigator - navigator 对象
4
+ * @returns 网络类型(如 wifi、4g、5g 等)
5
+ */
6
+ export const getNetwork = (navigator) => {
7
+ return (navigator &&
8
+ navigator['connection'] &&
9
+ navigator['connection'].effectiveType);
10
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 获取浏览器插件信息
3
+ * @param navigator - navigator 对象
4
+ * @returns { plugins: string[], pluginNum: number }
5
+ * - plugins: 浏览器插件名称列表
6
+ * - pluginNum: 浏览器插件数量
7
+ */
8
+ export declare const getPlugins: (navigator: Navigator) => {
9
+ plugins: string[];
10
+ pluginNum: number;
11
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 获取浏览器插件信息
3
+ * @param navigator - navigator 对象
4
+ * @returns { plugins: string[], pluginNum: number }
5
+ * - plugins: 浏览器插件名称列表
6
+ * - pluginNum: 浏览器插件数量
7
+ */
8
+ export const getPlugins = (navigator) => {
9
+ const pluginNames = [];
10
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
11
+ for (let i = 0; i < navigator.plugins.length; i++) {
12
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
13
+ pluginNames.push(navigator.plugins[i].name);
14
+ }
15
+ return {
16
+ plugins: pluginNames,
17
+ pluginNum: pluginNames.length,
18
+ };
19
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 检测设备触摸能力信息
3
+ * @returns [number, boolean, boolean]
4
+ * - 0: 支持的最大触点数量(多点触控数,部分浏览器或设备为 0)
5
+ * - 1: 是否支持 TouchEvent 事件(通过能否创建 'TouchEvent' 判断)
6
+ * - 2: window 上是否存在 'ontouchstart' 属性(老式触摸事件判断方式)
7
+ */
8
+ export declare const getTouchSupport: () => string[];
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 检测设备触摸能力信息
3
+ * @returns [number, boolean, boolean]
4
+ * - 0: 支持的最大触点数量(多点触控数,部分浏览器或设备为 0)
5
+ * - 1: 是否支持 TouchEvent 事件(通过能否创建 'TouchEvent' 判断)
6
+ * - 2: window 上是否存在 'ontouchstart' 属性(老式触摸事件判断方式)
7
+ */
8
+ export const getTouchSupport = () => {
9
+ let maxTouchPoints = 0;
10
+ let touchEvent;
11
+ if (typeof navigator.maxTouchPoints !== 'undefined') {
12
+ maxTouchPoints = navigator.maxTouchPoints;
13
+ }
14
+ else if (typeof navigator['msMaxTouchPoints'] !== 'undefined') {
15
+ maxTouchPoints = navigator['msMaxTouchPoints'];
16
+ }
17
+ try {
18
+ document.createEvent('TouchEvent');
19
+ touchEvent = true;
20
+ }
21
+ catch (_) {
22
+ touchEvent = false;
23
+ }
24
+ const touchStart = 'ontouchstart' in window;
25
+ return [
26
+ maxTouchPoints.toString(),
27
+ touchEvent.toString(),
28
+ touchStart.toString(),
29
+ ];
30
+ };
@@ -0,0 +1,6 @@
1
+ import type { FlatbizDeviceInfo } from '../types/types-device.js';
2
+ /**
3
+ * 获取窗口大小
4
+ * @returns Pick<FlatbizDeviceInfo, 'screenWidth' | 'screenHeight' | 'screenDensity' | 'screenSize'>
5
+ */
6
+ export declare const getWindowSize: () => Pick<FlatbizDeviceInfo, "screenWidth" | "screenHeight" | "screenDensity" | "screenSize">;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 获取窗口大小
3
+ * @returns Pick<FlatbizDeviceInfo, 'screenWidth' | 'screenHeight' | 'screenDensity' | 'screenSize'>
4
+ */
5
+ export const getWindowSize = () => {
6
+ return {
7
+ screenWidth: window.screen.width,
8
+ screenHeight: window.screen.height,
9
+ screenDensity: window.devicePixelRatio,
10
+ screenSize: `${window.screen.width}x${window.screen.height}`,
11
+ };
12
+ };
@@ -0,0 +1,6 @@
1
+ import type { FlatbizUaParserResult } from '../types/types-device.js';
2
+ /**
3
+ * get ua parser result from ua-parser-js
4
+ * @returns Partial<FlatbizUaParserResult>
5
+ */
6
+ export declare const getUaParserResult: () => Partial<FlatbizUaParserResult>;
@@ -0,0 +1,24 @@
1
+ import { UAParser } from 'ua-parser-js';
2
+ const createUaParser = () => {
3
+ return new UAParser();
4
+ };
5
+ /**
6
+ * get ua parser result from ua-parser-js
7
+ * @returns Partial<FlatbizUaParserResult>
8
+ */
9
+ export const getUaParserResult = () => {
10
+ const result = createUaParser().getResult();
11
+ return {
12
+ browserName: result.browser.name,
13
+ browserVersion: result.browser.version,
14
+ engineName: result.engine.name,
15
+ engineVersion: result.engine.version,
16
+ deviceType: result.device.type,
17
+ deviceVendor: result.device.vendor,
18
+ deviceModel: result.device.model,
19
+ osVersion: result.os.version,
20
+ osName: result.os.name,
21
+ cpuModel: result.cpu.architecture,
22
+ userAgent: result.ua,
23
+ };
24
+ };
@@ -0,0 +1,7 @@
1
+ import type { FlatbizDevice } from './types/types-device.js';
2
+ import type { DeviceInfoOptions } from './types/types-options.js';
3
+ /**
4
+ * 获取设备信息
5
+ * @returns FlatbizDevice
6
+ */
7
+ export declare const deviceInfo: (options?: DeviceInfoOptions) => Promise<FlatbizDevice>;
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ import { getDeviceInfoH5 } from './helpers/helper-device-info.js';
2
+ import { getUaParserResult } from './helpers/helper-ua-parser.js';
3
+ /**
4
+ * 获取设备信息
5
+ * @returns FlatbizDevice
6
+ */
7
+ export const deviceInfo = async (options) => {
8
+ const { ip, autoGetIp = false, isDebug = false } = options || {};
9
+ try {
10
+ if (typeof window === 'undefined') {
11
+ if (isDebug)
12
+ console.error('请在浏览器环境中使用');
13
+ return {};
14
+ }
15
+ const deviceInfo = await getDeviceInfoH5({ ip, autoGetIp });
16
+ const uaParserResult = getUaParserResult();
17
+ return {
18
+ ...deviceInfo,
19
+ ...uaParserResult,
20
+ };
21
+ }
22
+ catch (error) {
23
+ if (isDebug)
24
+ console.error('解析设备数据异常', error?.message);
25
+ return {};
26
+ }
27
+ };
@@ -0,0 +1,73 @@
1
+ /**
2
+ * FlatbizDevice 类型是基本设备信息和UA解析信息的并集(可选属性)。
3
+ * 结合了 FlatbizDeviceInfo(基础终端信息)与 FlatbizUaParserResult(UA 解析结果)。
4
+ */
5
+ export type FlatbizDevice = Partial<FlatbizDeviceInfo> & Partial<FlatbizUaParserResult>;
6
+ /**
7
+ * FlatbizDeviceInfo
8
+ * 终端的基础信息采集接口
9
+ */
10
+ export interface FlatbizDeviceInfo {
11
+ /** IP 地址 */
12
+ ip: string;
13
+ /** 设备 ID */
14
+ deviceId: string;
15
+ /** 设备操作系统所用语言(如 zh-CN/en-US) */
16
+ language: string;
17
+ /** 设备屏幕像素密度(如 2 表示 @2x) */
18
+ screenDensity: number;
19
+ /** 设备屏幕高度(像素) */
20
+ screenHeight: number;
21
+ /** 设备屏幕宽度(像素) */
22
+ screenWidth: number;
23
+ /** 设备屏幕分辨率(如 1920x1080) */
24
+ screenSize: string;
25
+ /** 当前网络类型(如 wifi、4g、5g 等) */
26
+ networkType: string;
27
+ /** 当前时区(如 Asia/Shanghai) */
28
+ timezone: string;
29
+ /** 当前时区偏移(分钟,东八区可能是 -480) */
30
+ timezoneOffset: number;
31
+ /** 系统日期 */
32
+ systemDate: string;
33
+ /** 系统时间 */
34
+ systemTime: string;
35
+ /** 颜色深度 */
36
+ colorDepth: number;
37
+ /** 触摸支持 */
38
+ touchSupport: string[];
39
+ /** 浏览器插件 */
40
+ plugins: string[];
41
+ /** 浏览器插件数量 */
42
+ pluginNum: number;
43
+ /** 浏览器是否启用 cookies */
44
+ cookiesEnable: boolean;
45
+ }
46
+ /**
47
+ * FlatbizUaParserResult
48
+ * UA 解析库返回的详细终端信息,如操作系统、浏览器、引擎等。
49
+ */
50
+ export interface FlatbizUaParserResult {
51
+ /** 完整的 userAgent 字符串 */
52
+ userAgent: string;
53
+ /** 操作系统版本(如 10.0.0) */
54
+ osVersion: string;
55
+ /** 操作系统名称(如 Android、iOS、Windows) */
56
+ osName: string;
57
+ /** CPU 架构/型号(如 x86, arm) */
58
+ cpuModel: string;
59
+ /** 浏览器名称(如 Chrome、Safari) */
60
+ browserName: string;
61
+ /** 浏览器版本号 */
62
+ browserVersion: string;
63
+ /** 内核/引擎名称(如 Webkit、Blink、Gecko) */
64
+ engineName: string;
65
+ /** 内核/引擎版本 */
66
+ engineVersion: string;
67
+ /** 设备类型(如 mobile, tablet, desktop) */
68
+ deviceType: string;
69
+ /** 设备厂商(如 Samsung、Apple) */
70
+ deviceVendor: string;
71
+ /** 设备型号(如 iPhone XR,SM-G9650) */
72
+ deviceModel: string;
73
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ export type DeviceInfoOptions = {
2
+ /**
3
+ * 自定义 IP 地址
4
+ * 优先在调用时传入对应的 IP 地址,通过服务端获取对应的 IP 地址
5
+ */
6
+ ip?: string;
7
+ /**
8
+ * 是否自动获取 IP 地址,
9
+ * 默认 false
10
+ *
11
+ * 实现方式:
12
+ * 通过 fetch 请求 https://api.ipify.org?format=json 获取 IP 地址
13
+ */
14
+ autoGetIp?: boolean;
15
+ /**
16
+ * 是否开启调试模式,
17
+ * 默认 false
18
+ *
19
+ * 开启后会在控制台输出调试信息
20
+ */
21
+ isDebug?: boolean;
22
+ };
@@ -0,0 +1 @@
1
+ export {};
package/index.js CHANGED
@@ -1 +1 @@
1
- export * from './esm/index';
1
+ export * from './dist/index.js';
package/package.json CHANGED
@@ -1,29 +1,59 @@
1
1
  {
2
2
  "name": "@flatbiz/device",
3
- "version": "1.0.2",
4
- "description": "flatbiz device",
5
- "main": "index.js",
6
- "typings": "index.d.ts",
3
+ "version": "2.0.0",
4
+ "homepage": "https://gitlab.itcjf.com/flatjs/flat-biz-devkit",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://gitlab.itcjf.com/flatjs/flat-biz-devkit",
8
+ "directory": "packages/core"
9
+ },
10
+ "license": "MIT",
11
+ "type": "module",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./index.js"
15
+ },
16
+ "./package.json": "./package.json"
17
+ },
18
+ "types": "./dist/index.d.ts",
7
19
  "files": [
8
- "esm/",
20
+ "dist/",
9
21
  "index.js",
10
- "index.d.ts",
11
22
  "README.md",
23
+ "CHANGELOG.md",
12
24
  "package.json"
13
25
  ],
14
- "keywords": [
15
- "flatbiz",
16
- "device"
17
- ],
18
- "publishConfig": {
19
- "access": "public"
26
+ "scripts": {
27
+ "build": "tsc -p ./tsconfig.build.json",
28
+ "?build-release": "When https://github.com/atlassian/changesets/issues/432 has a solution we can remove this trick",
29
+ "build-release": "yarn build && rimraf ./_release && yarn pack && mkdir ./_release && tar zxvf ./package.tgz --directory ./_release && rm ./package.tgz",
30
+ "clean": "rimraf --no-glob ./dist ./coverage ./tsconfig.tsbuildinfo",
31
+ "lint": "eslint . --ext .ts,.mts,.tsx,.js,.jsx,.cjs,.mjs --cache --cache-location ../../.cache/eslint/core.eslintcache",
32
+ "test": "run-s test-unit",
33
+ "test-unit": "vitest run --passWithNoTests",
34
+ "test-unit-watch": "vitest watch --ui",
35
+ "fix-all-files": "eslint . --fix",
36
+ "typecheck": "tsc --project ./tsconfig.json --noEmit",
37
+ "dev": "vite"
38
+ },
39
+ "dependencies": {
40
+ "ua-parser-js": "2.0.9"
41
+ },
42
+ "devDependencies": {
43
+ "@hyperse/eslint-config-hyperse": "^1.7.3",
44
+ "@types/node": "25.8.0",
45
+ "eslint": "10.4.0",
46
+ "happy-dom": "17.4.6",
47
+ "npm-run-all": "4.1.5",
48
+ "typescript": "6.0.3",
49
+ "vite": "6.3.5",
50
+ "vitest": "4.1.6"
20
51
  },
21
- "author": "tcsk",
22
- "license": "MIT",
23
52
  "engines": {
24
- "node": ">=13.8.0"
53
+ "node": ">=16.0.0"
25
54
  },
26
- "dependencies": {
27
- "ua-parser-js": "1.0.37"
55
+ "publishConfig": {
56
+ "access": "public",
57
+ "directory": "_release/package"
28
58
  }
29
59
  }
package/esm/index.js DELETED
@@ -1,3 +0,0 @@
1
- /*! @flatjs/forge MIT @flatbiz/device */
2
- import e from"ua-parser-js";const n={engine:["WebKit","Trident","Gecko","Presto"],browser:["Safari","Chrome","Edge","IE","Firefox","Firefox Focus","Chromium","Opera","Vivaldi","Yandex","Arora","Lunascape","QupZilla","Coc Coc","Kindle","Iceweasel","Konqueror","Iceape","SeaMonkey","Epiphany","360","360SE","360EE","UC","QQBrowser","QQ","Baidu","Maxthon","Sogou","LBBROWSER","2345Explorer","TheWorld","XiaoMi","Quark","Qiyu","Wechat","Taobao","Alipay","Weibo","Douban","Suning","iQiYi"],os:["Windows","Linux","Mac OS","Android","Ubuntu","FreeBSD","Debian","iOS","Windows Phone","BlackBerry","MeeGo","Symbian","Chrome OS","WebOS"],device:["Mobile","Tablet","iPad"]};const i=()=>{let e=0;let n;if(typeof navigator.maxTouchPoints!=="undefined"){e=navigator.maxTouchPoints}else if(typeof navigator["msMaxTouchPoints"]!=="undefined"){e=navigator["msMaxTouchPoints"]}try{document.createEvent("TouchEvent");n=true}catch(e){n=false}const i="ontouchstart"in window;return[e,n,i]};const o=e=>e&&e.connection&&e.connection.effectiveType;const r=e=>({Trident:e.indexOf("Trident")>-1||e.indexOf("NET CLR")>-1,Presto:e.indexOf("Presto")>-1,WebKit:e.indexOf("AppleWebKit")>-1,Gecko:e.indexOf("Gecko/")>-1,Safari:e.indexOf("Safari")>-1,Chrome:e.indexOf("Chrome")>-1||e.indexOf("CriOS")>-1,IE:e.indexOf("MSIE")>-1||e.indexOf("Trident")>-1,Edge:e.indexOf("Edge")>-1,Firefox:e.indexOf("Firefox")>-1||e.indexOf("FxiOS")>-1,"Firefox Focus":e.indexOf("Focus")>-1,Chromium:e.indexOf("Chromium")>-1,Opera:e.indexOf("Opera")>-1||e.indexOf("OPR")>-1,Vivaldi:e.indexOf("Vivaldi")>-1,Yandex:e.indexOf("YaBrowser")>-1,Arora:e.indexOf("Arora")>-1,Lunascape:e.indexOf("Lunascape")>-1,QupZilla:e.indexOf("QupZilla")>-1,"Coc Coc":e.indexOf("coc_coc_browser")>-1,Kindle:e.indexOf("Kindle")>-1||e.indexOf("Silk/")>-1,Iceweasel:e.indexOf("Iceweasel")>-1,Konqueror:e.indexOf("Konqueror")>-1,Iceape:e.indexOf("Iceape")>-1,SeaMonkey:e.indexOf("SeaMonkey")>-1,Epiphany:e.indexOf("Epiphany")>-1,360:e.indexOf("QihooBrowser")>-1||e.indexOf("QHBrowser")>-1,"360EE":e.indexOf("360EE")>-1,"360SE":e.indexOf("360SE")>-1,UC:e.indexOf("UC")>-1||e.indexOf(" UBrowser")>-1,QQBrowser:e.indexOf("QQBrowser")>-1,QQ:e.indexOf("QQ/")>-1,Baidu:e.indexOf("Baidu")>-1||e.indexOf("BIDUBrowser")>-1,Maxthon:e.indexOf("Maxthon")>-1,Sogou:e.indexOf("MetaSr")>-1||e.indexOf("Sogou")>-1,LBBROWSER:e.indexOf("LBBROWSER")>-1,"2345Explorer":e.indexOf("2345Explorer")>-1,TheWorld:e.indexOf("TheWorld")>-1,XiaoMi:e.indexOf("MiuiBrowser")>-1,Quark:e.indexOf("Quark")>-1,Qiyu:e.indexOf("Qiyu")>-1,Wechat:e.indexOf("MicroMessenger")>-1,Taobao:e.indexOf("AliApp(TB")>-1,Alipay:e.indexOf("AliApp(AP")>-1,Weibo:e.indexOf("Weibo")>-1,Douban:e.indexOf("com.douban.frodo")>-1,Suning:e.indexOf("SNEBUY-APP")>-1,iQiYi:e.indexOf("IqiyiApp")>-1,Windows:e.indexOf("Windows")>-1,Linux:e.indexOf("Linux")>-1||e.indexOf("X11")>-1,"Mac OS":e.indexOf("Macintosh")>-1,Android:e.indexOf("Android")>-1||e.indexOf("Adr")>-1,Ubuntu:e.indexOf("Ubuntu")>-1,FreeBSD:e.indexOf("FreeBSD")>-1,Debian:e.indexOf("Debian")>-1,"Windows Phone":e.indexOf("IEMobile")>-1||e.indexOf("Windows Phone")>-1,BlackBerry:e.indexOf("BlackBerry")>-1||e.indexOf("RIM")>-1,MeeGo:e.indexOf("MeeGo")>-1,Symbian:e.indexOf("Symbian")>-1,iOS:e.indexOf("like Mac OS X")>-1,"Chrome OS":e.indexOf("CrOS")>-1,WebOS:e.indexOf("hpwOS")>-1,Mobile:e.indexOf("Mobi")>-1||e.indexOf("iPh")>-1||e.indexOf("480")>-1,Tablet:e.indexOf("Tablet")>-1||e.indexOf("Nexus 7")>-1,iPad:e.indexOf("iPad")>-1});const t=e=>{const i=r(e);for(const e in n){for(let o=0;o<n[e].length;o++){const r=n[e][o];if(i[r]){return r}}}return""};const d=e=>{const n=e.browserLanguage||e.language;const i=n.split("-");if(i[1]){i[1]=i[1].toUpperCase()}return i.join("_")};const a=e=>{const n={Windows(){const n=e.replace(/^.*Windows NT ([\d.]+);.*$/,"$1");const i={6.4:"10",6.3:"8.1",6.2:"8",6.1:"7","6.0":"Vista",5.2:"XP",5.1:"XP","5.0":"2000"};return i[n]||n},Android(){return e.replace(/^.*Android ([\d.]+);.*$/,"$1")},iOS(){return e.replace(/^.*OS ([\d_]+) like.*$/,"$1").replace(/_/g,".")},Debian(){return e.replace(/^.*Debian\/([\d.]).*$/,"$1")},"Windows Phone"(){return e.replace(/^.*Windows Phone( OS)? ([\d.]+);.*$/,"$2")},"Mac OS"(){return e.replace(/^.*Mac OS X ([\d_]).*$/,"$1").replace(/_/g,".")},WebOS(){return e.replace(/^.*hpwOS\/([\d.]+);.*$/,"$1")}};const i=t(e);return{osName:i,osVersion:n[i]}};const s=()=>{const e=window.navigator;const n=e.userAgent;const r={};const t=new Date;const s=t.getFullYear();const c=t.getMonth();const x=t.getDate();const f=t.getHours();const O=t.getMinutes();const l=t.getSeconds();const{osName:u,osVersion:p}=a(n);r.systemDate=`${s}/${c+1}/${x}`;r.systemTime=`${f}:${O}:${l}`;r.networkType=o(e);r.osVersion=p;r.osName=u;r.language=d(e);r.screenWidth=window.screen.width;r.screenHeight=window.screen.height;r.screenDensity=window.devicePixelRatio;r.cookiesEnable=e.cookieEnabled;r.touchSupport=i();r.colorDepth=window.screen.colorDepth;r.timezoneOffset=(new Date).getTimezoneOffset();r.userAgent=n;if(window.Intl&&window.Intl.DateTimeFormat){r.timezone=(new window.Intl.DateTimeFormat).resolvedOptions().timeZone}try{const n=[];for(let i=0;i<e.plugins.length;i++){n.push(e.plugins[i].name)}r.plugins=n;r.pluginNum=n.length}catch(e){r.plugins=[];r.pluginNum=0}return r};const c="flatbiz_device";const x={set:(e,n)=>{localStorage.setItem(`${c}_${e}`,n)},get:e=>localStorage.getItem(`${c}_${e}`),remove:e=>{localStorage.removeItem(`${c}_${e}`)}};const f=()=>"xxxxxxxx4xxxyxxx".replace(/[xy]/g,(function(e){const n=Math.random()*16|0,i=e=="x"?n:n&3|8;return i.toString(16)}));const O=()=>{const e="ftbzdid";const n=x.get(e);if(!n){const n=f();x.set(e,n);return n}return n};const l=()=>{var n,i;const o=new e(navigator.userAgent).getResult();return{...s(),deviceId:O(),osVersion:o==null||(n=o.os)==null?void 0:n.version,osName:o==null||(i=o.os)==null?void 0:i.name,browserName:o==null?void 0:o.browser.name,browserVersion:o==null?void 0:o.browser.version,engineName:o==null?void 0:o.engine.name,engineVersion:o==null?void 0:o.engine.version}};export{l as deviceInfo};
3
- //# sourceMappingURL=index.js.map
package/esm/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["@flatbiz/device/src/device-info-h5.ts","@flatbiz/device/src/utils.ts","@flatbiz/device/src/index.ts"],"sourcesContent":["export interface IDeviceInfo {\n language: string;\n userAgent: string;\n screenDensity: number;\n screenHeight: number;\n screenWidth: number;\n networkType: string;\n timezone: string;\n timezoneOffset: number;\n osVersion: string;\n osName: string;\n systemDate: string;\n systemTime: string;\n colorDepth: number;\n touchSupport: string[];\n cookiesEnable: boolean;\n plugins: string[];\n pluginNum: number;\n}\n\n/* 信息枚举 */\nconst infoMap = {\n engine: ['WebKit', 'Trident', 'Gecko', 'Presto'],\n browser: [\n 'Safari',\n 'Chrome',\n 'Edge',\n 'IE',\n 'Firefox',\n 'Firefox Focus',\n 'Chromium',\n 'Opera',\n 'Vivaldi',\n 'Yandex',\n 'Arora',\n 'Lunascape',\n 'QupZilla',\n 'Coc Coc',\n 'Kindle',\n 'Iceweasel',\n 'Konqueror',\n 'Iceape',\n 'SeaMonkey',\n 'Epiphany',\n '360',\n '360SE',\n '360EE',\n 'UC',\n 'QQBrowser',\n 'QQ',\n 'Baidu',\n 'Maxthon',\n 'Sogou',\n 'LBBROWSER',\n '2345Explorer',\n 'TheWorld',\n 'XiaoMi',\n 'Quark',\n 'Qiyu',\n 'Wechat',\n 'Taobao',\n 'Alipay',\n 'Weibo',\n 'Douban',\n 'Suning',\n 'iQiYi',\n ],\n os: [\n 'Windows',\n 'Linux',\n 'Mac OS',\n 'Android',\n 'Ubuntu',\n 'FreeBSD',\n 'Debian',\n 'iOS',\n 'Windows Phone',\n 'BlackBerry',\n 'MeeGo',\n 'Symbian',\n 'Chrome OS',\n 'WebOS',\n ],\n device: ['Mobile', 'Tablet', 'iPad'],\n};\n\n/* 获取是否支持触摸 */\nconst getTouchSupport = () => {\n let maxTouchPoints = 0;\n let touchEvent;\n if (typeof navigator.maxTouchPoints !== 'undefined') {\n maxTouchPoints = navigator.maxTouchPoints;\n } else if (typeof navigator['msMaxTouchPoints'] !== 'undefined') {\n maxTouchPoints = navigator['msMaxTouchPoints'];\n }\n\n try {\n document.createEvent('TouchEvent');\n touchEvent = true;\n } catch (_) {\n touchEvent = false;\n }\n\n const touchStart = 'ontouchstart' in window;\n return [maxTouchPoints, touchEvent, touchStart] as string[];\n};\n\n/* 获取网络状况 */\nconst getNetwork = (navigator) => {\n return (navigator && navigator.connection && navigator.connection.effectiveType) as string;\n};\n\n/* 获取匹配库 */\nconst matchMap = (userAgent) => ({\n Trident: userAgent.indexOf('Trident') > -1 || userAgent.indexOf('NET CLR') > -1,\n Presto: userAgent.indexOf('Presto') > -1,\n WebKit: userAgent.indexOf('AppleWebKit') > -1,\n Gecko: userAgent.indexOf('Gecko/') > -1,\n // 浏览器\n Safari: userAgent.indexOf('Safari') > -1,\n Chrome: userAgent.indexOf('Chrome') > -1 || userAgent.indexOf('CriOS') > -1,\n IE: userAgent.indexOf('MSIE') > -1 || userAgent.indexOf('Trident') > -1,\n Edge: userAgent.indexOf('Edge') > -1,\n Firefox: userAgent.indexOf('Firefox') > -1 || userAgent.indexOf('FxiOS') > -1,\n 'Firefox Focus': userAgent.indexOf('Focus') > -1,\n Chromium: userAgent.indexOf('Chromium') > -1,\n Opera: userAgent.indexOf('Opera') > -1 || userAgent.indexOf('OPR') > -1,\n Vivaldi: userAgent.indexOf('Vivaldi') > -1,\n Yandex: userAgent.indexOf('YaBrowser') > -1,\n Arora: userAgent.indexOf('Arora') > -1,\n Lunascape: userAgent.indexOf('Lunascape') > -1,\n QupZilla: userAgent.indexOf('QupZilla') > -1,\n 'Coc Coc': userAgent.indexOf('coc_coc_browser') > -1,\n Kindle: userAgent.indexOf('Kindle') > -1 || userAgent.indexOf('Silk/') > -1,\n Iceweasel: userAgent.indexOf('Iceweasel') > -1,\n Konqueror: userAgent.indexOf('Konqueror') > -1,\n Iceape: userAgent.indexOf('Iceape') > -1,\n SeaMonkey: userAgent.indexOf('SeaMonkey') > -1,\n Epiphany: userAgent.indexOf('Epiphany') > -1,\n '360': userAgent.indexOf('QihooBrowser') > -1 || userAgent.indexOf('QHBrowser') > -1,\n '360EE': userAgent.indexOf('360EE') > -1,\n '360SE': userAgent.indexOf('360SE') > -1,\n UC: userAgent.indexOf('UC') > -1 || userAgent.indexOf(' UBrowser') > -1,\n QQBrowser: userAgent.indexOf('QQBrowser') > -1,\n QQ: userAgent.indexOf('QQ/') > -1,\n Baidu: userAgent.indexOf('Baidu') > -1 || userAgent.indexOf('BIDUBrowser') > -1,\n Maxthon: userAgent.indexOf('Maxthon') > -1,\n Sogou: userAgent.indexOf('MetaSr') > -1 || userAgent.indexOf('Sogou') > -1,\n LBBROWSER: userAgent.indexOf('LBBROWSER') > -1,\n '2345Explorer': userAgent.indexOf('2345Explorer') > -1,\n TheWorld: userAgent.indexOf('TheWorld') > -1,\n XiaoMi: userAgent.indexOf('MiuiBrowser') > -1,\n Quark: userAgent.indexOf('Quark') > -1,\n Qiyu: userAgent.indexOf('Qiyu') > -1,\n Wechat: userAgent.indexOf('MicroMessenger') > -1,\n Taobao: userAgent.indexOf('AliApp(TB') > -1,\n Alipay: userAgent.indexOf('AliApp(AP') > -1,\n Weibo: userAgent.indexOf('Weibo') > -1,\n Douban: userAgent.indexOf('com.douban.frodo') > -1,\n Suning: userAgent.indexOf('SNEBUY-APP') > -1,\n iQiYi: userAgent.indexOf('IqiyiApp') > -1,\n // 系统或平台\n Windows: userAgent.indexOf('Windows') > -1,\n Linux: userAgent.indexOf('Linux') > -1 || userAgent.indexOf('X11') > -1,\n 'Mac OS': userAgent.indexOf('Macintosh') > -1,\n Android: userAgent.indexOf('Android') > -1 || userAgent.indexOf('Adr') > -1,\n Ubuntu: userAgent.indexOf('Ubuntu') > -1,\n FreeBSD: userAgent.indexOf('FreeBSD') > -1,\n Debian: userAgent.indexOf('Debian') > -1,\n 'Windows Phone': userAgent.indexOf('IEMobile') > -1 || userAgent.indexOf('Windows Phone') > -1,\n BlackBerry: userAgent.indexOf('BlackBerry') > -1 || userAgent.indexOf('RIM') > -1,\n MeeGo: userAgent.indexOf('MeeGo') > -1,\n Symbian: userAgent.indexOf('Symbian') > -1,\n iOS: userAgent.indexOf('like Mac OS X') > -1,\n 'Chrome OS': userAgent.indexOf('CrOS') > -1,\n WebOS: userAgent.indexOf('hpwOS') > -1,\n // 设备\n Mobile: userAgent.indexOf('Mobi') > -1 || userAgent.indexOf('iPh') > -1 || userAgent.indexOf('480') > -1,\n Tablet: userAgent.indexOf('Tablet') > -1 || userAgent.indexOf('Nexus 7') > -1,\n iPad: userAgent.indexOf('iPad') > -1,\n});\n\n/* 匹配操作系统 */\nconst getMatchMap = (userAgent) => {\n const match = matchMap(userAgent);\n for (const s in infoMap) {\n for (let i = 0; i < infoMap[s].length; i++) {\n const value = infoMap[s][i];\n if (match[value]) {\n return value as string;\n }\n }\n }\n\n return '';\n};\n\n/* 获取当前语言 */\nconst getLanguage = (navigator) => {\n const language = navigator.browserLanguage || navigator.language;\n const arr = language.split('-');\n if (arr[1]) {\n arr[1] = arr[1].toUpperCase();\n }\n return arr.join('_') as string;\n};\n\n/* 获取操作系统版本 */\nconst getOsVersion = (userAgent) => {\n const osVersion = {\n Windows() {\n const v: string = userAgent.replace(/^.*Windows NT ([\\d.]+);.*$/, '$1');\n const oldWindowsVersionMap: Record<string, string> = {\n '6.4': '10',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': '7',\n '6.0': 'Vista',\n '5.2': 'XP',\n '5.1': 'XP',\n '5.0': '2000',\n };\n return oldWindowsVersionMap[v] || v;\n },\n Android() {\n return userAgent.replace(/^.*Android ([\\d.]+);.*$/, '$1') as string;\n },\n iOS() {\n return userAgent.replace(/^.*OS ([\\d_]+) like.*$/, '$1').replace(/_/g, '.') as string;\n },\n Debian() {\n return userAgent.replace(/^.*Debian\\/([\\d.]).*$/, '$1') as string;\n },\n 'Windows Phone'() {\n return userAgent.replace(/^.*Windows Phone( OS)? ([\\d.]+);.*$/, '$2') as string;\n },\n 'Mac OS'() {\n return userAgent.replace(/^.*Mac OS X ([\\d_]).*$/, '$1').replace(/_/g, '.') as string;\n },\n WebOS() {\n return userAgent.replace(/^.*hpwOS\\/([\\d.]+);.*$/, '$1') as string;\n },\n };\n const osName = getMatchMap(userAgent);\n return {\n osName,\n osVersion: osVersion[osName],\n };\n};\n\n/* 获取H5设备信息 */\nexport const getDeviceInfoH5 = () => {\n const navigator = window.navigator;\n const userAgent = navigator.userAgent;\n const deviceInfo: Partial<IDeviceInfo> = {};\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n const hour = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n const { osName, osVersion } = getOsVersion(userAgent);\n deviceInfo.systemDate = `${year}/${month + 1}/${day}`;\n deviceInfo.systemTime = `${hour}:${minutes}:${seconds}`;\n deviceInfo.networkType = getNetwork(navigator);\n deviceInfo.osVersion = osVersion;\n deviceInfo.osName = osName;\n deviceInfo.language = getLanguage(navigator);\n deviceInfo.screenWidth = window.screen.width;\n deviceInfo.screenHeight = window.screen.height;\n deviceInfo.screenDensity = window.devicePixelRatio;\n deviceInfo.cookiesEnable = navigator.cookieEnabled;\n deviceInfo.touchSupport = getTouchSupport();\n deviceInfo.colorDepth = window.screen.colorDepth;\n deviceInfo.timezoneOffset = new Date().getTimezoneOffset();\n deviceInfo.userAgent = userAgent;\n if (window.Intl && window.Intl.DateTimeFormat) {\n deviceInfo.timezone = new window.Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n try {\n const pluginNames: string[] = [];\n for (let i = 0; i < navigator.plugins.length; i++) {\n pluginNames.push(navigator.plugins[i].name);\n }\n deviceInfo.plugins = pluginNames;\n deviceInfo.pluginNum = pluginNames.length;\n } catch (err) {\n deviceInfo.plugins = [];\n deviceInfo.pluginNum = 0;\n }\n\n return deviceInfo;\n};\n","const storageKey = 'flatbiz_device';\nconst localStorageCache = {\n set: (key: string, value: string) => {\n localStorage.setItem(`${storageKey}_${key}`, value);\n },\n get: (key: string) => {\n return localStorage.getItem(`${storageKey}_${key}`);\n },\n remove: (key: string) => {\n localStorage.removeItem(`${storageKey}_${key}`);\n },\n};\n\nconst getUuid = () => {\n return 'xxxxxxxx4xxxyxxx'.replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0,\n v = c == 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\nexport const getDeviceId = () => {\n const cacheKey = 'ftbzdid';\n const deviceId = localStorageCache.get(cacheKey);\n if (!deviceId) {\n const uuid = getUuid();\n localStorageCache.set(cacheKey, uuid);\n return uuid;\n }\n return deviceId;\n};\n","import UAParser from 'ua-parser-js';\nimport { getDeviceInfoH5 } from './device-info-h5';\nimport { getDeviceId } from './utils';\n\nexport const deviceInfo = () => {\n const userAgentData = new UAParser(navigator.userAgent).getResult();\n return {\n ...getDeviceInfoH5(),\n deviceId: getDeviceId(),\n osVersion: userAgentData?.os?.version as string | undefined,\n osName: userAgentData?.os?.name as string | undefined,\n browserName: userAgentData?.browser.name as string | undefined,\n browserVersion: userAgentData?.browser.version as string | undefined,\n engineName: userAgentData?.engine.name as string | undefined,\n engineVersion: userAgentData?.engine.version as string | undefined,\n };\n};\n"],"names":["infoMap","engine","browser","os","device","getTouchSupport","maxTouchPoints","touchEvent","navigator","document","createEvent","_","touchStart","window","getNetwork","connection","effectiveType","matchMap","userAgent","Trident","indexOf","Presto","WebKit","Gecko","Safari","Chrome","IE","Edge","Firefox","Chromium","Opera","Vivaldi","Yandex","Arora","Lunascape","QupZilla","Kindle","Iceweasel","Konqueror","Iceape","SeaMonkey","Epiphany","UC","QQBrowser","QQ","Baidu","Maxthon","Sogou","LBBROWSER","TheWorld","XiaoMi","Quark","Qiyu","Wechat","Taobao","Alipay","Weibo","Douban","Suning","iQiYi","Windows","Linux","Android","Ubuntu","FreeBSD","Debian","BlackBerry","MeeGo","Symbian","iOS","WebOS","Mobile","Tablet","iPad","getMatchMap","match","s","i","length","value","getLanguage","language","browserLanguage","arr","split","toUpperCase","join","getOsVersion","osVersion","v","replace","oldWindowsVersionMap","osName","getDeviceInfoH5","deviceInfo","date","Date","year","getFullYear","month","getMonth","day","getDate","hour","getHours","minutes","getMinutes","seconds","getSeconds","systemDate","systemTime","networkType","screenWidth","screen","width","screenHeight","height","screenDensity","devicePixelRatio","cookiesEnable","cookieEnabled","touchSupport","colorDepth","timezoneOffset","getTimezoneOffset","Intl","DateTimeFormat","timezone","resolvedOptions","timeZone","pluginNames","plugins","push","name","pluginNum","err","storageKey","localStorageCache","set","key","localStorage","setItem","get","getItem","remove","removeItem","getUuid","c","r","Math","random","toString","getDeviceId","cacheKey","deviceId","uuid","_userAgentData$os","_userAgentData$os2","userAgentData","UAParser","getResult","version","browserName","browserVersion","engineName","engineVersion"],"mappings":"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"}
package/index.d.ts DELETED
@@ -1,26 +0,0 @@
1
- export declare const deviceInfo: () => {
2
- deviceId: string;
3
- osVersion: string | undefined;
4
- osName: string | undefined;
5
- browserName: string | undefined;
6
- browserVersion: string | undefined;
7
- engineName: string | undefined;
8
- engineVersion: string | undefined;
9
- language?: string | undefined;
10
- userAgent?: string | undefined;
11
- screenDensity?: number | undefined;
12
- screenHeight?: number | undefined;
13
- screenWidth?: number | undefined;
14
- networkType?: string | undefined;
15
- timezone?: string | undefined;
16
- timezoneOffset?: number | undefined;
17
- systemDate?: string | undefined;
18
- systemTime?: string | undefined;
19
- colorDepth?: number | undefined;
20
- touchSupport?: string[] | undefined;
21
- cookiesEnable?: boolean | undefined;
22
- plugins?: string[] | undefined;
23
- pluginNum?: number | undefined;
24
- };
25
-
26
- export {};