@cloudcome/utils-browser 1.1.2 → 1.1.4
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/README.md +18 -0
- package/dist/cache.cjs.map +1 -1
- package/dist/cache.d.ts +3 -3
- package/dist/cache.mjs.map +1 -1
- package/dist/cookie.cjs.map +1 -1
- package/dist/cookie.d.ts +2 -2
- package/dist/cookie.mjs.map +1 -1
- package/dist/dom.cjs.map +1 -1
- package/dist/dom.d.ts +6 -6
- package/dist/dom.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/timer.cjs.map +1 -1
- package/dist/timer.d.ts +3 -3
- package/dist/timer.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 我的个人工具函数库
|
|
2
|
+
|
|
3
|
+
[](https://github.com/cloudcome/utils/actions/workflows/code-review.yml)
|
|
4
|
+
[](https://github.com/cloudcome/utils/actions/workflows/dependency-review.yml)
|
|
5
|
+
[](https://app.codacy.com/gh/cloudcome/utils/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
|
|
6
|
+
[](https://app.codacy.com/gh/cloudcome/utils/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
| 名称 | 版本 | 描述 |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| @cloudcome/utils-core | [](https://npmjs.com/package/@cloudcome/utils-core) | 核心工具库 |
|
|
12
|
+
| @cloudcome/utils-browser | [](https://npmjs.com/package/@cloudcome/utils-browser) | 浏览器工具库 |
|
|
13
|
+
| @cloudcome/utils-node| [](https://npmjs.com/package/@cloudcome/utils-node) | Node.js 工具库 |
|
|
14
|
+
| @cloudcome/utils-vue| [](https://npmjs.com/package/@cloudcome/utils-vue) | Vue 工具库 |
|
|
15
|
+
| @cloudcome/utils-react| [](https://npmjs.com/package/@cloudcome/utils-react) | React 工具库 |
|
|
16
|
+
| @cloudcome/utils-uni| [](https://npmjs.com/package/@cloudcome/utils-uni) | UniApp 工具库 |
|
|
17
|
+
|
|
18
|
+
|
package/dist/cache.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.cjs","sources":["../src/cache.ts"],"sourcesContent":["import { AbstractCache, type
|
|
1
|
+
{"version":3,"file":"cache.cjs","sources":["../src/cache.ts"],"sourcesContent":["import { AbstractCache, type CacheOptions, type Cached } from '@cloudcome/utils-core/cache';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\n\n/**\n * 使用浏览器存储(localStorage 或 sessionStorage)实现的缓存类\n * @template T - 缓存数据的类型\n */\nexport class StorageCache<T> extends AbstractCache<T> {\n /**\n * 创建一个新的 StorageCache 实例\n * @param storage - 使用的存储实现(localStorage 或 sessionStorage)\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n */\n constructor(\n readonly storage: Storage,\n readonly namespace = '',\n ) {\n super();\n }\n\n /**\n * 通过ID获取缓存数据\n * @param id - 要获取的缓存键\n * @returns 如果找到且未过期则返回缓存数据,否则返回null\n */\n get(id: string): Cached<T> | null {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n const cachedString = storage.getItem(fullId);\n if (!cachedString) return null;\n\n const cached = JSON.parse(cachedString);\n\n if (cached.createdAt + cached.maxAge < Date.now()) {\n this.del(id);\n return null;\n }\n\n return cached;\n } catch (e) {\n return null;\n }\n }\n\n /**\n * 将数据存储到缓存中\n * @param id - 存储数据使用的缓存键\n * @param data - 要缓存的数据\n * @param options - 可选的缓存配置\n * @returns 成功返回true,存储失败返回false\n */\n set(id: string, data: T, options?: CacheOptions) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.setItem(\n fullId,\n JSON.stringify({\n id,\n data,\n createdAt: Date.now(),\n maxAge: options?.maxAge || 0,\n }),\n );\n } catch (cause) {\n //\n }\n }\n\n /**\n * 通过ID删除缓存数据\n * @param id - 要删除的缓存键\n */\n del(id: string) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.removeItem(fullId);\n } catch (cause) {\n //\n }\n }\n\n clear() {\n try {\n this.storage.clear();\n } catch (err) {\n //\n }\n }\n}\n\n/**\n * 创建一个使用 localStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 localStorage 的新 StorageCache 实例\n */\nexport function createLocalCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(localStorage, namespace);\n}\n\n/**\n * 创建一个使用 sessionStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 sessionStorage 的新 StorageCache 实例\n */\nexport function createSessionCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(sessionStorage, namespace);\n}\n"],"names":["AbstractCache"],"mappings":";;;AAOO,MAAM,qBAAwBA,MAAAA,cAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpD,YACW,SACA,YAAY,IACrB;AACM,UAAA;AAHG,SAAA,UAAA;AACA,SAAA,YAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUX,IAAI,IAA8B;AAC1B,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACI,YAAA,eAAe,QAAQ,QAAQ,MAAM;AACvC,UAAA,CAAC,aAAqB,QAAA;AAEpB,YAAA,SAAS,KAAK,MAAM,YAAY;AAEtC,UAAI,OAAO,YAAY,OAAO,SAAS,KAAK,OAAO;AACjD,aAAK,IAAI,EAAE;AACJ,eAAA;AAAA,MAAA;AAGF,aAAA;AAAA,aACA,GAAG;AACH,aAAA;AAAA,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUF,IAAI,IAAY,MAAS,SAAwB;AACzC,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACM,cAAA;AAAA,QACN;AAAA,QACA,KAAK,UAAU;AAAA,UACb;AAAA,UACA;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB,SAAQ,mCAAS,WAAU;AAAA,QAC5B,CAAA;AAAA,MACH;AAAA,aACO,OAAO;AAAA,IAAA;AAAA,EAEhB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,IAAI,IAAY;AACR,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACF,cAAQ,WAAW,MAAM;AAAA,aAClB,OAAO;AAAA,IAAA;AAAA,EAEhB;AAAA,EAGF,QAAQ;AACF,QAAA;AACF,WAAK,QAAQ,MAAM;AAAA,aACZ,KAAK;AAAA,IAAA;AAAA,EAEd;AAEJ;AAQO,SAAS,iBAAoB,WAAsC;AACjE,SAAA,IAAI,aAAgB,cAAc,SAAS;AACpD;AAQO,SAAS,mBAAsB,WAAsC;AACnE,SAAA,IAAI,aAAgB,gBAAgB,SAAS;AACtD;;;;"}
|
package/dist/cache.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AbstractCache,
|
|
1
|
+
import { AbstractCache, CacheOptions, Cached } from '@cloudcome/utils-core/cache';
|
|
2
2
|
/**
|
|
3
3
|
* 使用浏览器存储(localStorage 或 sessionStorage)实现的缓存类
|
|
4
4
|
* @template T - 缓存数据的类型
|
|
@@ -17,7 +17,7 @@ export declare class StorageCache<T> extends AbstractCache<T> {
|
|
|
17
17
|
* @param id - 要获取的缓存键
|
|
18
18
|
* @returns 如果找到且未过期则返回缓存数据,否则返回null
|
|
19
19
|
*/
|
|
20
|
-
get(id: string):
|
|
20
|
+
get(id: string): Cached<T> | null;
|
|
21
21
|
/**
|
|
22
22
|
* 将数据存储到缓存中
|
|
23
23
|
* @param id - 存储数据使用的缓存键
|
|
@@ -25,7 +25,7 @@ export declare class StorageCache<T> extends AbstractCache<T> {
|
|
|
25
25
|
* @param options - 可选的缓存配置
|
|
26
26
|
* @returns 成功返回true,存储失败返回false
|
|
27
27
|
*/
|
|
28
|
-
set(id: string, data: T, options?:
|
|
28
|
+
set(id: string, data: T, options?: CacheOptions): void;
|
|
29
29
|
/**
|
|
30
30
|
* 通过ID删除缓存数据
|
|
31
31
|
* @param id - 要删除的缓存键
|
package/dist/cache.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.mjs","sources":["../src/cache.ts"],"sourcesContent":["import { AbstractCache, type
|
|
1
|
+
{"version":3,"file":"cache.mjs","sources":["../src/cache.ts"],"sourcesContent":["import { AbstractCache, type CacheOptions, type Cached } from '@cloudcome/utils-core/cache';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\n\n/**\n * 使用浏览器存储(localStorage 或 sessionStorage)实现的缓存类\n * @template T - 缓存数据的类型\n */\nexport class StorageCache<T> extends AbstractCache<T> {\n /**\n * 创建一个新的 StorageCache 实例\n * @param storage - 使用的存储实现(localStorage 或 sessionStorage)\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n */\n constructor(\n readonly storage: Storage,\n readonly namespace = '',\n ) {\n super();\n }\n\n /**\n * 通过ID获取缓存数据\n * @param id - 要获取的缓存键\n * @returns 如果找到且未过期则返回缓存数据,否则返回null\n */\n get(id: string): Cached<T> | null {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n const cachedString = storage.getItem(fullId);\n if (!cachedString) return null;\n\n const cached = JSON.parse(cachedString);\n\n if (cached.createdAt + cached.maxAge < Date.now()) {\n this.del(id);\n return null;\n }\n\n return cached;\n } catch (e) {\n return null;\n }\n }\n\n /**\n * 将数据存储到缓存中\n * @param id - 存储数据使用的缓存键\n * @param data - 要缓存的数据\n * @param options - 可选的缓存配置\n * @returns 成功返回true,存储失败返回false\n */\n set(id: string, data: T, options?: CacheOptions) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.setItem(\n fullId,\n JSON.stringify({\n id,\n data,\n createdAt: Date.now(),\n maxAge: options?.maxAge || 0,\n }),\n );\n } catch (cause) {\n //\n }\n }\n\n /**\n * 通过ID删除缓存数据\n * @param id - 要删除的缓存键\n */\n del(id: string) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.removeItem(fullId);\n } catch (cause) {\n //\n }\n }\n\n clear() {\n try {\n this.storage.clear();\n } catch (err) {\n //\n }\n }\n}\n\n/**\n * 创建一个使用 localStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 localStorage 的新 StorageCache 实例\n */\nexport function createLocalCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(localStorage, namespace);\n}\n\n/**\n * 创建一个使用 sessionStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 sessionStorage 的新 StorageCache 实例\n */\nexport function createSessionCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(sessionStorage, namespace);\n}\n"],"names":[],"mappings":";AAOO,MAAM,qBAAwB,cAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpD,YACW,SACA,YAAY,IACrB;AACM,UAAA;AAHG,SAAA,UAAA;AACA,SAAA,YAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUX,IAAI,IAA8B;AAC1B,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACI,YAAA,eAAe,QAAQ,QAAQ,MAAM;AACvC,UAAA,CAAC,aAAqB,QAAA;AAEpB,YAAA,SAAS,KAAK,MAAM,YAAY;AAEtC,UAAI,OAAO,YAAY,OAAO,SAAS,KAAK,OAAO;AACjD,aAAK,IAAI,EAAE;AACJ,eAAA;AAAA,MAAA;AAGF,aAAA;AAAA,aACA,GAAG;AACH,aAAA;AAAA,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUF,IAAI,IAAY,MAAS,SAAwB;AACzC,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACM,cAAA;AAAA,QACN;AAAA,QACA,KAAK,UAAU;AAAA,UACb;AAAA,UACA;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB,SAAQ,mCAAS,WAAU;AAAA,QAC5B,CAAA;AAAA,MACH;AAAA,aACO,OAAO;AAAA,IAAA;AAAA,EAEhB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,IAAI,IAAY;AACR,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACF,cAAQ,WAAW,MAAM;AAAA,aAClB,OAAO;AAAA,IAAA;AAAA,EAEhB;AAAA,EAGF,QAAQ;AACF,QAAA;AACF,WAAK,QAAQ,MAAM;AAAA,aACZ,KAAK;AAAA,IAAA;AAAA,EAEd;AAEJ;AAQO,SAAS,iBAAoB,WAAsC;AACjE,SAAA,IAAI,aAAgB,cAAc,SAAS;AACpD;AAQO,SAAS,mBAAsB,WAAsC;AACnE,SAAA,IAAI,aAAgB,gBAAgB,SAAS;AACtD;"}
|
package/dist/cookie.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookie.cjs","sources":["../src/cookie.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"cookie.cjs","sources":["../src/cookie.ts"],"sourcesContent":["import type { DateValue } from '@cloudcome/utils-core/date';\nimport { dateParse } from '@cloudcome/utils-core/date';\n\n/**\n * 获取指定名称的 Cookie 值。\n * @param {string} name - Cookie 的名称。\n * @returns {string} - 返回对应的 Cookie 值,如果不存在则返回空字符串。\n */\nexport function cookieGet(name: string) {\n const cookies = document.cookie.split(';');\n\n for (let i = 0; i < cookies.length; i++) {\n const cookie = cookies[i].trim();\n\n if (cookie.startsWith(`${name}=`)) {\n return decodeURIComponent(cookie.slice(name.length + 1));\n }\n }\n\n return '';\n}\n\n/**\n * 设置 Cookie。\n * @param {string} name - Cookie 的名称。\n * @param {string} value - Cookie 的值。\n * @param {CookieOptions} [options] - 可选的 Cookie 配置项。\n */\nexport type CookieOptions = {\n /**\n * Cookie 的过期时间,可以是日期字符串、时间戳或 `Date` 对象。\n */\n expires?: DateValue;\n\n /**\n * Cookie 的路径,默认为当前路径。\n */\n path?: string;\n\n /**\n * Cookie 的域名,默认为当前域名。\n */\n domain?: string;\n\n /**\n * 是否启用安全传输(HTTPS)。\n */\n secure?: boolean;\n\n /**\n * SameSite 属性,可选值为 `'strict'`、`'lax'` 或 `'none'`。\n */\n sameSite?: 'strict' | 'lax' | 'none';\n\n /**\n * 是否启用 HttpOnly 标志,防止 JavaScript 访问。\n */\n httpOnly?: boolean;\n\n /**\n * Cookie 的最大存活时间(秒)。\n */\n maxAge?: number;\n};\n\n/**\n * 设置 Cookie。\n * @param {string} name - Cookie 的名称。\n * @param {string} value - Cookie 的值。\n * @param {CookieOptions} [options] - 可选的 Cookie 配置项。\n */\nexport function cookieSet(name: string, value: string, options?: CookieOptions) {\n const { expires, maxAge, path, domain, httpOnly, sameSite, secure } = options || {};\n let cookie = `${name}=${encodeURIComponent(value)}`;\n\n const expiresAt = expires ? dateParse(expires) : maxAge ? dateParse(Date.now() + maxAge) : null;\n const metas: [string, string][] = [];\n\n if (expiresAt) {\n metas.push(['expires', expiresAt.toISOString()]);\n }\n\n if (path) {\n metas.push(['path', path]);\n }\n\n if (domain) {\n metas.push(['domain', domain]);\n }\n\n if (httpOnly) {\n metas.push(['httpOnly', 'true']);\n }\n\n if (sameSite) {\n metas.push(['sameSite', sameSite]);\n }\n\n if (secure) {\n metas.push(['secure', 'true']);\n }\n\n for (const [key, value] of metas) {\n cookie += `; ${key}=${value}`;\n }\n\n document.cookie = cookie;\n}\n\n/**\n * 删除指定名称的 Cookie。\n * @param {string} name - 要删除的 Cookie 名称。\n */\nexport function cookieDel(name: string) {\n cookieSet(name, '', {\n expires: 0,\n });\n}\n"],"names":["dateParse","value"],"mappings":";;;AAQO,SAAS,UAAU,MAAc;AACtC,QAAM,UAAU,SAAS,OAAO,MAAM,GAAG;AAEzC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,SAAS,QAAQ,CAAC,EAAE,KAAK;AAE/B,QAAI,OAAO,WAAW,GAAG,IAAI,GAAG,GAAG;AACjC,aAAO,mBAAmB,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC;AAAA,IAAA;AAAA,EACzD;AAGK,SAAA;AACT;AAmDgB,SAAA,UAAU,MAAc,OAAe,SAAyB;AACxE,QAAA,EAAE,SAAS,QAAQ,MAAM,QAAQ,UAAU,UAAU,WAAW,WAAW,CAAC;AAClF,MAAI,SAAS,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC;AAE3C,QAAA,YAAY,UAAUA,KAAA,UAAU,OAAO,IAAI,SAASA,KAAA,UAAU,KAAK,QAAQ,MAAM,IAAI;AAC3F,QAAM,QAA4B,CAAC;AAEnC,MAAI,WAAW;AACb,UAAM,KAAK,CAAC,WAAW,UAAU,YAAa,CAAA,CAAC;AAAA,EAAA;AAGjD,MAAI,MAAM;AACR,UAAM,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,EAAA;AAG3B,MAAI,QAAQ;AACV,UAAM,KAAK,CAAC,UAAU,MAAM,CAAC;AAAA,EAAA;AAG/B,MAAI,UAAU;AACZ,UAAM,KAAK,CAAC,YAAY,MAAM,CAAC;AAAA,EAAA;AAGjC,MAAI,UAAU;AACZ,UAAM,KAAK,CAAC,YAAY,QAAQ,CAAC;AAAA,EAAA;AAGnC,MAAI,QAAQ;AACV,UAAM,KAAK,CAAC,UAAU,MAAM,CAAC;AAAA,EAAA;AAG/B,aAAW,CAAC,KAAKC,MAAK,KAAK,OAAO;AACtB,cAAA,KAAK,GAAG,IAAIA,MAAK;AAAA,EAAA;AAG7B,WAAS,SAAS;AACpB;AAMO,SAAS,UAAU,MAAc;AACtC,YAAU,MAAM,IAAI;AAAA,IAClB,SAAS;AAAA,EAAA,CACV;AACH;;;;"}
|
package/dist/cookie.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DateValue } from '@cloudcome/utils-core/date';
|
|
2
2
|
/**
|
|
3
3
|
* 获取指定名称的 Cookie 值。
|
|
4
4
|
* @param {string} name - Cookie 的名称。
|
|
@@ -15,7 +15,7 @@ export type CookieOptions = {
|
|
|
15
15
|
/**
|
|
16
16
|
* Cookie 的过期时间,可以是日期字符串、时间戳或 `Date` 对象。
|
|
17
17
|
*/
|
|
18
|
-
expires?:
|
|
18
|
+
expires?: DateValue;
|
|
19
19
|
/**
|
|
20
20
|
* Cookie 的路径,默认为当前路径。
|
|
21
21
|
*/
|
package/dist/cookie.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookie.mjs","sources":["../src/cookie.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"cookie.mjs","sources":["../src/cookie.ts"],"sourcesContent":["import type { DateValue } from '@cloudcome/utils-core/date';\nimport { dateParse } from '@cloudcome/utils-core/date';\n\n/**\n * 获取指定名称的 Cookie 值。\n * @param {string} name - Cookie 的名称。\n * @returns {string} - 返回对应的 Cookie 值,如果不存在则返回空字符串。\n */\nexport function cookieGet(name: string) {\n const cookies = document.cookie.split(';');\n\n for (let i = 0; i < cookies.length; i++) {\n const cookie = cookies[i].trim();\n\n if (cookie.startsWith(`${name}=`)) {\n return decodeURIComponent(cookie.slice(name.length + 1));\n }\n }\n\n return '';\n}\n\n/**\n * 设置 Cookie。\n * @param {string} name - Cookie 的名称。\n * @param {string} value - Cookie 的值。\n * @param {CookieOptions} [options] - 可选的 Cookie 配置项。\n */\nexport type CookieOptions = {\n /**\n * Cookie 的过期时间,可以是日期字符串、时间戳或 `Date` 对象。\n */\n expires?: DateValue;\n\n /**\n * Cookie 的路径,默认为当前路径。\n */\n path?: string;\n\n /**\n * Cookie 的域名,默认为当前域名。\n */\n domain?: string;\n\n /**\n * 是否启用安全传输(HTTPS)。\n */\n secure?: boolean;\n\n /**\n * SameSite 属性,可选值为 `'strict'`、`'lax'` 或 `'none'`。\n */\n sameSite?: 'strict' | 'lax' | 'none';\n\n /**\n * 是否启用 HttpOnly 标志,防止 JavaScript 访问。\n */\n httpOnly?: boolean;\n\n /**\n * Cookie 的最大存活时间(秒)。\n */\n maxAge?: number;\n};\n\n/**\n * 设置 Cookie。\n * @param {string} name - Cookie 的名称。\n * @param {string} value - Cookie 的值。\n * @param {CookieOptions} [options] - 可选的 Cookie 配置项。\n */\nexport function cookieSet(name: string, value: string, options?: CookieOptions) {\n const { expires, maxAge, path, domain, httpOnly, sameSite, secure } = options || {};\n let cookie = `${name}=${encodeURIComponent(value)}`;\n\n const expiresAt = expires ? dateParse(expires) : maxAge ? dateParse(Date.now() + maxAge) : null;\n const metas: [string, string][] = [];\n\n if (expiresAt) {\n metas.push(['expires', expiresAt.toISOString()]);\n }\n\n if (path) {\n metas.push(['path', path]);\n }\n\n if (domain) {\n metas.push(['domain', domain]);\n }\n\n if (httpOnly) {\n metas.push(['httpOnly', 'true']);\n }\n\n if (sameSite) {\n metas.push(['sameSite', sameSite]);\n }\n\n if (secure) {\n metas.push(['secure', 'true']);\n }\n\n for (const [key, value] of metas) {\n cookie += `; ${key}=${value}`;\n }\n\n document.cookie = cookie;\n}\n\n/**\n * 删除指定名称的 Cookie。\n * @param {string} name - 要删除的 Cookie 名称。\n */\nexport function cookieDel(name: string) {\n cookieSet(name, '', {\n expires: 0,\n });\n}\n"],"names":["value"],"mappings":";AAQO,SAAS,UAAU,MAAc;AACtC,QAAM,UAAU,SAAS,OAAO,MAAM,GAAG;AAEzC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,SAAS,QAAQ,CAAC,EAAE,KAAK;AAE/B,QAAI,OAAO,WAAW,GAAG,IAAI,GAAG,GAAG;AACjC,aAAO,mBAAmB,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC;AAAA,IAAA;AAAA,EACzD;AAGK,SAAA;AACT;AAmDgB,SAAA,UAAU,MAAc,OAAe,SAAyB;AACxE,QAAA,EAAE,SAAS,QAAQ,MAAM,QAAQ,UAAU,UAAU,WAAW,WAAW,CAAC;AAClF,MAAI,SAAS,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC;AAE3C,QAAA,YAAY,UAAU,UAAU,OAAO,IAAI,SAAS,UAAU,KAAK,QAAQ,MAAM,IAAI;AAC3F,QAAM,QAA4B,CAAC;AAEnC,MAAI,WAAW;AACb,UAAM,KAAK,CAAC,WAAW,UAAU,YAAa,CAAA,CAAC;AAAA,EAAA;AAGjD,MAAI,MAAM;AACR,UAAM,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,EAAA;AAG3B,MAAI,QAAQ;AACV,UAAM,KAAK,CAAC,UAAU,MAAM,CAAC;AAAA,EAAA;AAG/B,MAAI,UAAU;AACZ,UAAM,KAAK,CAAC,YAAY,MAAM,CAAC;AAAA,EAAA;AAGjC,MAAI,UAAU;AACZ,UAAM,KAAK,CAAC,YAAY,QAAQ,CAAC;AAAA,EAAA;AAGnC,MAAI,QAAQ;AACV,UAAM,KAAK,CAAC,UAAU,MAAM,CAAC;AAAA,EAAA;AAG/B,aAAW,CAAC,KAAKA,MAAK,KAAK,OAAO;AACtB,cAAA,KAAK,GAAG,IAAIA,MAAK;AAAA,EAAA;AAG7B,WAAS,SAAS;AACpB;AAMO,SAAS,UAAU,MAAc;AACtC,YAAU,MAAM,IAAI;AAAA,IAClB,SAAS;AAAA,EAAA,CACV;AACH;"}
|
package/dist/dom.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.cjs","sources":["../src/dom.ts"],"sourcesContent":["import { objectEach } from '@cloudcome/utils-core/object';\n\n/**\n * 表示 CSS 样式声明的类型,仅包含可用的字符串或数字类型的属性\n * @typedef {Object}
|
|
1
|
+
{"version":3,"file":"dom.cjs","sources":["../src/dom.ts"],"sourcesContent":["import { objectEach } from '@cloudcome/utils-core/object';\n\n/**\n * 表示 CSS 样式声明的类型,仅包含可用的字符串或数字类型的属性\n * @typedef {Object} Style\n * @property {string | number} [K] - CSS 样式属性,K 为 CSSStyleDeclaration 的键名,且值为字符串或数字类型\n */\nexport type Style = {\n [K in keyof CSSStyleDeclaration as K extends number\n ? never\n : CSSStyleDeclaration[K] extends string | number\n ? K\n : never]: CSSStyleDeclaration[K];\n};\n\n/**\n * 设置元素的样式\n * @param {HTMLElement} el - 需要设置样式的 HTML 元素\n * @param {string | Partial<Style> | Record<string, string>} style - 样式字符串或样式对象\n * @example\n * // 设置 body 元素的颜色为红色,并设置一个自定义变量\n * setStyle(document.body, { color: 'red', '--var': 'value' });\n * @example\n * // 使用字符串设置样式\n * setStyle(document.body, 'color: red; --var: value;');\n */\nexport function setStyle(el: HTMLElement, style: string | Partial<Style> | Record<string, string>) {\n if (typeof style === 'string') {\n el.style.cssText = style;\n } else {\n objectEach(style, (value, key) => {\n el.style.setProperty(key as string, value as string | null);\n });\n }\n}\n\n/**\n * 获取元素的指定样式值\n * @param {HTMLElement} el - 需要获取样式的 HTML 元素\n * @param {keyof Style} style - 需要获取的样式属性\n * @returns {string} 返回指定样式的值\n * @example\n * // 获取 body 元素的颜色\n * const color = getStyle(document.body, 'color');\n */\nexport function getStyle(el: HTMLElement, style: keyof Style) {\n return window.getComputedStyle(el).getPropertyValue(style);\n}\n"],"names":["objectEach"],"mappings":";;;AA0BgB,SAAA,SAAS,IAAiB,OAAyD;AAC7F,MAAA,OAAO,UAAU,UAAU;AAC7B,OAAG,MAAM,UAAU;AAAA,EAAA,OACd;AACMA,WAAAA,WAAA,OAAO,CAAC,OAAO,QAAQ;AAC7B,SAAA,MAAM,YAAY,KAAe,KAAsB;AAAA,IAAA,CAC3D;AAAA,EAAA;AAEL;AAWgB,SAAA,SAAS,IAAiB,OAAoB;AAC5D,SAAO,OAAO,iBAAiB,EAAE,EAAE,iBAAiB,KAAK;AAC3D;;;"}
|
package/dist/dom.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 表示 CSS 样式声明的类型,仅包含可用的字符串或数字类型的属性
|
|
3
|
-
* @typedef {Object}
|
|
3
|
+
* @typedef {Object} Style
|
|
4
4
|
* @property {string | number} [K] - CSS 样式属性,K 为 CSSStyleDeclaration 的键名,且值为字符串或数字类型
|
|
5
5
|
*/
|
|
6
|
-
export type
|
|
6
|
+
export type Style = {
|
|
7
7
|
[K in keyof CSSStyleDeclaration as K extends number ? never : CSSStyleDeclaration[K] extends string | number ? K : never]: CSSStyleDeclaration[K];
|
|
8
8
|
};
|
|
9
9
|
/**
|
|
10
10
|
* 设置元素的样式
|
|
11
11
|
* @param {HTMLElement} el - 需要设置样式的 HTML 元素
|
|
12
|
-
* @param {string | Partial<
|
|
12
|
+
* @param {string | Partial<Style> | Record<string, string>} style - 样式字符串或样式对象
|
|
13
13
|
* @example
|
|
14
14
|
* // 设置 body 元素的颜色为红色,并设置一个自定义变量
|
|
15
15
|
* setStyle(document.body, { color: 'red', '--var': 'value' });
|
|
@@ -17,14 +17,14 @@ export type TStyle = {
|
|
|
17
17
|
* // 使用字符串设置样式
|
|
18
18
|
* setStyle(document.body, 'color: red; --var: value;');
|
|
19
19
|
*/
|
|
20
|
-
export declare function setStyle(el: HTMLElement, style: string | Partial<
|
|
20
|
+
export declare function setStyle(el: HTMLElement, style: string | Partial<Style> | Record<string, string>): void;
|
|
21
21
|
/**
|
|
22
22
|
* 获取元素的指定样式值
|
|
23
23
|
* @param {HTMLElement} el - 需要获取样式的 HTML 元素
|
|
24
|
-
* @param {keyof
|
|
24
|
+
* @param {keyof Style} style - 需要获取的样式属性
|
|
25
25
|
* @returns {string} 返回指定样式的值
|
|
26
26
|
* @example
|
|
27
27
|
* // 获取 body 元素的颜色
|
|
28
28
|
* const color = getStyle(document.body, 'color');
|
|
29
29
|
*/
|
|
30
|
-
export declare function getStyle(el: HTMLElement, style: keyof
|
|
30
|
+
export declare function getStyle(el: HTMLElement, style: keyof Style): string;
|
package/dist/dom.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.mjs","sources":["../src/dom.ts"],"sourcesContent":["import { objectEach } from '@cloudcome/utils-core/object';\n\n/**\n * 表示 CSS 样式声明的类型,仅包含可用的字符串或数字类型的属性\n * @typedef {Object}
|
|
1
|
+
{"version":3,"file":"dom.mjs","sources":["../src/dom.ts"],"sourcesContent":["import { objectEach } from '@cloudcome/utils-core/object';\n\n/**\n * 表示 CSS 样式声明的类型,仅包含可用的字符串或数字类型的属性\n * @typedef {Object} Style\n * @property {string | number} [K] - CSS 样式属性,K 为 CSSStyleDeclaration 的键名,且值为字符串或数字类型\n */\nexport type Style = {\n [K in keyof CSSStyleDeclaration as K extends number\n ? never\n : CSSStyleDeclaration[K] extends string | number\n ? K\n : never]: CSSStyleDeclaration[K];\n};\n\n/**\n * 设置元素的样式\n * @param {HTMLElement} el - 需要设置样式的 HTML 元素\n * @param {string | Partial<Style> | Record<string, string>} style - 样式字符串或样式对象\n * @example\n * // 设置 body 元素的颜色为红色,并设置一个自定义变量\n * setStyle(document.body, { color: 'red', '--var': 'value' });\n * @example\n * // 使用字符串设置样式\n * setStyle(document.body, 'color: red; --var: value;');\n */\nexport function setStyle(el: HTMLElement, style: string | Partial<Style> | Record<string, string>) {\n if (typeof style === 'string') {\n el.style.cssText = style;\n } else {\n objectEach(style, (value, key) => {\n el.style.setProperty(key as string, value as string | null);\n });\n }\n}\n\n/**\n * 获取元素的指定样式值\n * @param {HTMLElement} el - 需要获取样式的 HTML 元素\n * @param {keyof Style} style - 需要获取的样式属性\n * @returns {string} 返回指定样式的值\n * @example\n * // 获取 body 元素的颜色\n * const color = getStyle(document.body, 'color');\n */\nexport function getStyle(el: HTMLElement, style: keyof Style) {\n return window.getComputedStyle(el).getPropertyValue(style);\n}\n"],"names":[],"mappings":";AA0BgB,SAAA,SAAS,IAAiB,OAAyD;AAC7F,MAAA,OAAO,UAAU,UAAU;AAC7B,OAAG,MAAM,UAAU;AAAA,EAAA,OACd;AACM,eAAA,OAAO,CAAC,OAAO,QAAQ;AAC7B,SAAA,MAAM,YAAY,KAAe,KAAsB;AAAA,IAAA,CAC3D;AAAA,EAAA;AAEL;AAWgB,SAAA,SAAS,IAAiB,OAAoB;AAC5D,SAAO,OAAO,iBAAiB,EAAE,EAAE,iBAAiB,KAAK;AAC3D;"}
|
package/dist/index.cjs
CHANGED
package/dist/index.mjs
CHANGED
package/dist/timer.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timer.cjs","sources":["../src/timer.ts"],"sourcesContent":["import { type
|
|
1
|
+
{"version":3,"file":"timer.cjs","sources":["../src/timer.ts"],"sourcesContent":["import { type TimerHandler, type TimerOptions, type TimerState, makeInterval } from '@cloudcome/utils-core/timer';\n\n/**\n * 创建一个基于 `requestAnimationFrame` 的间隔定时器\n *\n * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数\n * @param options - 配置选项\n * @returns {TimerHandler} 返回包含控制方法的对象\n */\nexport function frameInterval(\n callback: (state: TimerState, next?: () => void) => unknown,\n options?: TimerOptions,\n): TimerHandler {\n let rafId: number;\n const { canStart, start, canStop, stop, canPause, pause, canResume, resume, execute } = makeInterval((call) => {\n rafId = requestAnimationFrame(call);\n }, callback);\n\n return {\n start() {\n if (!canStart()) return;\n\n if (options?.leading) {\n start();\n } else {\n rafId = requestAnimationFrame(start);\n }\n },\n\n stop() {\n if (!canStop()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n stop();\n },\n\n pause() {\n if (!canPause()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n pause();\n },\n\n resume(immediate?: boolean) {\n if (!canResume()) return;\n\n if (immediate || options?.leading) {\n resume();\n } else {\n rafId = requestAnimationFrame(resume);\n }\n },\n };\n}\n"],"names":["makeInterval"],"mappings":";;;AASgB,SAAA,cACd,UACA,SACc;AACV,MAAA;AACJ,QAAM,EAAE,UAAU,OAAO,SAAS,MAAM,UAAU,OAAO,WAAW,QAAQ,QAAY,IAAAA,MAAA,aAAa,CAAC,SAAS;AAC7G,YAAQ,sBAAsB,IAAI;AAAA,KACjC,QAAQ;AAEJ,SAAA;AAAA,IACL,QAAQ;AACF,UAAA,CAAC,WAAY;AAEjB,UAAI,mCAAS,SAAS;AACd,cAAA;AAAA,MAAA,OACD;AACL,gBAAQ,sBAAsB,KAAK;AAAA,MAAA;AAAA,IAEvC;AAAA,IAEA,OAAO;AACD,UAAA,CAAC,UAAW;AACZ,UAAA,mCAAS,SAAkB,SAAA;AAE/B,2BAAqB,KAAK;AACrB,WAAA;AAAA,IACP;AAAA,IAEA,QAAQ;AACF,UAAA,CAAC,WAAY;AACb,UAAA,mCAAS,SAAkB,SAAA;AAE/B,2BAAqB,KAAK;AACpB,YAAA;AAAA,IACR;AAAA,IAEA,OAAO,WAAqB;AACtB,UAAA,CAAC,YAAa;AAEd,UAAA,cAAa,mCAAS,UAAS;AAC1B,eAAA;AAAA,MAAA,OACF;AACL,gBAAQ,sBAAsB,MAAM;AAAA,MAAA;AAAA,IACtC;AAAA,EAEJ;AACF;;"}
|
package/dist/timer.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TimerHandler, TimerOptions, TimerState } from '@cloudcome/utils-core/timer';
|
|
2
2
|
/**
|
|
3
3
|
* 创建一个基于 `requestAnimationFrame` 的间隔定时器
|
|
4
4
|
*
|
|
5
5
|
* @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数
|
|
6
6
|
* @param options - 配置选项
|
|
7
|
-
* @returns {
|
|
7
|
+
* @returns {TimerHandler} 返回包含控制方法的对象
|
|
8
8
|
*/
|
|
9
|
-
export declare function frameInterval(callback: (state:
|
|
9
|
+
export declare function frameInterval(callback: (state: TimerState, next?: () => void) => unknown, options?: TimerOptions): TimerHandler;
|
package/dist/timer.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timer.mjs","sources":["../src/timer.ts"],"sourcesContent":["import { type
|
|
1
|
+
{"version":3,"file":"timer.mjs","sources":["../src/timer.ts"],"sourcesContent":["import { type TimerHandler, type TimerOptions, type TimerState, makeInterval } from '@cloudcome/utils-core/timer';\n\n/**\n * 创建一个基于 `requestAnimationFrame` 的间隔定时器\n *\n * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数\n * @param options - 配置选项\n * @returns {TimerHandler} 返回包含控制方法的对象\n */\nexport function frameInterval(\n callback: (state: TimerState, next?: () => void) => unknown,\n options?: TimerOptions,\n): TimerHandler {\n let rafId: number;\n const { canStart, start, canStop, stop, canPause, pause, canResume, resume, execute } = makeInterval((call) => {\n rafId = requestAnimationFrame(call);\n }, callback);\n\n return {\n start() {\n if (!canStart()) return;\n\n if (options?.leading) {\n start();\n } else {\n rafId = requestAnimationFrame(start);\n }\n },\n\n stop() {\n if (!canStop()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n stop();\n },\n\n pause() {\n if (!canPause()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n pause();\n },\n\n resume(immediate?: boolean) {\n if (!canResume()) return;\n\n if (immediate || options?.leading) {\n resume();\n } else {\n rafId = requestAnimationFrame(resume);\n }\n },\n };\n}\n"],"names":[],"mappings":";AASgB,SAAA,cACd,UACA,SACc;AACV,MAAA;AACJ,QAAM,EAAE,UAAU,OAAO,SAAS,MAAM,UAAU,OAAO,WAAW,QAAQ,QAAY,IAAA,aAAa,CAAC,SAAS;AAC7G,YAAQ,sBAAsB,IAAI;AAAA,KACjC,QAAQ;AAEJ,SAAA;AAAA,IACL,QAAQ;AACF,UAAA,CAAC,WAAY;AAEjB,UAAI,mCAAS,SAAS;AACd,cAAA;AAAA,MAAA,OACD;AACL,gBAAQ,sBAAsB,KAAK;AAAA,MAAA;AAAA,IAEvC;AAAA,IAEA,OAAO;AACD,UAAA,CAAC,UAAW;AACZ,UAAA,mCAAS,SAAkB,SAAA;AAE/B,2BAAqB,KAAK;AACrB,WAAA;AAAA,IACP;AAAA,IAEA,QAAQ;AACF,UAAA,CAAC,WAAY;AACb,UAAA,mCAAS,SAAkB,SAAA;AAE/B,2BAAqB,KAAK;AACpB,YAAA;AAAA,IACR;AAAA,IAEA,OAAO,WAAqB;AACtB,UAAA,CAAC,YAAa;AAEd,UAAA,cAAa,mCAAS,UAAS;AAC1B,eAAA;AAAA,MAAA,OACF;AACL,gBAAQ,sBAAsB,MAAM;AAAA,MAAA;AAAA,IACtC;AAAA,EAEJ;AACF;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudcome/utils-browser",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "cloudcome utils for browser",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22"
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"dist"
|
|
107
107
|
],
|
|
108
108
|
"dependencies": {
|
|
109
|
-
"@cloudcome/utils-core": "1.2.
|
|
109
|
+
"@cloudcome/utils-core": "~1.2.2"
|
|
110
110
|
},
|
|
111
111
|
"repository": {
|
|
112
112
|
"type": "git",
|