@xlt-token/nestjs 1.0.0-rc.3
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/LICENSE +21 -0
- package/README.md +29 -0
- package/dist/index.cjs +687 -0
- package/dist/index.d.cts +233 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +233 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +525 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +90 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import * as _nestjs_common0 from "@nestjs/common";
|
|
2
|
+
import { CanActivate, ExecutionContext, ForbiddenException, ModuleMetadata, Provider, UnauthorizedException } from "@nestjs/common";
|
|
3
|
+
import * as _xlt_token_core0 from "@xlt-token/core";
|
|
4
|
+
import { AuthResult, CreateOptions, DEFAULT_XLT_TOKEN_CONFIG, DeviceInfo, HttpContext, MemoryStore, NotLoginType, NotLoginType as NotLoginType$1, StpInterface, StpInterface as StpInterface$1, StpLogic, StpLogic as StpLogic$1, StpPermLogic, StpPermLogic as StpPermLogic$1, StpUtil, TokenStrategy, TokenStrategy as TokenStrategy$1, UuidStrategy, XLT_STP_INTERFACE, XLT_TOKEN_CONFIG, XLT_TOKEN_HOOKS, XLT_TOKEN_STORE, XLT_TOKEN_STRATEGY, XltHooks, XltHooks as XltHooks$1, XltMode, XltMode as XltMode$1, XltSession, XltTokenConfig, XltTokenConfig as XltTokenConfig$1, XltTokenContext, XltTokenStore, XltTokenStore as XltTokenStore$1, createExpressContext, createMockHttpContext, createXltToken, matchPermission, setStpLogic, setStpPermLogic } from "@xlt-token/core";
|
|
5
|
+
import { JwtPayload } from "jsonwebtoken";
|
|
6
|
+
import { Reflector } from "@nestjs/core";
|
|
7
|
+
|
|
8
|
+
//#region src/xlt-token.module.d.ts
|
|
9
|
+
interface XltTokenModuleOptions {
|
|
10
|
+
config?: Partial<XltTokenConfig$1>;
|
|
11
|
+
store?: {
|
|
12
|
+
useClass: new (...args: any[]) => XltTokenStore$1;
|
|
13
|
+
} | {
|
|
14
|
+
useValue: XltTokenStore$1;
|
|
15
|
+
};
|
|
16
|
+
strategy?: {
|
|
17
|
+
useClass: new (...args: any[]) => TokenStrategy$1;
|
|
18
|
+
};
|
|
19
|
+
isGlobal?: boolean;
|
|
20
|
+
providers?: Provider[];
|
|
21
|
+
stpInterface?: new (...args: any[]) => StpInterface$1;
|
|
22
|
+
hooks?: XltHooks$1;
|
|
23
|
+
}
|
|
24
|
+
interface XltTokenModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
25
|
+
useFactory: (...args: any[]) => Promise<XltTokenModuleOptions> | XltTokenModuleOptions;
|
|
26
|
+
inject?: any[];
|
|
27
|
+
store?: {
|
|
28
|
+
useClass: new (...args: any[]) => XltTokenStore$1;
|
|
29
|
+
} | {
|
|
30
|
+
useValue: XltTokenStore$1;
|
|
31
|
+
};
|
|
32
|
+
strategy?: {
|
|
33
|
+
useClass: new (...args: any[]) => TokenStrategy$1;
|
|
34
|
+
};
|
|
35
|
+
isGlobal?: boolean;
|
|
36
|
+
providers?: Provider[];
|
|
37
|
+
stpInterface?: new (...args: any[]) => StpInterface$1;
|
|
38
|
+
hooks?: XltHooks$1;
|
|
39
|
+
}
|
|
40
|
+
declare class XltTokenModule {
|
|
41
|
+
private static createStoreProvider;
|
|
42
|
+
private static createStrategyProvider;
|
|
43
|
+
private static createStpInterfaceProvider;
|
|
44
|
+
private static createHooksProvider;
|
|
45
|
+
private static readonly stpLogicProvider;
|
|
46
|
+
private static readonly stpPermLogicProvider;
|
|
47
|
+
private static readonly initProvider;
|
|
48
|
+
private static readonly moduleExports;
|
|
49
|
+
static forRoot(options?: XltTokenModuleOptions): {
|
|
50
|
+
module: typeof XltTokenModule;
|
|
51
|
+
providers: Provider[];
|
|
52
|
+
exports: (string | typeof StpLogic$1 | typeof StpPermLogic$1)[];
|
|
53
|
+
global: boolean;
|
|
54
|
+
};
|
|
55
|
+
static forRootAsync(options: XltTokenModuleAsyncOptions): {
|
|
56
|
+
module: typeof XltTokenModule;
|
|
57
|
+
imports: (_nestjs_common0.Type<any> | _nestjs_common0.DynamicModule | Promise<_nestjs_common0.DynamicModule> | _nestjs_common0.ForwardReference<any>)[];
|
|
58
|
+
providers: (_nestjs_common0.Type<any> | _nestjs_common0.ClassProvider<any> | _nestjs_common0.ValueProvider<any> | _nestjs_common0.FactoryProvider<any> | _nestjs_common0.ExistingProvider<any> | {
|
|
59
|
+
provide: string;
|
|
60
|
+
useFactory: (...args: any[]) => Promise<{
|
|
61
|
+
tokenName: string;
|
|
62
|
+
timeout: number;
|
|
63
|
+
activeTimeout: number;
|
|
64
|
+
isConcurrent: boolean;
|
|
65
|
+
isShare: boolean;
|
|
66
|
+
tokenStyle: "uuid" | "simple-uuid" | "random-32";
|
|
67
|
+
isReadHeader: boolean;
|
|
68
|
+
isReadCookie: boolean;
|
|
69
|
+
isReadQuery: boolean;
|
|
70
|
+
tokenPrefix: string;
|
|
71
|
+
defaultCheck: boolean;
|
|
72
|
+
permCacheTimeout?: number;
|
|
73
|
+
offlineRecordEnabled?: boolean;
|
|
74
|
+
offlineRecordTimeout?: number;
|
|
75
|
+
deviceConcurrent?: boolean;
|
|
76
|
+
jwt?: _xlt_token_core0.JwtConfig;
|
|
77
|
+
}>;
|
|
78
|
+
inject: any[];
|
|
79
|
+
})[];
|
|
80
|
+
exports: (string | typeof StpLogic$1 | typeof StpPermLogic$1)[];
|
|
81
|
+
global: boolean;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
//#region src/store/redis-store.d.ts
|
|
86
|
+
declare const XLT_REDIS_CLIENT = "XLT_REDIS_CLIENT";
|
|
87
|
+
declare class RedisStore implements XltTokenStore$1 {
|
|
88
|
+
private readonly redisClient;
|
|
89
|
+
constructor(redisClient: any);
|
|
90
|
+
get(key: string): Promise<string | null>;
|
|
91
|
+
set(key: string, value: string, timeoutSec: number): Promise<void>;
|
|
92
|
+
delete(key: string): Promise<void>;
|
|
93
|
+
update(key: string, value: string): Promise<void>;
|
|
94
|
+
has(key: string): Promise<boolean>;
|
|
95
|
+
updateTimeout(key: string, timeoutSec: number): Promise<void>;
|
|
96
|
+
getTimeout(key: string): Promise<number>;
|
|
97
|
+
keys(pattern: string): Promise<string[]>;
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
100
|
+
//#region src/token/jwt-strategy.d.ts
|
|
101
|
+
declare class JwtStrategy implements TokenStrategy$1 {
|
|
102
|
+
private readonly config;
|
|
103
|
+
constructor(config: XltTokenConfig$1);
|
|
104
|
+
createToken(loginId: string, config: XltTokenConfig$1): string;
|
|
105
|
+
generateToken(payload: any): string;
|
|
106
|
+
verifyToken(token: string): JwtPayload & {
|
|
107
|
+
sub: string;
|
|
108
|
+
jti: string;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//#endregion
|
|
112
|
+
//#region src/decorators/xlt-check-login.decorator.d.ts
|
|
113
|
+
/**
|
|
114
|
+
* 登录校验装饰器
|
|
115
|
+
* @constructor
|
|
116
|
+
*/
|
|
117
|
+
declare const XltCheckLogin: () => _nestjs_common0.CustomDecorator<string>;
|
|
118
|
+
//#endregion
|
|
119
|
+
//#region src/decorators/xlt-ignore.decorator.d.ts
|
|
120
|
+
declare const XltIgnore: () => _nestjs_common0.CustomDecorator<string>;
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region src/decorators/login-id.decorator.d.ts
|
|
123
|
+
/**
|
|
124
|
+
* 注入当前用户 ID
|
|
125
|
+
* @constructor
|
|
126
|
+
*/
|
|
127
|
+
declare const LoginId: (...dataOrPipes: unknown[]) => ParameterDecorator;
|
|
128
|
+
//#endregion
|
|
129
|
+
//#region src/decorators/token-value.decorator.d.ts
|
|
130
|
+
/**
|
|
131
|
+
* 注入当前 Token
|
|
132
|
+
* @constructor
|
|
133
|
+
*/
|
|
134
|
+
declare const TokenValue: (...dataOrPipes: any[]) => ParameterDecorator;
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/decorators/xlt-check-permission.decorator.d.ts
|
|
137
|
+
/**
|
|
138
|
+
* 权限检查装饰器
|
|
139
|
+
* @param {string | string[]} permissions 权限列表
|
|
140
|
+
* @param {Object} [options] 模式选项
|
|
141
|
+
* @param {XltMode} [options.mode] 模式选项
|
|
142
|
+
* @constructor
|
|
143
|
+
*/
|
|
144
|
+
declare const XltCheckPermission: (permissions: string | string[], options?: {
|
|
145
|
+
mode: XltMode$1;
|
|
146
|
+
}) => _nestjs_common0.CustomDecorator<string>;
|
|
147
|
+
//#endregion
|
|
148
|
+
//#region src/decorators/xlt-check-role.decorator.d.ts
|
|
149
|
+
/**
|
|
150
|
+
* 角色检查装饰器
|
|
151
|
+
* @param {string | string[]} roles 角色列表
|
|
152
|
+
* @param {Object} [options] 模式选项
|
|
153
|
+
* @param {XltMode} [options.mode] 模式选项
|
|
154
|
+
* @constructor
|
|
155
|
+
*/
|
|
156
|
+
declare const XltCheckRole: (roles: string | string[], options?: {
|
|
157
|
+
mode: XltMode$1;
|
|
158
|
+
}) => _nestjs_common0.CustomDecorator<string>;
|
|
159
|
+
//#endregion
|
|
160
|
+
//#region src/decorators/xlt-check-safe.decorator.d.ts
|
|
161
|
+
declare const XLT_CHECK_SAFE_KEY = "XLT_CHECK_SAFE";
|
|
162
|
+
declare const XltCheckSafe: (business: string) => _nestjs_common0.CustomDecorator<string>;
|
|
163
|
+
//#endregion
|
|
164
|
+
//#region src/guards/xlt-token.guard.d.ts
|
|
165
|
+
declare class XltTokenGuard implements CanActivate {
|
|
166
|
+
private readonly reflector;
|
|
167
|
+
private readonly config;
|
|
168
|
+
private readonly stpLogic;
|
|
169
|
+
private readonly stpPermLogic?;
|
|
170
|
+
constructor(reflector: Reflector, config: XltTokenConfig$1, stpLogic: StpLogic$1, stpPermLogic?: StpPermLogic$1 | undefined);
|
|
171
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
172
|
+
private requiresLogin;
|
|
173
|
+
private getBusiness;
|
|
174
|
+
}
|
|
175
|
+
//#endregion
|
|
176
|
+
//#region src/guards/xlt-abstract-login.guard.d.ts
|
|
177
|
+
declare abstract class XltAbstractLoginGuard implements CanActivate {
|
|
178
|
+
protected readonly reflector: Reflector;
|
|
179
|
+
protected readonly config: XltTokenConfig$1;
|
|
180
|
+
protected readonly stpLogic: StpLogic$1;
|
|
181
|
+
protected constructor(reflector: Reflector, config: XltTokenConfig$1, stpLogic: StpLogic$1);
|
|
182
|
+
canActivate(ctx: ExecutionContext): Promise<boolean>;
|
|
183
|
+
protected requiresLogin(ctx: ExecutionContext): boolean;
|
|
184
|
+
protected onAuthSuccess?(result: {
|
|
185
|
+
ok: boolean;
|
|
186
|
+
loginId?: string | undefined;
|
|
187
|
+
token?: string | undefined;
|
|
188
|
+
reason?: NotLoginType$1 | undefined;
|
|
189
|
+
}, request: any): void | Promise<void>;
|
|
190
|
+
protected onAuthFail?(result: {
|
|
191
|
+
ok: boolean;
|
|
192
|
+
loginId?: string | undefined;
|
|
193
|
+
token?: string | undefined;
|
|
194
|
+
reason?: NotLoginType$1 | undefined;
|
|
195
|
+
}, request: any): void | Promise<void>;
|
|
196
|
+
protected onPermissionDenied?(result: {
|
|
197
|
+
ok: boolean;
|
|
198
|
+
loginId?: string | undefined;
|
|
199
|
+
token?: string | undefined;
|
|
200
|
+
reason?: NotLoginType$1 | undefined;
|
|
201
|
+
}, request: any): void | Promise<void>;
|
|
202
|
+
}
|
|
203
|
+
//#endregion
|
|
204
|
+
//#region src/exceptions/not-login.exception.d.ts
|
|
205
|
+
declare class NotLoginException extends UnauthorizedException {
|
|
206
|
+
readonly type: NotLoginType$1;
|
|
207
|
+
readonly token: string | undefined;
|
|
208
|
+
constructor(type: NotLoginType$1, token?: string);
|
|
209
|
+
private static describeType;
|
|
210
|
+
}
|
|
211
|
+
//#endregion
|
|
212
|
+
//#region src/exceptions/not-permission.exception.d.ts
|
|
213
|
+
declare class NotPermissionException extends ForbiddenException {
|
|
214
|
+
readonly permission: string | string[];
|
|
215
|
+
readonly mode: XltMode$1;
|
|
216
|
+
constructor(permission: string | string[], mode: XltMode$1);
|
|
217
|
+
}
|
|
218
|
+
//#endregion
|
|
219
|
+
//#region src/exceptions/not-role.exception.d.ts
|
|
220
|
+
declare class NotRoleException extends ForbiddenException {
|
|
221
|
+
readonly role: string | string[];
|
|
222
|
+
readonly mode: XltMode$1;
|
|
223
|
+
constructor(role: string | string[], mode: XltMode$1);
|
|
224
|
+
}
|
|
225
|
+
//#endregion
|
|
226
|
+
//#region src/exceptions/not-safe.exception.d.ts
|
|
227
|
+
declare class NotSafeException extends ForbiddenException {
|
|
228
|
+
readonly business: string;
|
|
229
|
+
constructor(business: string);
|
|
230
|
+
}
|
|
231
|
+
//#endregion
|
|
232
|
+
export { type AuthResult, type CreateOptions, DEFAULT_XLT_TOKEN_CONFIG, type DeviceInfo, type HttpContext, JwtStrategy, LoginId, MemoryStore, NotLoginException, NotLoginType, NotPermissionException, NotRoleException, NotSafeException, RedisStore, type StpInterface, StpLogic, StpPermLogic, StpUtil, type TokenStrategy, TokenValue, UuidStrategy, XLT_CHECK_SAFE_KEY, XLT_REDIS_CLIENT, XLT_STP_INTERFACE, XLT_TOKEN_CONFIG, XLT_TOKEN_HOOKS, XLT_TOKEN_STORE, XLT_TOKEN_STRATEGY, XltAbstractLoginGuard, XltCheckLogin, XltCheckPermission, XltCheckRole, XltCheckSafe, type XltHooks, XltIgnore, XltMode, XltSession, type XltTokenConfig, type XltTokenContext, XltTokenGuard, XltTokenModule, type XltTokenModuleAsyncOptions, type XltTokenModuleOptions, type XltTokenStore, createExpressContext, createMockHttpContext, createXltToken, matchPermission, setStpLogic, setStpPermLogic };
|
|
233
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/xlt-token.module.ts","../src/store/redis-store.ts","../src/token/jwt-strategy.ts","../src/decorators/xlt-check-login.decorator.ts","../src/decorators/xlt-ignore.decorator.ts","../src/decorators/login-id.decorator.ts","../src/decorators/token-value.decorator.ts","../src/decorators/xlt-check-permission.decorator.ts","../src/decorators/xlt-check-role.decorator.ts","../src/decorators/xlt-check-safe.decorator.ts","../src/guards/xlt-token.guard.ts","../src/guards/xlt-abstract-login.guard.ts","../src/exceptions/not-login.exception.ts","../src/exceptions/not-permission.exception.ts","../src/exceptions/not-role.exception.ts","../src/exceptions/not-safe.exception.ts"],"mappings":"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"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import * as _nestjs_common0 from "@nestjs/common";
|
|
2
|
+
import { CanActivate, ExecutionContext, ForbiddenException, ModuleMetadata, Provider, UnauthorizedException } from "@nestjs/common";
|
|
3
|
+
import * as _xlt_token_core0 from "@xlt-token/core";
|
|
4
|
+
import { AuthResult, CreateOptions, DEFAULT_XLT_TOKEN_CONFIG, DeviceInfo, HttpContext, MemoryStore, NotLoginType, NotLoginType as NotLoginType$1, StpInterface, StpInterface as StpInterface$1, StpLogic, StpLogic as StpLogic$1, StpPermLogic, StpPermLogic as StpPermLogic$1, StpUtil, TokenStrategy, TokenStrategy as TokenStrategy$1, UuidStrategy, XLT_STP_INTERFACE, XLT_TOKEN_CONFIG, XLT_TOKEN_HOOKS, XLT_TOKEN_STORE, XLT_TOKEN_STRATEGY, XltHooks, XltHooks as XltHooks$1, XltMode, XltMode as XltMode$1, XltSession, XltTokenConfig, XltTokenConfig as XltTokenConfig$1, XltTokenContext, XltTokenStore, XltTokenStore as XltTokenStore$1, createExpressContext, createMockHttpContext, createXltToken, matchPermission, setStpLogic, setStpPermLogic } from "@xlt-token/core";
|
|
5
|
+
import { JwtPayload } from "jsonwebtoken";
|
|
6
|
+
import { Reflector } from "@nestjs/core";
|
|
7
|
+
|
|
8
|
+
//#region src/xlt-token.module.d.ts
|
|
9
|
+
interface XltTokenModuleOptions {
|
|
10
|
+
config?: Partial<XltTokenConfig$1>;
|
|
11
|
+
store?: {
|
|
12
|
+
useClass: new (...args: any[]) => XltTokenStore$1;
|
|
13
|
+
} | {
|
|
14
|
+
useValue: XltTokenStore$1;
|
|
15
|
+
};
|
|
16
|
+
strategy?: {
|
|
17
|
+
useClass: new (...args: any[]) => TokenStrategy$1;
|
|
18
|
+
};
|
|
19
|
+
isGlobal?: boolean;
|
|
20
|
+
providers?: Provider[];
|
|
21
|
+
stpInterface?: new (...args: any[]) => StpInterface$1;
|
|
22
|
+
hooks?: XltHooks$1;
|
|
23
|
+
}
|
|
24
|
+
interface XltTokenModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
25
|
+
useFactory: (...args: any[]) => Promise<XltTokenModuleOptions> | XltTokenModuleOptions;
|
|
26
|
+
inject?: any[];
|
|
27
|
+
store?: {
|
|
28
|
+
useClass: new (...args: any[]) => XltTokenStore$1;
|
|
29
|
+
} | {
|
|
30
|
+
useValue: XltTokenStore$1;
|
|
31
|
+
};
|
|
32
|
+
strategy?: {
|
|
33
|
+
useClass: new (...args: any[]) => TokenStrategy$1;
|
|
34
|
+
};
|
|
35
|
+
isGlobal?: boolean;
|
|
36
|
+
providers?: Provider[];
|
|
37
|
+
stpInterface?: new (...args: any[]) => StpInterface$1;
|
|
38
|
+
hooks?: XltHooks$1;
|
|
39
|
+
}
|
|
40
|
+
declare class XltTokenModule {
|
|
41
|
+
private static createStoreProvider;
|
|
42
|
+
private static createStrategyProvider;
|
|
43
|
+
private static createStpInterfaceProvider;
|
|
44
|
+
private static createHooksProvider;
|
|
45
|
+
private static readonly stpLogicProvider;
|
|
46
|
+
private static readonly stpPermLogicProvider;
|
|
47
|
+
private static readonly initProvider;
|
|
48
|
+
private static readonly moduleExports;
|
|
49
|
+
static forRoot(options?: XltTokenModuleOptions): {
|
|
50
|
+
module: typeof XltTokenModule;
|
|
51
|
+
providers: Provider[];
|
|
52
|
+
exports: (string | typeof StpLogic$1 | typeof StpPermLogic$1)[];
|
|
53
|
+
global: boolean;
|
|
54
|
+
};
|
|
55
|
+
static forRootAsync(options: XltTokenModuleAsyncOptions): {
|
|
56
|
+
module: typeof XltTokenModule;
|
|
57
|
+
imports: (_nestjs_common0.Type<any> | _nestjs_common0.DynamicModule | Promise<_nestjs_common0.DynamicModule> | _nestjs_common0.ForwardReference<any>)[];
|
|
58
|
+
providers: (_nestjs_common0.Type<any> | _nestjs_common0.ClassProvider<any> | _nestjs_common0.ValueProvider<any> | _nestjs_common0.FactoryProvider<any> | _nestjs_common0.ExistingProvider<any> | {
|
|
59
|
+
provide: string;
|
|
60
|
+
useFactory: (...args: any[]) => Promise<{
|
|
61
|
+
tokenName: string;
|
|
62
|
+
timeout: number;
|
|
63
|
+
activeTimeout: number;
|
|
64
|
+
isConcurrent: boolean;
|
|
65
|
+
isShare: boolean;
|
|
66
|
+
tokenStyle: "uuid" | "simple-uuid" | "random-32";
|
|
67
|
+
isReadHeader: boolean;
|
|
68
|
+
isReadCookie: boolean;
|
|
69
|
+
isReadQuery: boolean;
|
|
70
|
+
tokenPrefix: string;
|
|
71
|
+
defaultCheck: boolean;
|
|
72
|
+
permCacheTimeout?: number;
|
|
73
|
+
offlineRecordEnabled?: boolean;
|
|
74
|
+
offlineRecordTimeout?: number;
|
|
75
|
+
deviceConcurrent?: boolean;
|
|
76
|
+
jwt?: _xlt_token_core0.JwtConfig;
|
|
77
|
+
}>;
|
|
78
|
+
inject: any[];
|
|
79
|
+
})[];
|
|
80
|
+
exports: (string | typeof StpLogic$1 | typeof StpPermLogic$1)[];
|
|
81
|
+
global: boolean;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
//#region src/store/redis-store.d.ts
|
|
86
|
+
declare const XLT_REDIS_CLIENT = "XLT_REDIS_CLIENT";
|
|
87
|
+
declare class RedisStore implements XltTokenStore$1 {
|
|
88
|
+
private readonly redisClient;
|
|
89
|
+
constructor(redisClient: any);
|
|
90
|
+
get(key: string): Promise<string | null>;
|
|
91
|
+
set(key: string, value: string, timeoutSec: number): Promise<void>;
|
|
92
|
+
delete(key: string): Promise<void>;
|
|
93
|
+
update(key: string, value: string): Promise<void>;
|
|
94
|
+
has(key: string): Promise<boolean>;
|
|
95
|
+
updateTimeout(key: string, timeoutSec: number): Promise<void>;
|
|
96
|
+
getTimeout(key: string): Promise<number>;
|
|
97
|
+
keys(pattern: string): Promise<string[]>;
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
100
|
+
//#region src/token/jwt-strategy.d.ts
|
|
101
|
+
declare class JwtStrategy implements TokenStrategy$1 {
|
|
102
|
+
private readonly config;
|
|
103
|
+
constructor(config: XltTokenConfig$1);
|
|
104
|
+
createToken(loginId: string, config: XltTokenConfig$1): string;
|
|
105
|
+
generateToken(payload: any): string;
|
|
106
|
+
verifyToken(token: string): JwtPayload & {
|
|
107
|
+
sub: string;
|
|
108
|
+
jti: string;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//#endregion
|
|
112
|
+
//#region src/decorators/xlt-check-login.decorator.d.ts
|
|
113
|
+
/**
|
|
114
|
+
* 登录校验装饰器
|
|
115
|
+
* @constructor
|
|
116
|
+
*/
|
|
117
|
+
declare const XltCheckLogin: () => _nestjs_common0.CustomDecorator<string>;
|
|
118
|
+
//#endregion
|
|
119
|
+
//#region src/decorators/xlt-ignore.decorator.d.ts
|
|
120
|
+
declare const XltIgnore: () => _nestjs_common0.CustomDecorator<string>;
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region src/decorators/login-id.decorator.d.ts
|
|
123
|
+
/**
|
|
124
|
+
* 注入当前用户 ID
|
|
125
|
+
* @constructor
|
|
126
|
+
*/
|
|
127
|
+
declare const LoginId: (...dataOrPipes: unknown[]) => ParameterDecorator;
|
|
128
|
+
//#endregion
|
|
129
|
+
//#region src/decorators/token-value.decorator.d.ts
|
|
130
|
+
/**
|
|
131
|
+
* 注入当前 Token
|
|
132
|
+
* @constructor
|
|
133
|
+
*/
|
|
134
|
+
declare const TokenValue: (...dataOrPipes: any[]) => ParameterDecorator;
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/decorators/xlt-check-permission.decorator.d.ts
|
|
137
|
+
/**
|
|
138
|
+
* 权限检查装饰器
|
|
139
|
+
* @param {string | string[]} permissions 权限列表
|
|
140
|
+
* @param {Object} [options] 模式选项
|
|
141
|
+
* @param {XltMode} [options.mode] 模式选项
|
|
142
|
+
* @constructor
|
|
143
|
+
*/
|
|
144
|
+
declare const XltCheckPermission: (permissions: string | string[], options?: {
|
|
145
|
+
mode: XltMode$1;
|
|
146
|
+
}) => _nestjs_common0.CustomDecorator<string>;
|
|
147
|
+
//#endregion
|
|
148
|
+
//#region src/decorators/xlt-check-role.decorator.d.ts
|
|
149
|
+
/**
|
|
150
|
+
* 角色检查装饰器
|
|
151
|
+
* @param {string | string[]} roles 角色列表
|
|
152
|
+
* @param {Object} [options] 模式选项
|
|
153
|
+
* @param {XltMode} [options.mode] 模式选项
|
|
154
|
+
* @constructor
|
|
155
|
+
*/
|
|
156
|
+
declare const XltCheckRole: (roles: string | string[], options?: {
|
|
157
|
+
mode: XltMode$1;
|
|
158
|
+
}) => _nestjs_common0.CustomDecorator<string>;
|
|
159
|
+
//#endregion
|
|
160
|
+
//#region src/decorators/xlt-check-safe.decorator.d.ts
|
|
161
|
+
declare const XLT_CHECK_SAFE_KEY = "XLT_CHECK_SAFE";
|
|
162
|
+
declare const XltCheckSafe: (business: string) => _nestjs_common0.CustomDecorator<string>;
|
|
163
|
+
//#endregion
|
|
164
|
+
//#region src/guards/xlt-token.guard.d.ts
|
|
165
|
+
declare class XltTokenGuard implements CanActivate {
|
|
166
|
+
private readonly reflector;
|
|
167
|
+
private readonly config;
|
|
168
|
+
private readonly stpLogic;
|
|
169
|
+
private readonly stpPermLogic?;
|
|
170
|
+
constructor(reflector: Reflector, config: XltTokenConfig$1, stpLogic: StpLogic$1, stpPermLogic?: StpPermLogic$1 | undefined);
|
|
171
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
172
|
+
private requiresLogin;
|
|
173
|
+
private getBusiness;
|
|
174
|
+
}
|
|
175
|
+
//#endregion
|
|
176
|
+
//#region src/guards/xlt-abstract-login.guard.d.ts
|
|
177
|
+
declare abstract class XltAbstractLoginGuard implements CanActivate {
|
|
178
|
+
protected readonly reflector: Reflector;
|
|
179
|
+
protected readonly config: XltTokenConfig$1;
|
|
180
|
+
protected readonly stpLogic: StpLogic$1;
|
|
181
|
+
protected constructor(reflector: Reflector, config: XltTokenConfig$1, stpLogic: StpLogic$1);
|
|
182
|
+
canActivate(ctx: ExecutionContext): Promise<boolean>;
|
|
183
|
+
protected requiresLogin(ctx: ExecutionContext): boolean;
|
|
184
|
+
protected onAuthSuccess?(result: {
|
|
185
|
+
ok: boolean;
|
|
186
|
+
loginId?: string | undefined;
|
|
187
|
+
token?: string | undefined;
|
|
188
|
+
reason?: NotLoginType$1 | undefined;
|
|
189
|
+
}, request: any): void | Promise<void>;
|
|
190
|
+
protected onAuthFail?(result: {
|
|
191
|
+
ok: boolean;
|
|
192
|
+
loginId?: string | undefined;
|
|
193
|
+
token?: string | undefined;
|
|
194
|
+
reason?: NotLoginType$1 | undefined;
|
|
195
|
+
}, request: any): void | Promise<void>;
|
|
196
|
+
protected onPermissionDenied?(result: {
|
|
197
|
+
ok: boolean;
|
|
198
|
+
loginId?: string | undefined;
|
|
199
|
+
token?: string | undefined;
|
|
200
|
+
reason?: NotLoginType$1 | undefined;
|
|
201
|
+
}, request: any): void | Promise<void>;
|
|
202
|
+
}
|
|
203
|
+
//#endregion
|
|
204
|
+
//#region src/exceptions/not-login.exception.d.ts
|
|
205
|
+
declare class NotLoginException extends UnauthorizedException {
|
|
206
|
+
readonly type: NotLoginType$1;
|
|
207
|
+
readonly token: string | undefined;
|
|
208
|
+
constructor(type: NotLoginType$1, token?: string);
|
|
209
|
+
private static describeType;
|
|
210
|
+
}
|
|
211
|
+
//#endregion
|
|
212
|
+
//#region src/exceptions/not-permission.exception.d.ts
|
|
213
|
+
declare class NotPermissionException extends ForbiddenException {
|
|
214
|
+
readonly permission: string | string[];
|
|
215
|
+
readonly mode: XltMode$1;
|
|
216
|
+
constructor(permission: string | string[], mode: XltMode$1);
|
|
217
|
+
}
|
|
218
|
+
//#endregion
|
|
219
|
+
//#region src/exceptions/not-role.exception.d.ts
|
|
220
|
+
declare class NotRoleException extends ForbiddenException {
|
|
221
|
+
readonly role: string | string[];
|
|
222
|
+
readonly mode: XltMode$1;
|
|
223
|
+
constructor(role: string | string[], mode: XltMode$1);
|
|
224
|
+
}
|
|
225
|
+
//#endregion
|
|
226
|
+
//#region src/exceptions/not-safe.exception.d.ts
|
|
227
|
+
declare class NotSafeException extends ForbiddenException {
|
|
228
|
+
readonly business: string;
|
|
229
|
+
constructor(business: string);
|
|
230
|
+
}
|
|
231
|
+
//#endregion
|
|
232
|
+
export { type AuthResult, type CreateOptions, DEFAULT_XLT_TOKEN_CONFIG, type DeviceInfo, type HttpContext, JwtStrategy, LoginId, MemoryStore, NotLoginException, NotLoginType, NotPermissionException, NotRoleException, NotSafeException, RedisStore, type StpInterface, StpLogic, StpPermLogic, StpUtil, type TokenStrategy, TokenValue, UuidStrategy, XLT_CHECK_SAFE_KEY, XLT_REDIS_CLIENT, XLT_STP_INTERFACE, XLT_TOKEN_CONFIG, XLT_TOKEN_HOOKS, XLT_TOKEN_STORE, XLT_TOKEN_STRATEGY, XltAbstractLoginGuard, XltCheckLogin, XltCheckPermission, XltCheckRole, XltCheckSafe, type XltHooks, XltIgnore, XltMode, XltSession, type XltTokenConfig, type XltTokenContext, XltTokenGuard, XltTokenModule, type XltTokenModuleAsyncOptions, type XltTokenModuleOptions, type XltTokenStore, createExpressContext, createMockHttpContext, createXltToken, matchPermission, setStpLogic, setStpPermLogic };
|
|
233
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/xlt-token.module.ts","../src/store/redis-store.ts","../src/token/jwt-strategy.ts","../src/decorators/xlt-check-login.decorator.ts","../src/decorators/xlt-ignore.decorator.ts","../src/decorators/login-id.decorator.ts","../src/decorators/token-value.decorator.ts","../src/decorators/xlt-check-permission.decorator.ts","../src/decorators/xlt-check-role.decorator.ts","../src/decorators/xlt-check-safe.decorator.ts","../src/guards/xlt-token.guard.ts","../src/guards/xlt-abstract-login.guard.ts","../src/exceptions/not-login.exception.ts","../src/exceptions/not-permission.exception.ts","../src/exceptions/not-role.exception.ts","../src/exceptions/not-safe.exception.ts"],"mappings":"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"}
|