Compare commits
	
		
			8 Commits
		
	
	
		
			05f0373834
			...
			main
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| bae8275b11 | |||
| 0a0ffbdb23 | |||
| 557cd99b20 | |||
| 8b4312782d | |||
| f8af24506b | |||
| f1024941ed | |||
| 98c8a2ad86 | |||
| 8ac11bbd28 | 
							
								
								
									
										65
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,66 @@ | |||||||
| dist |  | ||||||
| node_modules | node_modules | ||||||
|  |  | ||||||
|  | # mac | ||||||
| .DS_Store | .DS_Store | ||||||
| .env |  | ||||||
|  | .env* | ||||||
|  | !.env*example | ||||||
|  |  | ||||||
|  | dist | ||||||
|  | build | ||||||
|  | logs | ||||||
|  |  | ||||||
|  | .turbo | ||||||
|  |  | ||||||
|  | pack-dist | ||||||
|  |  | ||||||
|  | # astro | ||||||
|  | .astro | ||||||
|  |  | ||||||
|  | # next | ||||||
|  | .next | ||||||
|  |  | ||||||
|  | # nuxt | ||||||
|  | .nuxt | ||||||
|  |  | ||||||
|  | # vercel | ||||||
|  | .vercel | ||||||
|  |  | ||||||
|  | # vuepress | ||||||
|  | .vuepress/dist | ||||||
|  |  | ||||||
|  | # coverage | ||||||
|  | coverage/ | ||||||
|  |  | ||||||
|  | # typescript | ||||||
|  | *.tsbuildinfo | ||||||
|  |  | ||||||
|  | # debug logs | ||||||
|  | *.log | ||||||
|  | *.tmp | ||||||
|  |  | ||||||
|  | # vscode | ||||||
|  | .vscode/* | ||||||
|  | !.vscode/settings.json | ||||||
|  | !.vscode/tasks.json | ||||||
|  | !.vscode/launch.json | ||||||
|  | !.vscode/extensions.json | ||||||
|  |  | ||||||
|  | # idea | ||||||
|  | .idea | ||||||
|  |  | ||||||
|  | # system | ||||||
|  | Thumbs.db | ||||||
|  | ehthumbs.db | ||||||
|  | Desktop.ini | ||||||
|  |  | ||||||
|  | # temp files | ||||||
|  | *.tmp | ||||||
|  | *.temp | ||||||
|  |  | ||||||
|  | # local development | ||||||
|  | *.local | ||||||
|  |  | ||||||
|  | public/r | ||||||
|  |  | ||||||
|  | .pnpm-store | ||||||
							
								
								
									
										10
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "@kevisual/query-login", |   "name": "@kevisual/query-login", | ||||||
|   "version": "0.0.2", |   "version": "0.0.6", | ||||||
|   "description": "", |   "description": "", | ||||||
|   "main": "dist/query-login.js", |   "main": "dist/query-login.js", | ||||||
|   "types": "dist/query-login.d.ts", |   "types": "dist/query-login.d.ts", | ||||||
| @@ -18,10 +18,10 @@ | |||||||
|     "access": "public" |     "access": "public" | ||||||
|   }, |   }, | ||||||
|   "peerDependencies": { |   "peerDependencies": { | ||||||
|     "@kevisual/query": "^0.0.15" |     "@kevisual/query": "^0.0.17" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@types/node": "^22.13.11", |     "@types/node": "^22.14.1", | ||||||
|     "tsup": "^8.4.0" |     "tsup": "^8.4.0" | ||||||
|   }, |   }, | ||||||
|   "exports": { |   "exports": { | ||||||
| @@ -31,7 +31,7 @@ | |||||||
|     "./browser": "./dist/query-login-browser.js" |     "./browser": "./dist/query-login-browser.js" | ||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@kevisual/cache": "^0.0.1", |     "@kevisual/cache": "^0.0.2", | ||||||
|     "dotenv": "^16.4.7" |     "dotenv": "^16.5.0" | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -38,9 +38,13 @@ type CacheLogin = { | |||||||
|  |  | ||||||
| export type CacheStore<T = Cache> = { | export type CacheStore<T = Cache> = { | ||||||
|   name: string; |   name: string; | ||||||
|  |   /** | ||||||
|  |    * 缓存数据 | ||||||
|  |    * @important 需要先调用init | ||||||
|  |    */ | ||||||
|   cacheData: CacheLogin; |   cacheData: CacheLogin; | ||||||
|   /** |   /** | ||||||
|    * 实际操作的cache |    * 实际操作的cache, 需要先调用init | ||||||
|    */ |    */ | ||||||
|   cache: T; |   cache: T; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,15 +1,21 @@ | |||||||
| import { Cache, LoginCacheStore, LoginCacheStoreOpts } from './login-cache.ts'; | import { Cache } from './login-cache.ts'; | ||||||
| import { homedir } from 'node:os'; | import { homedir } from 'node:os'; | ||||||
| import { join, dirname } from 'node:path'; | import { join, dirname } from 'node:path'; | ||||||
| import fs from 'node:fs'; | import fs from 'node:fs'; | ||||||
| import { readFileSync, writeFileSync, accessSync } from 'node:fs'; | import { readFileSync, writeFileSync, accessSync } from 'node:fs'; | ||||||
| import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'; | import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'; | ||||||
| export const fileExists = async (filePath: string, createIfNotExists = false) => { | export const fileExists = async ( | ||||||
|  |   filePath: string, | ||||||
|  |   { createIfNotExists = true, isFile = true, isDir = false }: { createIfNotExists?: boolean; isFile?: boolean; isDir?: boolean } = {}, | ||||||
|  | ) => { | ||||||
|   try { |   try { | ||||||
|     accessSync(filePath, fs.constants.F_OK); |     accessSync(filePath, fs.constants.F_OK); | ||||||
|     return true; |     return true; | ||||||
|   } catch (error) { |   } catch (error) { | ||||||
|     if (createIfNotExists) { |     if (createIfNotExists && isDir) { | ||||||
|  |       await mkdir(filePath, { recursive: true }); | ||||||
|  |       return true; | ||||||
|  |     } else if (createIfNotExists && isFile) { | ||||||
|       await mkdir(dirname(filePath), { recursive: true }); |       await mkdir(dirname(filePath), { recursive: true }); | ||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
| @@ -25,6 +31,9 @@ export const readConfigFile = (filePath: string) => { | |||||||
|     return {}; |     return {}; | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
|  | export const writeConfigFile = (filePath: string, data: any) => { | ||||||
|  |   writeFileSync(filePath, JSON.stringify(data, null, 2)); | ||||||
|  | }; | ||||||
| export const getHostName = () => { | export const getHostName = () => { | ||||||
|   const configDir = join(homedir(), '.config', 'envision'); |   const configDir = join(homedir(), '.config', 'envision'); | ||||||
|   const configFile = join(configDir, 'config.json'); |   const configFile = join(configDir, 'config.json'); | ||||||
| @@ -41,14 +50,13 @@ export class StorageNode implements Storage { | |||||||
|     const configDir = join(homedir(), '.config', 'envision'); |     const configDir = join(homedir(), '.config', 'envision'); | ||||||
|     const hostname = getHostName(); |     const hostname = getHostName(); | ||||||
|     this.filePath = join(configDir, 'config', `${hostname}-storage.json`); |     this.filePath = join(configDir, 'config', `${hostname}-storage.json`); | ||||||
|     fileExists(this.filePath, true); |     fileExists(this.filePath, { isFile: true }); | ||||||
|   } |   } | ||||||
|   async loadCache() { |   async loadCache() { | ||||||
|     const filePath = this.filePath; |     const filePath = this.filePath; | ||||||
|     try { |     try { | ||||||
|       const data = await readFile(filePath, 'utf-8'); |       const data = await readConfigFile(filePath); | ||||||
|       const jsonData = JSON.parse(data); |       this.cacheData = data; | ||||||
|       this.cacheData = jsonData; |  | ||||||
|     } catch (error) { |     } catch (error) { | ||||||
|       this.cacheData = {}; |       this.cacheData = {}; | ||||||
|       await writeFile(filePath, JSON.stringify(this.cacheData, null, 2)); |       await writeFile(filePath, JSON.stringify(this.cacheData, null, 2)); | ||||||
| @@ -81,24 +89,23 @@ export class LoginNodeCache implements Cache { | |||||||
|  |  | ||||||
|   constructor(filepath?: string) { |   constructor(filepath?: string) { | ||||||
|     this.filepath = filepath || join(homedir(), '.config', 'envision', 'config', `${getHostName()}-login.json`); |     this.filepath = filepath || join(homedir(), '.config', 'envision', 'config', `${getHostName()}-login.json`); | ||||||
|     fileExists(this.filepath, true); |     fileExists(this.filepath, { isFile: true }); | ||||||
|   } |   } | ||||||
|   async get(_key: string) { |   async get(_key: string) { | ||||||
|     const data = readFileSync(this.filepath, 'utf-8'); |  | ||||||
|     try { |     try { | ||||||
|       const jsonData = JSON.parse(data); |       const filePath = this.filepath; | ||||||
|       return jsonData; |       const data = readConfigFile(filePath); | ||||||
|  |       return data; | ||||||
|     } catch (error) { |     } catch (error) { | ||||||
|       console.log('get error', error); |       console.log('get error', error); | ||||||
|       return null; |       return {}; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   async set(_key: string, value: any) { |   async set(_key: string, value: any) { | ||||||
|     const data = readFileSync(this.filepath, 'utf-8'); |  | ||||||
|     try { |     try { | ||||||
|       const jsonData = JSON.parse(data); |       const data = readConfigFile(this.filepath); | ||||||
|       const newData = { ...jsonData, ...value }; |       const newData = { ...data, ...value }; | ||||||
|       writeFileSync(this.filepath, JSON.stringify(newData, null, 2)); |       writeConfigFile(this.filepath, newData); | ||||||
|     } catch (error) { |     } catch (error) { | ||||||
|       console.log('set error', error); |       console.log('set error', error); | ||||||
|     } |     } | ||||||
| @@ -112,9 +119,10 @@ export class LoginNodeCache implements Cache { | |||||||
|       const jsonData = JSON.parse(data); |       const jsonData = JSON.parse(data); | ||||||
|       return jsonData; |       return jsonData; | ||||||
|     } catch (error) { |     } catch (error) { | ||||||
|       console.log('loadCache error', error); |       // console.log('loadCache error', error); | ||||||
|  |       console.log('create new cache file:', filePath); | ||||||
|       const defaultData = { loginUsers: [] }; |       const defaultData = { loginUsers: [] }; | ||||||
|       await writeFile(filePath, JSON.stringify(defaultData, null, 2)); |       writeConfigFile(filePath, defaultData); | ||||||
|       return defaultData; |       return defaultData; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import { Query } from '@kevisual/query'; | import { Query, BaseQuery } from '@kevisual/query'; | ||||||
| import type { Result, DataOpts } from '@kevisual/query/query'; | import type { Result, DataOpts } from '@kevisual/query/query'; | ||||||
| import { setBaseResponse } from '@kevisual/query/query'; | import { setBaseResponse } from '@kevisual/query/query'; | ||||||
| import { LoginCacheStore, CacheStore } from './login-cache.ts'; | import { LoginCacheStore, CacheStore } from './login-cache.ts'; | ||||||
| @@ -21,8 +21,7 @@ export type QueryLoginResult = { | |||||||
|   refreshToken: string; |   refreshToken: string; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| export class QueryLogin { | export class QueryLogin extends BaseQuery { | ||||||
|   query: Query; |  | ||||||
|   /** |   /** | ||||||
|    * query login cache, 非实际操作, 一个cache的包裹模块 |    * query login cache, 非实际操作, 一个cache的包裹模块 | ||||||
|    */ |    */ | ||||||
| @@ -33,7 +32,9 @@ export class QueryLogin { | |||||||
|   onLoad?: () => void; |   onLoad?: () => void; | ||||||
|  |  | ||||||
|   constructor(opts?: QueryLoginOpts) { |   constructor(opts?: QueryLoginOpts) { | ||||||
|     this.query = opts?.query || new Query(); |     super({ | ||||||
|  |       query: opts?.query || new Query(), | ||||||
|  |     }); | ||||||
|     this.cacheStore = new LoginCacheStore({ name: 'login', cache: opts.cache }); |     this.cacheStore = new LoginCacheStore({ name: 'login', cache: opts.cache }); | ||||||
|     this.isBrowser = opts?.isBrowser ?? true; |     this.isBrowser = opts?.isBrowser ?? true; | ||||||
|     this.init(); |     this.init(); | ||||||
| @@ -86,6 +87,15 @@ export class QueryLogin { | |||||||
|     } |     } | ||||||
|     return res; |     return res; | ||||||
|   } |   } | ||||||
|  |   /** | ||||||
|  |    * 设置token | ||||||
|  |    * @param token | ||||||
|  |    */ | ||||||
|  |   async setLoginToken(token: { accessToken: string; refreshToken: string }) { | ||||||
|  |     const { accessToken, refreshToken } = token; | ||||||
|  |     this.storage.setItem('token', accessToken || ''); | ||||||
|  |     await this.beforeSetLoginUser({ accessToken, refreshToken }); | ||||||
|  |   } | ||||||
|   async loginByWechat(data: { code: string }) { |   async loginByWechat(data: { code: string }) { | ||||||
|     const res = await this.post<QueryLoginResult>({ path: 'wx', key: 'open-login', code: data.code }); |     const res = await this.post<QueryLoginResult>({ path: 'wx', key: 'open-login', code: data.code }); | ||||||
|     if (res.code === 200) { |     if (res.code === 200) { | ||||||
| @@ -266,7 +276,7 @@ export class QueryLogin { | |||||||
|           return config; |           return config; | ||||||
|         }, |         }, | ||||||
|         afterResponse: async (response, ctx) => { |         afterResponse: async (response, ctx) => { | ||||||
|           if (response?.code === 401 && check401) { |           if (response?.code === 401 && check401 && !token) { | ||||||
|             return await that.afterCheck401ToRefreshToken(response, ctx); |             return await that.afterCheck401ToRefreshToken(response, ctx); | ||||||
|           } |           } | ||||||
|           return response as any; |           return response as any; | ||||||
| @@ -274,6 +284,25 @@ export class QueryLogin { | |||||||
|       }, |       }, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |   /** | ||||||
|  |    * 检查本地用户,如果本地用户存在,则返回本地用户,否则返回null | ||||||
|  |    * @returns | ||||||
|  |    */ | ||||||
|  |   async checkLocalUser() { | ||||||
|  |     const user = await this.cacheStore.getCurrentUser(); | ||||||
|  |     if (user) { | ||||||
|  |       return user; | ||||||
|  |     } | ||||||
|  |     return null; | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * 检查本地token是否存在,简单的判断是否已经属于登陆状态 | ||||||
|  |    * @returns | ||||||
|  |    */ | ||||||
|  |   async checkLocalToken() { | ||||||
|  |     const token = this.storage.getItem('token'); | ||||||
|  |     return !!token; | ||||||
|  |   } | ||||||
|   /** |   /** | ||||||
|    * 请求更新,切换用户, 使用switchUser |    * 请求更新,切换用户, 使用switchUser | ||||||
|    * @param username |    * @param username | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user