@kevisual/api 0.0.52 → 0.0.54
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/dist/query-ai.js +16 -3
- package/dist/query-app.js +16 -3
- package/dist/query-config.js +14 -1
- package/dist/query-login-node.d.ts +340 -0
- package/dist/query-login-node.js +1374 -0
- package/dist/query-login.js +17 -1
- package/dist/query-mark.js +14 -1
- package/dist/query-proxy.js +134 -76
- package/dist/query-resources.js +1 -1
- package/dist/query-secret.js +14 -1
- package/dist/query-shop.js +16 -3
- package/dist/store-mark.js +13 -0
- package/package.json +7 -6
- package/query/query-login/login-node-cache.ts +50 -25
- package/query/query-login/query-login-node.ts +8 -3
- package/query/query-login/query-login.ts +3 -0
package/dist/query-ai.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// node_modules
|
|
1
|
+
// node_modules/@kevisual/query/dist/query-browser.js
|
|
2
2
|
var isTextForContentType = (contentType) => {
|
|
3
3
|
if (!contentType)
|
|
4
4
|
return false;
|
|
@@ -118,6 +118,7 @@ var wrapperError = ({ code, message }) => {
|
|
|
118
118
|
|
|
119
119
|
class Query {
|
|
120
120
|
adapter;
|
|
121
|
+
baseURL;
|
|
121
122
|
url;
|
|
122
123
|
beforeRequest;
|
|
123
124
|
afterResponse;
|
|
@@ -134,6 +135,11 @@ class Query {
|
|
|
134
135
|
this.storage = opts?.storage || globalThis?.localStorage;
|
|
135
136
|
const defaultURL = opts?.isClient ? "/client/router" : "/api/router";
|
|
136
137
|
this.url = opts?.url || defaultURL;
|
|
138
|
+
if (this.url.startsWith("http")) {
|
|
139
|
+
const urlObj = new URL(this.url);
|
|
140
|
+
this.baseURL = urlObj.origin;
|
|
141
|
+
}
|
|
142
|
+
this.baseURL = opts?.baseURL || this.baseURL;
|
|
137
143
|
this.headers = opts?.headers || {
|
|
138
144
|
"Content-Type": "application/json"
|
|
139
145
|
};
|
|
@@ -177,6 +183,13 @@ class Query {
|
|
|
177
183
|
timeout: _timeout,
|
|
178
184
|
...rest
|
|
179
185
|
};
|
|
186
|
+
const isStartsWithHttp = req.url.startsWith("http");
|
|
187
|
+
if (!isStartsWithHttp) {
|
|
188
|
+
if (this.baseURL) {
|
|
189
|
+
const baseURL = new URL(this.baseURL || globalThis?.location?.origin).origin;
|
|
190
|
+
req.url = baseURL + req.url;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
180
193
|
try {
|
|
181
194
|
if (_beforeRequest) {
|
|
182
195
|
const res = await _beforeRequest(req);
|
|
@@ -273,7 +286,7 @@ class Query {
|
|
|
273
286
|
}
|
|
274
287
|
}
|
|
275
288
|
|
|
276
|
-
// node_modules
|
|
289
|
+
// node_modules/@kevisual/router/dist/router-define.js
|
|
277
290
|
class Chain {
|
|
278
291
|
object;
|
|
279
292
|
app;
|
|
@@ -407,7 +420,7 @@ var appDefine = QueryUtil.create({
|
|
|
407
420
|
}
|
|
408
421
|
});
|
|
409
422
|
|
|
410
|
-
// node_modules
|
|
423
|
+
// node_modules/@kevisual/query/dist/query.js
|
|
411
424
|
class BaseQuery {
|
|
412
425
|
query;
|
|
413
426
|
queryDefine;
|
package/dist/query-app.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// node_modules
|
|
1
|
+
// node_modules/@kevisual/query/dist/query-browser.js
|
|
2
2
|
var isTextForContentType = (contentType) => {
|
|
3
3
|
if (!contentType)
|
|
4
4
|
return false;
|
|
@@ -118,6 +118,7 @@ var wrapperError = ({ code, message }) => {
|
|
|
118
118
|
|
|
119
119
|
class Query {
|
|
120
120
|
adapter;
|
|
121
|
+
baseURL;
|
|
121
122
|
url;
|
|
122
123
|
beforeRequest;
|
|
123
124
|
afterResponse;
|
|
@@ -134,6 +135,11 @@ class Query {
|
|
|
134
135
|
this.storage = opts?.storage || globalThis?.localStorage;
|
|
135
136
|
const defaultURL = opts?.isClient ? "/client/router" : "/api/router";
|
|
136
137
|
this.url = opts?.url || defaultURL;
|
|
138
|
+
if (this.url.startsWith("http")) {
|
|
139
|
+
const urlObj = new URL(this.url);
|
|
140
|
+
this.baseURL = urlObj.origin;
|
|
141
|
+
}
|
|
142
|
+
this.baseURL = opts?.baseURL || this.baseURL;
|
|
137
143
|
this.headers = opts?.headers || {
|
|
138
144
|
"Content-Type": "application/json"
|
|
139
145
|
};
|
|
@@ -177,6 +183,13 @@ class Query {
|
|
|
177
183
|
timeout: _timeout,
|
|
178
184
|
...rest
|
|
179
185
|
};
|
|
186
|
+
const isStartsWithHttp = req.url.startsWith("http");
|
|
187
|
+
if (!isStartsWithHttp) {
|
|
188
|
+
if (this.baseURL) {
|
|
189
|
+
const baseURL = new URL(this.baseURL || globalThis?.location?.origin).origin;
|
|
190
|
+
req.url = baseURL + req.url;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
180
193
|
try {
|
|
181
194
|
if (_beforeRequest) {
|
|
182
195
|
const res = await _beforeRequest(req);
|
|
@@ -273,7 +286,7 @@ class Query {
|
|
|
273
286
|
}
|
|
274
287
|
}
|
|
275
288
|
|
|
276
|
-
// node_modules
|
|
289
|
+
// node_modules/@kevisual/router/dist/router-define.js
|
|
277
290
|
class Chain {
|
|
278
291
|
object;
|
|
279
292
|
app;
|
|
@@ -481,7 +494,7 @@ var userAppDefine = QueryUtil.create({
|
|
|
481
494
|
}
|
|
482
495
|
});
|
|
483
496
|
|
|
484
|
-
// node_modules
|
|
497
|
+
// node_modules/@kevisual/query/dist/query.js
|
|
485
498
|
class BaseQuery {
|
|
486
499
|
query;
|
|
487
500
|
queryDefine;
|
package/dist/query-config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// node_modules
|
|
1
|
+
// node_modules/@kevisual/query/dist/query-browser.js
|
|
2
2
|
var isTextForContentType = (contentType) => {
|
|
3
3
|
if (!contentType)
|
|
4
4
|
return false;
|
|
@@ -118,6 +118,7 @@ var wrapperError = ({ code, message }) => {
|
|
|
118
118
|
|
|
119
119
|
class Query {
|
|
120
120
|
adapter;
|
|
121
|
+
baseURL;
|
|
121
122
|
url;
|
|
122
123
|
beforeRequest;
|
|
123
124
|
afterResponse;
|
|
@@ -134,6 +135,11 @@ class Query {
|
|
|
134
135
|
this.storage = opts?.storage || globalThis?.localStorage;
|
|
135
136
|
const defaultURL = opts?.isClient ? "/client/router" : "/api/router";
|
|
136
137
|
this.url = opts?.url || defaultURL;
|
|
138
|
+
if (this.url.startsWith("http")) {
|
|
139
|
+
const urlObj = new URL(this.url);
|
|
140
|
+
this.baseURL = urlObj.origin;
|
|
141
|
+
}
|
|
142
|
+
this.baseURL = opts?.baseURL || this.baseURL;
|
|
137
143
|
this.headers = opts?.headers || {
|
|
138
144
|
"Content-Type": "application/json"
|
|
139
145
|
};
|
|
@@ -177,6 +183,13 @@ class Query {
|
|
|
177
183
|
timeout: _timeout,
|
|
178
184
|
...rest
|
|
179
185
|
};
|
|
186
|
+
const isStartsWithHttp = req.url.startsWith("http");
|
|
187
|
+
if (!isStartsWithHttp) {
|
|
188
|
+
if (this.baseURL) {
|
|
189
|
+
const baseURL = new URL(this.baseURL || globalThis?.location?.origin).origin;
|
|
190
|
+
req.url = baseURL + req.url;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
180
193
|
try {
|
|
181
194
|
if (_beforeRequest) {
|
|
182
195
|
const res = await _beforeRequest(req);
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import { BaseQuery, Query } from '@kevisual/query';
|
|
2
|
+
import { DataOpts, Result } from '@kevisual/query/query';
|
|
3
|
+
|
|
4
|
+
interface Cache {
|
|
5
|
+
/**
|
|
6
|
+
* @update 获取缓存
|
|
7
|
+
*/
|
|
8
|
+
get(key: string): Promise<any>;
|
|
9
|
+
/**
|
|
10
|
+
* @update 设置缓存
|
|
11
|
+
*/
|
|
12
|
+
set(key: string, value: any): Promise<any>;
|
|
13
|
+
/**
|
|
14
|
+
* @update 删除缓存
|
|
15
|
+
*/
|
|
16
|
+
del(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* 初始化
|
|
19
|
+
*/
|
|
20
|
+
init?: () => Promise<any>;
|
|
21
|
+
}
|
|
22
|
+
type User = {
|
|
23
|
+
avatar?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
id?: string;
|
|
26
|
+
needChangePassword?: boolean;
|
|
27
|
+
orgs?: string[];
|
|
28
|
+
type?: string;
|
|
29
|
+
username?: string;
|
|
30
|
+
};
|
|
31
|
+
type CacheLoginUser = {
|
|
32
|
+
user?: User;
|
|
33
|
+
id?: string;
|
|
34
|
+
accessToken?: string;
|
|
35
|
+
refreshToken?: string;
|
|
36
|
+
accessTokenExpiresIn?: number;
|
|
37
|
+
createdAt?: number;
|
|
38
|
+
};
|
|
39
|
+
type CacheLogin = {
|
|
40
|
+
loginUsers: CacheLoginUser[];
|
|
41
|
+
} & CacheLoginUser;
|
|
42
|
+
type CacheStore<T = Cache> = {
|
|
43
|
+
name: string;
|
|
44
|
+
/**
|
|
45
|
+
* 缓存数据
|
|
46
|
+
* @important 需要先调用init
|
|
47
|
+
*/
|
|
48
|
+
cacheData: CacheLogin;
|
|
49
|
+
/**
|
|
50
|
+
* 实际操作的cache, 需要先调用init
|
|
51
|
+
*/
|
|
52
|
+
cache: T;
|
|
53
|
+
/**
|
|
54
|
+
* 设置当前用户
|
|
55
|
+
*/
|
|
56
|
+
setLoginUser(user: CacheLoginUser): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* 获取当前用户
|
|
59
|
+
*/
|
|
60
|
+
getCurrentUser(): Promise<User>;
|
|
61
|
+
/**
|
|
62
|
+
* 获取当前用户列表
|
|
63
|
+
*/
|
|
64
|
+
getCurrentUserList(): Promise<CacheLoginUser[]>;
|
|
65
|
+
/**
|
|
66
|
+
* 获取缓存的refreshToken
|
|
67
|
+
*/
|
|
68
|
+
getRefreshToken(): Promise<string>;
|
|
69
|
+
/**
|
|
70
|
+
* 获取缓存的accessToken
|
|
71
|
+
*/
|
|
72
|
+
getAccessToken(): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* 清除当前用户
|
|
75
|
+
*/
|
|
76
|
+
clearCurrentUser(): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* 清除所有用户
|
|
79
|
+
*/
|
|
80
|
+
clearAll(): Promise<void>;
|
|
81
|
+
getValue(): Promise<CacheLogin>;
|
|
82
|
+
setValue(value: CacheLogin): Promise<CacheLogin>;
|
|
83
|
+
delValue(): Promise<void>;
|
|
84
|
+
init(): Promise<any>;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
type QueryLoginOpts = {
|
|
88
|
+
query?: Query;
|
|
89
|
+
isBrowser?: boolean;
|
|
90
|
+
onLoad?: () => void;
|
|
91
|
+
storage?: Storage;
|
|
92
|
+
cache: Cache;
|
|
93
|
+
};
|
|
94
|
+
type QueryLoginData = {
|
|
95
|
+
username?: string;
|
|
96
|
+
password: string;
|
|
97
|
+
email?: string;
|
|
98
|
+
};
|
|
99
|
+
type QueryLoginResult = {
|
|
100
|
+
accessToken: string;
|
|
101
|
+
refreshToken: string;
|
|
102
|
+
};
|
|
103
|
+
declare class QueryLogin extends BaseQuery {
|
|
104
|
+
/**
|
|
105
|
+
* query login cache, 非实际操作, 一个cache的包裹模块
|
|
106
|
+
*/
|
|
107
|
+
cacheStore: CacheStore;
|
|
108
|
+
isBrowser: boolean;
|
|
109
|
+
load?: boolean;
|
|
110
|
+
storage: Storage;
|
|
111
|
+
onLoad?: () => void;
|
|
112
|
+
constructor(opts?: QueryLoginOpts);
|
|
113
|
+
setQuery(query: Query): void;
|
|
114
|
+
private init;
|
|
115
|
+
post<T = any>(data: any, opts?: DataOpts): Promise<any>;
|
|
116
|
+
/**
|
|
117
|
+
* 登录,
|
|
118
|
+
* @param data
|
|
119
|
+
* @returns
|
|
120
|
+
*/
|
|
121
|
+
login(data: QueryLoginData): Promise<any>;
|
|
122
|
+
/**
|
|
123
|
+
* 手机号登录
|
|
124
|
+
* @param data
|
|
125
|
+
* @returns
|
|
126
|
+
*/
|
|
127
|
+
loginByCode(data: {
|
|
128
|
+
phone: string;
|
|
129
|
+
code: string;
|
|
130
|
+
}): Promise<any>;
|
|
131
|
+
/**
|
|
132
|
+
* 设置token
|
|
133
|
+
* @param token
|
|
134
|
+
*/
|
|
135
|
+
setLoginToken(token: {
|
|
136
|
+
accessToken: string;
|
|
137
|
+
refreshToken: string;
|
|
138
|
+
accessTokenExpiresIn?: number;
|
|
139
|
+
}): Promise<void>;
|
|
140
|
+
loginByWechat(data: {
|
|
141
|
+
code: string;
|
|
142
|
+
}): Promise<any>;
|
|
143
|
+
/**
|
|
144
|
+
* 检测微信登录,登陆成功后,调用onSuccess,否则调用onError
|
|
145
|
+
* @param param0
|
|
146
|
+
*/
|
|
147
|
+
checkWechat({ onSuccess, onError }: {
|
|
148
|
+
onSuccess?: (res: QueryLoginResult) => void;
|
|
149
|
+
onError?: (res: any) => void;
|
|
150
|
+
}): Promise<void>;
|
|
151
|
+
/**
|
|
152
|
+
* 登陆成功,需要获取用户信息进行缓存
|
|
153
|
+
* @param param0
|
|
154
|
+
*/
|
|
155
|
+
beforeSetLoginUser({ accessToken, refreshToken, check401, accessTokenExpiresIn }: {
|
|
156
|
+
accessTokenExpiresIn?: number;
|
|
157
|
+
accessToken?: string;
|
|
158
|
+
refreshToken?: string;
|
|
159
|
+
check401?: boolean;
|
|
160
|
+
}): Promise<void>;
|
|
161
|
+
/**
|
|
162
|
+
* 刷新token
|
|
163
|
+
* @param refreshToken
|
|
164
|
+
* @returns
|
|
165
|
+
*/
|
|
166
|
+
queryRefreshToken(refreshToken?: string): Promise<any>;
|
|
167
|
+
/**
|
|
168
|
+
* 检查401错误,并刷新token, 如果refreshToken存在,则刷新token, 否则返回401
|
|
169
|
+
* 拦截请求,请使用run401Action, 不要直接使用 afterCheck401ToRefreshToken
|
|
170
|
+
* @param response
|
|
171
|
+
* @param ctx
|
|
172
|
+
* @param refetch
|
|
173
|
+
* @returns
|
|
174
|
+
*/
|
|
175
|
+
afterCheck401ToRefreshToken(response: Result, ctx?: {
|
|
176
|
+
req?: any;
|
|
177
|
+
res?: any;
|
|
178
|
+
fetch?: any;
|
|
179
|
+
}, refetch?: boolean): Promise<any>;
|
|
180
|
+
/**
|
|
181
|
+
* 一个简单的401处理, 如果401,则刷新token, 如果refreshToken不存在,则返回401
|
|
182
|
+
* refetch 是否重新请求, 会有bug,无限循环,按需要使用
|
|
183
|
+
* TODO:
|
|
184
|
+
* @param response
|
|
185
|
+
* @param ctx
|
|
186
|
+
* @param opts
|
|
187
|
+
* @returns
|
|
188
|
+
*/
|
|
189
|
+
run401Action(response: Result, ctx?: {
|
|
190
|
+
req?: any;
|
|
191
|
+
res?: any;
|
|
192
|
+
fetch?: any;
|
|
193
|
+
}, opts?: {
|
|
194
|
+
/**
|
|
195
|
+
* 是否重新请求, 会有bug,无限循环,按需要使用
|
|
196
|
+
*/
|
|
197
|
+
refetch?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* check之后的回调
|
|
200
|
+
*/
|
|
201
|
+
afterCheck?: (res: Result) => any;
|
|
202
|
+
/**
|
|
203
|
+
* 401处理后, 还是401, 则回调
|
|
204
|
+
*/
|
|
205
|
+
afterAlso401?: (res: Result) => any;
|
|
206
|
+
}): Promise<any>;
|
|
207
|
+
/**
|
|
208
|
+
* 获取用户信息
|
|
209
|
+
* @param token
|
|
210
|
+
* @returns
|
|
211
|
+
*/
|
|
212
|
+
getMe(token?: string, check401?: boolean): Promise<any>;
|
|
213
|
+
/**
|
|
214
|
+
* 检查本地用户,如果本地用户存在,则返回本地用户,否则返回null
|
|
215
|
+
* @returns
|
|
216
|
+
*/
|
|
217
|
+
checkLocalUser(): Promise<{
|
|
218
|
+
avatar?: string;
|
|
219
|
+
description?: string;
|
|
220
|
+
id?: string;
|
|
221
|
+
needChangePassword?: boolean;
|
|
222
|
+
orgs?: string[];
|
|
223
|
+
type?: string;
|
|
224
|
+
username?: string;
|
|
225
|
+
} | null>;
|
|
226
|
+
/**
|
|
227
|
+
* 检查本地token是否存在,简单的判断是否已经属于登陆状态
|
|
228
|
+
* @returns
|
|
229
|
+
*/
|
|
230
|
+
checkLocalToken(): Promise<boolean>;
|
|
231
|
+
/**
|
|
232
|
+
* 检查本地用户列表
|
|
233
|
+
* @returns
|
|
234
|
+
*/
|
|
235
|
+
getToken(): Promise<string>;
|
|
236
|
+
beforeRequest(opts?: any): Promise<any>;
|
|
237
|
+
/**
|
|
238
|
+
* 请求更新,切换用户, 使用switchUser
|
|
239
|
+
* @param username
|
|
240
|
+
* @returns
|
|
241
|
+
*/
|
|
242
|
+
private postSwitchUser;
|
|
243
|
+
/**
|
|
244
|
+
* 切换用户
|
|
245
|
+
* @param username
|
|
246
|
+
* @returns
|
|
247
|
+
*/
|
|
248
|
+
switchUser(username: string): Promise<any>;
|
|
249
|
+
/**
|
|
250
|
+
* 退出登陆,去掉token, 并删除缓存
|
|
251
|
+
* @returns
|
|
252
|
+
*/
|
|
253
|
+
logout(): Promise<any>;
|
|
254
|
+
/**
|
|
255
|
+
* 检查用户名的组,这个用户是否存在
|
|
256
|
+
* @param username
|
|
257
|
+
* @returns
|
|
258
|
+
*/
|
|
259
|
+
hasUser(username: string): Promise<any>;
|
|
260
|
+
/**
|
|
261
|
+
* 检查登录状态
|
|
262
|
+
* @param token
|
|
263
|
+
* @returns
|
|
264
|
+
*/
|
|
265
|
+
checkLoginStatus(token: string): Promise<any>;
|
|
266
|
+
/**
|
|
267
|
+
* 使用web登录,创建url地址, 需要MD5和jsonwebtoken
|
|
268
|
+
*
|
|
269
|
+
*
|
|
270
|
+
|
|
271
|
+
// import MD5 from 'crypto-js/md5.js';
|
|
272
|
+
import jsonwebtoken from 'jsonwebtoken';
|
|
273
|
+
|
|
274
|
+
*/
|
|
275
|
+
loginWithWeb(baseURL: string, { MD5, jsonwebtoken }: {
|
|
276
|
+
MD5?: any;
|
|
277
|
+
jsonwebtoken?: any;
|
|
278
|
+
}): {
|
|
279
|
+
url: string;
|
|
280
|
+
token: string;
|
|
281
|
+
tokenSecret: string;
|
|
282
|
+
};
|
|
283
|
+
/**
|
|
284
|
+
*轮询登录状态
|
|
285
|
+
*
|
|
286
|
+
*
|
|
287
|
+
*
|
|
288
|
+
const res = queryLogin.loginWithWeb(baseURL, { MD5, jsonwebtoken });
|
|
289
|
+
await pollLoginStatus(res.token, { tokenSecret: res.tokenSecret });
|
|
290
|
+
* 轮询登录状态
|
|
291
|
+
*/
|
|
292
|
+
pollLoginStatus(data: {
|
|
293
|
+
token: string;
|
|
294
|
+
tokenSecret: string;
|
|
295
|
+
}): Promise<boolean>;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
declare class StorageNode implements Storage {
|
|
299
|
+
cacheData: any;
|
|
300
|
+
filePath: string;
|
|
301
|
+
hostname: string;
|
|
302
|
+
isLoaded: boolean;
|
|
303
|
+
constructor(opts?: {
|
|
304
|
+
baseURL?: string;
|
|
305
|
+
load?: boolean;
|
|
306
|
+
});
|
|
307
|
+
setHostName(hostname: string, opts?: {
|
|
308
|
+
load?: boolean;
|
|
309
|
+
}): void;
|
|
310
|
+
loadCache(force?: boolean): void;
|
|
311
|
+
get length(): number;
|
|
312
|
+
getItem(key: string): any;
|
|
313
|
+
setItem(key: string, value: any): void;
|
|
314
|
+
removeItem(key: string): void;
|
|
315
|
+
clear(): void;
|
|
316
|
+
key(index: number): string;
|
|
317
|
+
}
|
|
318
|
+
declare class LoginNodeCache implements Cache {
|
|
319
|
+
filepath: string;
|
|
320
|
+
isLoaded: boolean;
|
|
321
|
+
constructor(opts?: {
|
|
322
|
+
baseURL?: string;
|
|
323
|
+
load?: boolean;
|
|
324
|
+
});
|
|
325
|
+
get(_key: string): Promise<any>;
|
|
326
|
+
set(_key: string, value: any): Promise<void>;
|
|
327
|
+
del(): Promise<void>;
|
|
328
|
+
loadCache(filePath: string, force?: boolean): any;
|
|
329
|
+
init(): any;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
type QueryLoginNodeOptsWithoutCache = Omit<QueryLoginOpts, 'cache'>;
|
|
333
|
+
|
|
334
|
+
declare const cache: LoginNodeCache;
|
|
335
|
+
declare class QueryLoginNode extends QueryLogin {
|
|
336
|
+
storage: StorageNode;
|
|
337
|
+
constructor(opts: QueryLoginNodeOptsWithoutCache);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
export { QueryLoginNode, StorageNode, cache };
|