@cgboiler/core 1.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/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # @cgboiler/core
2
+
3
+ 一个现代化的 TypeScript 工具库,提供常用的工具函数集合。
4
+
5
+ ## 特性
6
+
7
+ - 🚀 使用 TypeScript 编写,提供完整的类型定义
8
+ - 📦 支持 Tree Shaking,只打包使用的代码
9
+ - 🔧 支持 ESM 和 CommonJS 两种模块格式
10
+ - 📚 详细的文档和类型注释
11
+ - ✅ 完整的测试覆盖
12
+
13
+ ## 安装
14
+
15
+ ```bash
16
+ npm install @cgboiler/core
17
+
18
+ # 或者使用 yarn
19
+ yarn add @cgboiler/core
20
+
21
+ # 或者使用 pnpm
22
+ pnpm add @cgboiler/core
23
+ ```
24
+
25
+ ## 使用
26
+
27
+ ```typescript
28
+ import { capitalize, unique, deepClone } from '@cgboiler/core';
29
+
30
+ // 字符串操作
31
+ console.log(capitalize('hello')); // 'Hello'
32
+
33
+ // 数组操作
34
+ console.log(unique([1, 1, 2, 2, 3])); // [1, 2, 3]
35
+
36
+ // 对象操作
37
+ const obj = { a: 1, b: { c: 2 } };
38
+ const cloned = deepClone(obj);
39
+ ```
40
+
41
+ ## API 文档
42
+
43
+ ### 字符串工具
44
+
45
+ - `capitalize(str: string): string` - 将字符串的首字母转换为大写
46
+ - `camelToKebab(str: string): string` - 将驼峰命名转换为短横线命名
47
+ - `kebabToCamel(str: string): string` - 将短横线命名转换为驼峰命名
48
+
49
+ ### 数组工具
50
+
51
+ - `unique<T>(arr: T[]): T[]` - 数组去重
52
+ - `groupBy<T>(arr: T[], key: keyof T): Record<string, T[]>` - 数组分组
53
+ - `flatten<T>(arr: (T | T[])[]): T[]` - 数组扁平化
54
+
55
+ ### 对象工具
56
+
57
+ - `deepClone<T>(obj: T): T` - 深拷贝对象
58
+ - `flattenObject(obj: Record<string, any>, prefix?: string): Record<string, any>` - 对象扁平化
59
+ - `pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>` - 选择对象中的指定属性
60
+
61
+ ## 开发
62
+
63
+ ```bash
64
+ # 安装依赖
65
+ pnpm install
66
+
67
+ # 开发模式
68
+ pnpm dev
69
+
70
+ # 构建
71
+ pnpm build
72
+
73
+ # 运行测试
74
+ pnpm test
75
+
76
+ # 代码格式化
77
+ pnpm format
78
+
79
+ # 代码检查
80
+ pnpm lint
81
+ ```
82
+
83
+ ## License
84
+
85
+ MIT
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var o=require('localforage');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var o__default=/*#__PURE__*/_interopDefault(o);o__default.default.config({name:"cgx",storeName:"cgx_store",driver:[o__default.default.INDEXEDDB,o__default.default.LOCALSTORAGE]});var s=async(r,t)=>{try{await o__default.default.setItem(r,t);}catch(e){console.error("Error saving data:",e);}},g=async r=>{try{return await o__default.default.getItem(r)}catch(t){return console.error("Error getting data:",t),null}},m=async r=>{try{await o__default.default.removeItem(r);}catch(t){console.error("Error removing data:",t);}},S=async()=>{try{await o__default.default.clear();}catch(r){console.error("Error clearing data:",r);}};var n="user_info",T=async r=>{await s(n,r);},u=async r=>{let t=await p();await s(n,{...t,token:r});},l=async()=>(await g(n))?.token,p=async()=>await g(n)||{},P=async r=>{let t=await p();await s(n,{...t,...r});},E=async()=>{await m(n);};var F=async(r,t={})=>{let{params:e,...c}=t,a=e?"?"+Object.entries(e).map(([I,w])=>`${I}=${encodeURIComponent(String(w))}`).join("&"):"",f=r+a,h=await l(),i=await fetch(f,{...c,headers:{"Content-Type":"application/json",token:h||"",...c.headers}});if(!i.ok)throw new Error(`HTTP error! status: ${i.status}`);return await i.json()};var y=()=>{let t=new URLSearchParams(window.location.search).get("token");if(console.log("tokenFromSearch: ",t),t)return t;let e=window.location.hash;if(e){let a=(e.startsWith("#")?e.substring(1):e).match(/\?(.*)/);if(a&&a[1])return new URLSearchParams(a[1]).get("token")}return null},O=async()=>{let r=y();r&&await u(r);};exports.clearStorage=S;exports.clearUserInfo=E;exports.getStorage=g;exports.getUserInfo=p;exports.getUserToken=l;exports.initApp=O;exports.initUserInfo=T;exports.removeStorage=m;exports.setStorage=s;exports.setUserToken=u;exports.updateUserInfo=P;exports.useFetch=F;//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/storage.ts","../src/utils/user.ts","../src/utils/fetch.ts","../src/utils/initApp.ts"],"names":["localforage","setStorage","key","value","error","getStorage","removeStorage","clearStorage","USER_INFO_KEY","initUserInfo","info","setUserToken","token","userInfo","getUserInfo","getUserToken","updateUserInfo","currentInfo","clearUserInfo","useFetch","url","config","params","restConfig","queryString","finalUrl","response","getTokenFromUrl","tokenFromSearch","hash","queryStringMatch","initApp","urlToken"],"mappings":"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","file":"index.cjs","sourcesContent":["import localforage from 'localforage';\n\n// 配置localforage\nlocalforage.config({\n name: 'cgx',\n storeName: 'cgx_store',\n driver: [\n localforage.INDEXEDDB,\n localforage.LOCALSTORAGE,\n ],\n});\n\n// 存储数据\nexport const setStorage = async (key: string, value: any) => {\n try {\n await localforage.setItem(key, value);\n } catch (error) {\n console.error('Error saving data:', error);\n }\n};\n\n// 获取数据\nexport const getStorage = async <T>(key: string): Promise<T | null> => {\n try {\n const value = await localforage.getItem<T>(key);\n return value;\n } catch (error) {\n console.error('Error getting data:', error);\n return null;\n }\n};\n\n// 删除数据\nexport const removeStorage = async (key: string) => {\n try {\n await localforage.removeItem(key);\n } catch (error) {\n console.error('Error removing data:', error);\n }\n};\n\n// 清空所有数据\nexport const clearStorage = async () => {\n try {\n await localforage.clear();\n } catch (error) {\n console.error('Error clearing data:', error);\n }\n};","/**\n * 用户信息管理模块\n */\nimport { getStorage, setStorage, removeStorage } from './storage';\n\ninterface UserInfo {\n token?: string;\n [key: string]: any;\n}\n\nconst USER_INFO_KEY = 'user_info';\n\n/**\n * 初始化用户信息\n * @param info 用户信息对象\n */\nexport const initUserInfo = async (info: UserInfo) => {\n await setStorage(USER_INFO_KEY, info);\n};\n\n/**\n * 设置用户token\n * @param token 用户token\n */\nexport const setUserToken = async (token: string) => {\n const userInfo = await getUserInfo();\n await setStorage(USER_INFO_KEY, { ...userInfo, token });\n};\n\n/**\n * 获取用户token\n * @returns 用户token\n */\nexport const getUserToken = async (): Promise<string | undefined> => {\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\n return userInfo?.token;\n};\n\n/**\n * 获取用户信息\n * @returns 用户信息对象\n */\nexport const getUserInfo = async (): Promise<UserInfo> => {\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\n return userInfo || {};\n};\n\n/**\n * 更新用户信息\n * @param info 要更新的用户信息字段\n */\nexport const updateUserInfo = async (info: Partial<UserInfo>) => {\n const currentInfo = await getUserInfo();\n await setStorage(USER_INFO_KEY, { ...currentInfo, ...info });\n};\n\n/**\n * 清除用户信息\n */\nexport const clearUserInfo = async () => {\n await removeStorage(USER_INFO_KEY);\n};","import { getUserToken } from './user';\n\ninterface FetchConfig extends RequestInit {\n params?: Record<string, any>;\n}\n\nexport const useFetch = async <T>(url: string, config: FetchConfig = {}) => {\n const { params, ...restConfig } = config;\n\n // 处理查询参数\n const queryString = params\n ? '?' +\n Object.entries(params)\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\n .join('&')\n : '';\n\n const finalUrl = url + queryString;\n\n // 从 user.ts 获取 token\n const token = await getUserToken();\n\n // 发送请求\n const response = await fetch(finalUrl, {\n ...restConfig,\n headers: {\n 'Content-Type': 'application/json',\n token: token || '',\n ...restConfig.headers,\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n return data as T;\n};\n","import { getUserInfo, setUserToken } from './user';\n\nexport interface UserInfo {\n // 用户信息接口\n token: string;\n}\n\n// 从URL中获取token参数\nconst getTokenFromUrl = (): string | null => {\n const urlParamsSearch = new URLSearchParams(window.location.search);\n const tokenFromSearch = urlParamsSearch.get('token');\n\n console.log('tokenFromSearch: ', tokenFromSearch);\n if (tokenFromSearch) {\n return tokenFromSearch;\n }\n\n // Check hash fragment\n const hash = window.location.hash;\n if (hash) {\n // Remove the leading # if present\n const hashContent = hash.startsWith('#') ? hash.substring(1) : hash;\n // Check if the hash content contains a query string part\n const queryStringMatch = hashContent.match(/\\?(.*)/);\n if (queryStringMatch && queryStringMatch[1]) {\n const urlParamsHash = new URLSearchParams(queryStringMatch[1]);\n return urlParamsHash.get('token');\n }\n }\n\n return null;\n};\n\n// 初始化应用\nexport const initApp = async () => {\n // 从URL中获取token参数并更新用户信息\n const urlToken = getTokenFromUrl();\n if (urlToken) {\n await setUserToken(urlToken);\n }\n};\n"]}
@@ -0,0 +1,50 @@
1
+ interface FetchConfig extends RequestInit {
2
+ params?: Record<string, any>;
3
+ }
4
+ declare const useFetch: <T>(url: string, config?: FetchConfig) => Promise<T>;
5
+
6
+ interface UserInfo$1 {
7
+ token: string;
8
+ }
9
+ declare const initApp: () => Promise<void>;
10
+
11
+ declare const setStorage: (key: string, value: any) => Promise<void>;
12
+ declare const getStorage: <T>(key: string) => Promise<T | null>;
13
+ declare const removeStorage: (key: string) => Promise<void>;
14
+ declare const clearStorage: () => Promise<void>;
15
+
16
+ interface UserInfo {
17
+ token?: string;
18
+ [key: string]: any;
19
+ }
20
+ /**
21
+ * 初始化用户信息
22
+ * @param info 用户信息对象
23
+ */
24
+ declare const initUserInfo: (info: UserInfo) => Promise<void>;
25
+ /**
26
+ * 设置用户token
27
+ * @param token 用户token
28
+ */
29
+ declare const setUserToken: (token: string) => Promise<void>;
30
+ /**
31
+ * 获取用户token
32
+ * @returns 用户token
33
+ */
34
+ declare const getUserToken: () => Promise<string | undefined>;
35
+ /**
36
+ * 获取用户信息
37
+ * @returns 用户信息对象
38
+ */
39
+ declare const getUserInfo: () => Promise<UserInfo>;
40
+ /**
41
+ * 更新用户信息
42
+ * @param info 要更新的用户信息字段
43
+ */
44
+ declare const updateUserInfo: (info: Partial<UserInfo>) => Promise<void>;
45
+ /**
46
+ * 清除用户信息
47
+ */
48
+ declare const clearUserInfo: () => Promise<void>;
49
+
50
+ export { type UserInfo$1 as UserInfo, clearStorage, clearUserInfo, getStorage, getUserInfo, getUserToken, initApp, initUserInfo, removeStorage, setStorage, setUserToken, updateUserInfo, useFetch };
@@ -0,0 +1,50 @@
1
+ interface FetchConfig extends RequestInit {
2
+ params?: Record<string, any>;
3
+ }
4
+ declare const useFetch: <T>(url: string, config?: FetchConfig) => Promise<T>;
5
+
6
+ interface UserInfo$1 {
7
+ token: string;
8
+ }
9
+ declare const initApp: () => Promise<void>;
10
+
11
+ declare const setStorage: (key: string, value: any) => Promise<void>;
12
+ declare const getStorage: <T>(key: string) => Promise<T | null>;
13
+ declare const removeStorage: (key: string) => Promise<void>;
14
+ declare const clearStorage: () => Promise<void>;
15
+
16
+ interface UserInfo {
17
+ token?: string;
18
+ [key: string]: any;
19
+ }
20
+ /**
21
+ * 初始化用户信息
22
+ * @param info 用户信息对象
23
+ */
24
+ declare const initUserInfo: (info: UserInfo) => Promise<void>;
25
+ /**
26
+ * 设置用户token
27
+ * @param token 用户token
28
+ */
29
+ declare const setUserToken: (token: string) => Promise<void>;
30
+ /**
31
+ * 获取用户token
32
+ * @returns 用户token
33
+ */
34
+ declare const getUserToken: () => Promise<string | undefined>;
35
+ /**
36
+ * 获取用户信息
37
+ * @returns 用户信息对象
38
+ */
39
+ declare const getUserInfo: () => Promise<UserInfo>;
40
+ /**
41
+ * 更新用户信息
42
+ * @param info 要更新的用户信息字段
43
+ */
44
+ declare const updateUserInfo: (info: Partial<UserInfo>) => Promise<void>;
45
+ /**
46
+ * 清除用户信息
47
+ */
48
+ declare const clearUserInfo: () => Promise<void>;
49
+
50
+ export { type UserInfo$1 as UserInfo, clearStorage, clearUserInfo, getStorage, getUserInfo, getUserToken, initApp, initUserInfo, removeStorage, setStorage, setUserToken, updateUserInfo, useFetch };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import o from'localforage';o.config({name:"cgx",storeName:"cgx_store",driver:[o.INDEXEDDB,o.LOCALSTORAGE]});var s=async(r,t)=>{try{await o.setItem(r,t);}catch(e){console.error("Error saving data:",e);}},g=async r=>{try{return await o.getItem(r)}catch(t){return console.error("Error getting data:",t),null}},m=async r=>{try{await o.removeItem(r);}catch(t){console.error("Error removing data:",t);}},S=async()=>{try{await o.clear();}catch(r){console.error("Error clearing data:",r);}};var n="user_info",T=async r=>{await s(n,r);},u=async r=>{let t=await p();await s(n,{...t,token:r});},l=async()=>(await g(n))?.token,p=async()=>await g(n)||{},P=async r=>{let t=await p();await s(n,{...t,...r});},E=async()=>{await m(n);};var F=async(r,t={})=>{let{params:e,...c}=t,a=e?"?"+Object.entries(e).map(([I,w])=>`${I}=${encodeURIComponent(String(w))}`).join("&"):"",f=r+a,h=await l(),i=await fetch(f,{...c,headers:{"Content-Type":"application/json",token:h||"",...c.headers}});if(!i.ok)throw new Error(`HTTP error! status: ${i.status}`);return await i.json()};var y=()=>{let t=new URLSearchParams(window.location.search).get("token");if(console.log("tokenFromSearch: ",t),t)return t;let e=window.location.hash;if(e){let a=(e.startsWith("#")?e.substring(1):e).match(/\?(.*)/);if(a&&a[1])return new URLSearchParams(a[1]).get("token")}return null},O=async()=>{let r=y();r&&await u(r);};export{S as clearStorage,E as clearUserInfo,g as getStorage,p as getUserInfo,l as getUserToken,O as initApp,T as initUserInfo,m as removeStorage,s as setStorage,u as setUserToken,P as updateUserInfo,F as useFetch};//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/storage.ts","../src/utils/user.ts","../src/utils/fetch.ts","../src/utils/initApp.ts"],"names":["localforage","setStorage","key","value","error","getStorage","removeStorage","clearStorage","USER_INFO_KEY","initUserInfo","info","setUserToken","token","userInfo","getUserInfo","getUserToken","updateUserInfo","currentInfo","clearUserInfo","useFetch","url","config","params","restConfig","queryString","finalUrl","response","getTokenFromUrl","tokenFromSearch","hash","queryStringMatch","initApp","urlToken"],"mappings":"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","file":"index.js","sourcesContent":["import localforage from 'localforage';\n\n// 配置localforage\nlocalforage.config({\n name: 'cgx',\n storeName: 'cgx_store',\n driver: [\n localforage.INDEXEDDB,\n localforage.LOCALSTORAGE,\n ],\n});\n\n// 存储数据\nexport const setStorage = async (key: string, value: any) => {\n try {\n await localforage.setItem(key, value);\n } catch (error) {\n console.error('Error saving data:', error);\n }\n};\n\n// 获取数据\nexport const getStorage = async <T>(key: string): Promise<T | null> => {\n try {\n const value = await localforage.getItem<T>(key);\n return value;\n } catch (error) {\n console.error('Error getting data:', error);\n return null;\n }\n};\n\n// 删除数据\nexport const removeStorage = async (key: string) => {\n try {\n await localforage.removeItem(key);\n } catch (error) {\n console.error('Error removing data:', error);\n }\n};\n\n// 清空所有数据\nexport const clearStorage = async () => {\n try {\n await localforage.clear();\n } catch (error) {\n console.error('Error clearing data:', error);\n }\n};","/**\n * 用户信息管理模块\n */\nimport { getStorage, setStorage, removeStorage } from './storage';\n\ninterface UserInfo {\n token?: string;\n [key: string]: any;\n}\n\nconst USER_INFO_KEY = 'user_info';\n\n/**\n * 初始化用户信息\n * @param info 用户信息对象\n */\nexport const initUserInfo = async (info: UserInfo) => {\n await setStorage(USER_INFO_KEY, info);\n};\n\n/**\n * 设置用户token\n * @param token 用户token\n */\nexport const setUserToken = async (token: string) => {\n const userInfo = await getUserInfo();\n await setStorage(USER_INFO_KEY, { ...userInfo, token });\n};\n\n/**\n * 获取用户token\n * @returns 用户token\n */\nexport const getUserToken = async (): Promise<string | undefined> => {\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\n return userInfo?.token;\n};\n\n/**\n * 获取用户信息\n * @returns 用户信息对象\n */\nexport const getUserInfo = async (): Promise<UserInfo> => {\n const userInfo = await getStorage<UserInfo>(USER_INFO_KEY);\n return userInfo || {};\n};\n\n/**\n * 更新用户信息\n * @param info 要更新的用户信息字段\n */\nexport const updateUserInfo = async (info: Partial<UserInfo>) => {\n const currentInfo = await getUserInfo();\n await setStorage(USER_INFO_KEY, { ...currentInfo, ...info });\n};\n\n/**\n * 清除用户信息\n */\nexport const clearUserInfo = async () => {\n await removeStorage(USER_INFO_KEY);\n};","import { getUserToken } from './user';\n\ninterface FetchConfig extends RequestInit {\n params?: Record<string, any>;\n}\n\nexport const useFetch = async <T>(url: string, config: FetchConfig = {}) => {\n const { params, ...restConfig } = config;\n\n // 处理查询参数\n const queryString = params\n ? '?' +\n Object.entries(params)\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\n .join('&')\n : '';\n\n const finalUrl = url + queryString;\n\n // 从 user.ts 获取 token\n const token = await getUserToken();\n\n // 发送请求\n const response = await fetch(finalUrl, {\n ...restConfig,\n headers: {\n 'Content-Type': 'application/json',\n token: token || '',\n ...restConfig.headers,\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n return data as T;\n};\n","import { getUserInfo, setUserToken } from './user';\n\nexport interface UserInfo {\n // 用户信息接口\n token: string;\n}\n\n// 从URL中获取token参数\nconst getTokenFromUrl = (): string | null => {\n const urlParamsSearch = new URLSearchParams(window.location.search);\n const tokenFromSearch = urlParamsSearch.get('token');\n\n console.log('tokenFromSearch: ', tokenFromSearch);\n if (tokenFromSearch) {\n return tokenFromSearch;\n }\n\n // Check hash fragment\n const hash = window.location.hash;\n if (hash) {\n // Remove the leading # if present\n const hashContent = hash.startsWith('#') ? hash.substring(1) : hash;\n // Check if the hash content contains a query string part\n const queryStringMatch = hashContent.match(/\\?(.*)/);\n if (queryStringMatch && queryStringMatch[1]) {\n const urlParamsHash = new URLSearchParams(queryStringMatch[1]);\n return urlParamsHash.get('token');\n }\n }\n\n return null;\n};\n\n// 初始化应用\nexport const initApp = async () => {\n // 从URL中获取token参数并更新用户信息\n const urlToken = getTokenFromUrl();\n if (urlToken) {\n await setUserToken(urlToken);\n }\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@cgboiler/core",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "publishConfig": {
12
+ "access": "public",
13
+ "registry": "https://registry.npmjs.org/"
14
+ },
15
+ "devDependencies": {
16
+ "@types/node": "^22.10.0",
17
+ "@vitest/coverage-v8": "^3.0.0",
18
+ "prettier": "^3.1.0",
19
+ "tsup": "^8.0.0",
20
+ "typescript": "^5.3.2",
21
+ "vitest": "^3.0.0"
22
+ },
23
+ "dependencies": {
24
+ "localforage": "^1.10.0"
25
+ },
26
+ "browserslist": [
27
+ "> 1%",
28
+ "last 2 versions",
29
+ "not dead"
30
+ ],
31
+ "engines": {
32
+ "node": ">= 16"
33
+ },
34
+ "scripts": {
35
+ "dev": "tsup --watch",
36
+ "build": "tsup",
37
+ "test": "vitest",
38
+ "coverage": "vitest run --coverage",
39
+ "lint": "eslint . --ext .ts,.tsx",
40
+ "format": "prettier --write \"src/**/*.{ts,tsx}\""
41
+ }
42
+ }