@xlt-token/nestjs 1.0.1 → 1.1.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/dist/index.cjs CHANGED
@@ -1,7 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  let _nestjs_common = require("@nestjs/common");
3
3
  let _xlt_token_core = require("@xlt-token/core");
4
- let jsonwebtoken = require("jsonwebtoken");
4
+ let node_crypto = require("node:crypto");
5
+ let node_module = require("node:module");
5
6
  let _nestjs_core = require("@nestjs/core");
6
7
 
7
8
  //#region \0@oxc-project+runtime@0.112.0/helpers/decorate.js
@@ -19,51 +20,6 @@ let XltTokenModule = class XltTokenModule {
19
20
  static {
20
21
  _XltTokenModule = this;
21
22
  }
22
- static createStoreProvider(store) {
23
- if (!store) return {
24
- provide: _xlt_token_core.XLT_TOKEN_STORE,
25
- useClass: _xlt_token_core.MemoryStore
26
- };
27
- return "useClass" in store ? {
28
- provide: _xlt_token_core.XLT_TOKEN_STORE,
29
- useClass: store.useClass
30
- } : {
31
- provide: _xlt_token_core.XLT_TOKEN_STORE,
32
- useValue: store.useValue
33
- };
34
- }
35
- static createStrategyProvider(strategy) {
36
- return strategy?.useClass ? {
37
- provide: _xlt_token_core.XLT_TOKEN_STRATEGY,
38
- useClass: strategy.useClass
39
- } : {
40
- provide: _xlt_token_core.XLT_TOKEN_STRATEGY,
41
- useClass: _xlt_token_core.UuidStrategy
42
- };
43
- }
44
- static createStpInterfaceProvider(stpInterface) {
45
- if (stpInterface) return {
46
- provide: _xlt_token_core.XLT_STP_INTERFACE,
47
- useClass: stpInterface
48
- };
49
- return {
50
- provide: _xlt_token_core.XLT_STP_INTERFACE,
51
- useValue: {
52
- getPermissionList: () => {
53
- throw new Error("StpInterface not registered: getPermissionList");
54
- },
55
- getRoleList: () => {
56
- throw new Error("StpInterface not registered: getRoleList");
57
- }
58
- }
59
- };
60
- }
61
- static createHooksProvider(hooks) {
62
- return {
63
- provide: _xlt_token_core.XLT_TOKEN_HOOKS,
64
- useValue: hooks ?? {}
65
- };
66
- }
67
23
  static {
68
24
  this.stpLogicProvider = {
69
25
  provide: _xlt_token_core.StpLogic,
@@ -114,10 +70,7 @@ let XltTokenModule = class XltTokenModule {
114
70
  providers: [
115
71
  {
116
72
  provide: _xlt_token_core.XLT_TOKEN_CONFIG,
117
- useValue: {
118
- ..._xlt_token_core.DEFAULT_XLT_TOKEN_CONFIG,
119
- ...userConfig
120
- }
73
+ useValue: (0, _xlt_token_core.normalizeXltTokenConfig)(userConfig)
121
74
  },
122
75
  _XltTokenModule.createStoreProvider(store),
123
76
  _XltTokenModule.createStrategyProvider(strategy),
@@ -142,10 +95,7 @@ let XltTokenModule = class XltTokenModule {
142
95
  provide: _xlt_token_core.XLT_TOKEN_CONFIG,
143
96
  useFactory: async (...args) => {
144
97
  const { config = {} } = await useFactory(...args);
145
- return {
146
- ..._xlt_token_core.DEFAULT_XLT_TOKEN_CONFIG,
147
- ...config
148
- };
98
+ return (0, _xlt_token_core.normalizeXltTokenConfig)(config);
149
99
  },
150
100
  inject
151
101
  },
@@ -162,6 +112,51 @@ let XltTokenModule = class XltTokenModule {
162
112
  global: isGlobal
163
113
  };
164
114
  }
115
+ static createStoreProvider(store) {
116
+ if (!store) return {
117
+ provide: _xlt_token_core.XLT_TOKEN_STORE,
118
+ useClass: _xlt_token_core.MemoryStore
119
+ };
120
+ return "useClass" in store ? {
121
+ provide: _xlt_token_core.XLT_TOKEN_STORE,
122
+ useClass: store.useClass
123
+ } : {
124
+ provide: _xlt_token_core.XLT_TOKEN_STORE,
125
+ useValue: store.useValue
126
+ };
127
+ }
128
+ static createStrategyProvider(strategy) {
129
+ return strategy?.useClass ? {
130
+ provide: _xlt_token_core.XLT_TOKEN_STRATEGY,
131
+ useClass: strategy.useClass
132
+ } : {
133
+ provide: _xlt_token_core.XLT_TOKEN_STRATEGY,
134
+ useClass: _xlt_token_core.UuidStrategy
135
+ };
136
+ }
137
+ static createStpInterfaceProvider(stpInterface) {
138
+ if (stpInterface) return {
139
+ provide: _xlt_token_core.XLT_STP_INTERFACE,
140
+ useClass: stpInterface
141
+ };
142
+ return {
143
+ provide: _xlt_token_core.XLT_STP_INTERFACE,
144
+ useValue: {
145
+ getPermissionList: () => {
146
+ throw new Error("StpInterface not registered: getPermissionList");
147
+ },
148
+ getRoleList: () => {
149
+ throw new Error("StpInterface not registered: getRoleList");
150
+ }
151
+ }
152
+ };
153
+ }
154
+ static createHooksProvider(hooks) {
155
+ return {
156
+ provide: _xlt_token_core.XLT_TOKEN_HOOKS,
157
+ useValue: hooks ?? {}
158
+ };
159
+ }
165
160
  };
166
161
  XltTokenModule = _XltTokenModule = __decorate([(0, _nestjs_common.Module)({})], XltTokenModule);
167
162
 
@@ -235,34 +230,55 @@ RedisStore = __decorate([
235
230
 
236
231
  //#endregion
237
232
  //#region src/token/jwt-strategy.ts
238
- var _ref$2;
233
+ const require$1 = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href);
234
+ let jsonwebtoken;
235
+ function getJsonwebtoken() {
236
+ try {
237
+ jsonwebtoken ??= require$1("jsonwebtoken");
238
+ return jsonwebtoken;
239
+ } catch (error) {
240
+ if (error.code === "MODULE_NOT_FOUND") throw new Error("JwtStrategy requires the optional peer dependency \"jsonwebtoken\". Install it in your application with \"pnpm add jsonwebtoken\".");
241
+ throw error;
242
+ }
243
+ }
239
244
  let JwtStrategy = class JwtStrategy {
240
245
  constructor(config) {
241
246
  this.config = config;
242
247
  }
243
- createToken(loginId, config) {
244
- const jwt = config.jwt;
245
- return (0, jsonwebtoken.sign)({
248
+ ensureJwtConfig(config) {
249
+ const jwt = (config ?? this.config).jwt;
250
+ if (!jwt || !jwt.secret) throw new Error("JwtStrategy requires jwt config with a secret. Provide { jwt: { secret: \"your-secret\" } } in the module config.");
251
+ return jwt;
252
+ }
253
+ createToken(loginId, config, options) {
254
+ const { sign } = getJsonwebtoken();
255
+ const jwt = this.ensureJwtConfig(config);
256
+ const jti = (0, node_crypto.randomUUID)();
257
+ const resolvedTimeout = options?.timeout ?? config.timeout;
258
+ const hasExpiry = typeof resolvedTimeout === "number" ? resolvedTimeout > 0 : true;
259
+ return sign({
246
260
  sub: loginId,
247
- jti: crypto.randomUUID()
261
+ jti
248
262
  }, jwt.secret, {
249
263
  algorithm: jwt.algorithm ?? "HS256",
250
264
  ...jwt.issuer && { issuer: jwt.issuer },
251
265
  ...jwt.audience && { audience: jwt.audience },
252
- ...config.timeout > 0 && { expiresIn: config.timeout }
266
+ ...hasExpiry && { expiresIn: resolvedTimeout }
253
267
  });
254
268
  }
255
269
  generateToken(payload) {
256
- return (0, jsonwebtoken.sign)(payload, this.config.jwt.secret);
270
+ const { sign } = getJsonwebtoken();
271
+ return sign(payload, this.ensureJwtConfig().secret);
257
272
  }
258
273
  verifyToken(token) {
259
- return (0, jsonwebtoken.verify)(token, this.config.jwt.secret);
274
+ const { verify } = getJsonwebtoken();
275
+ return verify(token, this.ensureJwtConfig().secret);
260
276
  }
261
277
  };
262
278
  JwtStrategy = __decorate([
263
279
  (0, _nestjs_common.Injectable)(),
264
280
  __decorateParam(0, (0, _nestjs_common.Inject)(_xlt_token_core.XLT_TOKEN_CONFIG)),
265
- __decorateMetadata("design:paramtypes", [typeof (_ref$2 = typeof _xlt_token_core.XltTokenConfig !== "undefined" && _xlt_token_core.XltTokenConfig) === "function" ? _ref$2 : Object])
281
+ __decorateMetadata("design:paramtypes", [Object])
266
282
  ], JwtStrategy);
267
283
 
268
284
  //#endregion
package/dist/index.d.cts CHANGED
@@ -1,13 +1,11 @@
1
1
  import * as _nestjs_common0 from "@nestjs/common";
2
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";
3
+ import { AuthResult, CreateOptions, DEFAULT_XLT_TOKEN_CONFIG, DeviceInfo, DurationInput, 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, XltTokenConfigInput, XltTokenContext, XltTokenStore, XltTokenStore as XltTokenStore$1, createExpressContext, createMockHttpContext, createXltToken, matchPermission, setStpLogic, setStpPermLogic } from "@xlt-token/core";
6
4
  import { Reflector } from "@nestjs/core";
7
5
 
8
6
  //#region src/xlt-token.module.d.ts
9
7
  interface XltTokenModuleOptions {
10
- config?: Partial<XltTokenConfig$1>;
8
+ config?: Partial<XltTokenConfigInput>;
11
9
  store?: {
12
10
  useClass: new (...args: any[]) => XltTokenStore$1;
13
11
  } | {
@@ -38,10 +36,6 @@ interface XltTokenModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
38
36
  hooks?: XltHooks$1;
39
37
  }
40
38
  declare class XltTokenModule {
41
- private static createStoreProvider;
42
- private static createStrategyProvider;
43
- private static createStpInterfaceProvider;
44
- private static createHooksProvider;
45
39
  private static readonly stpLogicProvider;
46
40
  private static readonly stpPermLogicProvider;
47
41
  private static readonly initProvider;
@@ -57,29 +51,16 @@ declare class XltTokenModule {
57
51
  imports: (_nestjs_common0.Type<any> | _nestjs_common0.DynamicModule | Promise<_nestjs_common0.DynamicModule> | _nestjs_common0.ForwardReference<any>)[];
58
52
  providers: (_nestjs_common0.Type<any> | _nestjs_common0.ClassProvider<any> | _nestjs_common0.ValueProvider<any> | _nestjs_common0.FactoryProvider<any> | _nestjs_common0.ExistingProvider<any> | {
59
53
  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
- }>;
54
+ useFactory: (...args: any[]) => Promise<XltTokenConfig$1>;
78
55
  inject: any[];
79
56
  })[];
80
57
  exports: (string | typeof StpLogic$1 | typeof StpPermLogic$1)[];
81
58
  global: boolean;
82
59
  };
60
+ private static createStoreProvider;
61
+ private static createStrategyProvider;
62
+ private static createStpInterfaceProvider;
63
+ private static createHooksProvider;
83
64
  }
84
65
  //#endregion
85
66
  //#region src/store/redis-store.d.ts
@@ -98,15 +79,19 @@ declare class RedisStore implements XltTokenStore$1 {
98
79
  }
99
80
  //#endregion
100
81
  //#region src/token/jwt-strategy.d.ts
101
- declare class JwtStrategy implements TokenStrategy$1 {
82
+ type XltJwtPayload = Record<string, any> & {
83
+ sub: string;
84
+ jti: string;
85
+ };
86
+ declare class JwtStrategy implements TokenStrategy$1<XltJwtPayload> {
102
87
  private readonly config;
103
88
  constructor(config: XltTokenConfig$1);
104
- createToken(loginId: string, config: XltTokenConfig$1): string;
89
+ private ensureJwtConfig;
90
+ createToken(loginId: string, config: XltTokenConfig$1, options?: {
91
+ timeout?: DurationInput;
92
+ }): string;
105
93
  generateToken(payload: any): string;
106
- verifyToken(token: string): JwtPayload & {
107
- sub: string;
108
- jti: string;
109
- };
94
+ verifyToken(token: string): XltJwtPayload;
110
95
  }
111
96
  //#endregion
112
97
  //#region src/decorators/xlt-check-login.decorator.d.ts
@@ -1 +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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"}
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 CHANGED
@@ -1,13 +1,11 @@
1
1
  import * as _nestjs_common0 from "@nestjs/common";
2
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";
3
+ import { AuthResult, CreateOptions, DEFAULT_XLT_TOKEN_CONFIG, DeviceInfo, DurationInput, 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, XltTokenConfigInput, XltTokenContext, XltTokenStore, XltTokenStore as XltTokenStore$1, createExpressContext, createMockHttpContext, createXltToken, matchPermission, setStpLogic, setStpPermLogic } from "@xlt-token/core";
6
4
  import { Reflector } from "@nestjs/core";
7
5
 
8
6
  //#region src/xlt-token.module.d.ts
9
7
  interface XltTokenModuleOptions {
10
- config?: Partial<XltTokenConfig$1>;
8
+ config?: Partial<XltTokenConfigInput>;
11
9
  store?: {
12
10
  useClass: new (...args: any[]) => XltTokenStore$1;
13
11
  } | {
@@ -38,10 +36,6 @@ interface XltTokenModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
38
36
  hooks?: XltHooks$1;
39
37
  }
40
38
  declare class XltTokenModule {
41
- private static createStoreProvider;
42
- private static createStrategyProvider;
43
- private static createStpInterfaceProvider;
44
- private static createHooksProvider;
45
39
  private static readonly stpLogicProvider;
46
40
  private static readonly stpPermLogicProvider;
47
41
  private static readonly initProvider;
@@ -57,29 +51,16 @@ declare class XltTokenModule {
57
51
  imports: (_nestjs_common0.Type<any> | _nestjs_common0.DynamicModule | Promise<_nestjs_common0.DynamicModule> | _nestjs_common0.ForwardReference<any>)[];
58
52
  providers: (_nestjs_common0.Type<any> | _nestjs_common0.ClassProvider<any> | _nestjs_common0.ValueProvider<any> | _nestjs_common0.FactoryProvider<any> | _nestjs_common0.ExistingProvider<any> | {
59
53
  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
- }>;
54
+ useFactory: (...args: any[]) => Promise<XltTokenConfig$1>;
78
55
  inject: any[];
79
56
  })[];
80
57
  exports: (string | typeof StpLogic$1 | typeof StpPermLogic$1)[];
81
58
  global: boolean;
82
59
  };
60
+ private static createStoreProvider;
61
+ private static createStrategyProvider;
62
+ private static createStpInterfaceProvider;
63
+ private static createHooksProvider;
83
64
  }
84
65
  //#endregion
85
66
  //#region src/store/redis-store.d.ts
@@ -98,15 +79,19 @@ declare class RedisStore implements XltTokenStore$1 {
98
79
  }
99
80
  //#endregion
100
81
  //#region src/token/jwt-strategy.d.ts
101
- declare class JwtStrategy implements TokenStrategy$1 {
82
+ type XltJwtPayload = Record<string, any> & {
83
+ sub: string;
84
+ jti: string;
85
+ };
86
+ declare class JwtStrategy implements TokenStrategy$1<XltJwtPayload> {
102
87
  private readonly config;
103
88
  constructor(config: XltTokenConfig$1);
104
- createToken(loginId: string, config: XltTokenConfig$1): string;
89
+ private ensureJwtConfig;
90
+ createToken(loginId: string, config: XltTokenConfig$1, options?: {
91
+ timeout?: DurationInput;
92
+ }): string;
105
93
  generateToken(payload: any): string;
106
- verifyToken(token: string): JwtPayload & {
107
- sub: string;
108
- jti: string;
109
- };
94
+ verifyToken(token: string): XltJwtPayload;
110
95
  }
111
96
  //#endregion
112
97
  //#region src/decorators/xlt-check-login.decorator.d.ts
@@ -1 +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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"}
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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"}
package/dist/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
+ import { createRequire } from "node:module";
1
2
  import { ForbiddenException, Inject, Injectable, Module, Optional, SetMetadata, UnauthorizedException, createParamDecorator } from "@nestjs/common";
2
- import { DEFAULT_XLT_TOKEN_CONFIG, DEFAULT_XLT_TOKEN_CONFIG as DEFAULT_XLT_TOKEN_CONFIG$1, MemoryStore, MemoryStore as MemoryStore$1, NotLoginException as NotLoginException$1, NotLoginType, NotLoginType as NotLoginType$1, NotPermissionException as NotPermissionException$1, NotRoleException as NotRoleException$1, NotSafeException as NotSafeException$1, StpLogic, StpLogic as StpLogic$1, StpPermLogic, StpPermLogic as StpPermLogic$1, StpUtil, UuidStrategy, UuidStrategy as UuidStrategy$1, XLT_CHECK_LOGIN_KEY, XLT_IGNORE_KEY, XLT_PERMISSION_KEY, XLT_ROLE_KEY, XLT_STP_INTERFACE, XLT_STP_INTERFACE as XLT_STP_INTERFACE$1, XLT_TOKEN_CONFIG, XLT_TOKEN_CONFIG as XLT_TOKEN_CONFIG$1, XLT_TOKEN_HOOKS, XLT_TOKEN_HOOKS as XLT_TOKEN_HOOKS$1, XLT_TOKEN_STORE, XLT_TOKEN_STORE as XLT_TOKEN_STORE$1, XLT_TOKEN_STRATEGY, XLT_TOKEN_STRATEGY as XLT_TOKEN_STRATEGY$1, XltMode, XltMode as XltMode$1, XltSession, XltTokenConfig, createExpressContext, createExpressContext as createExpressContext$1, createMockHttpContext, createXltToken, matchPermission, setStpLogic, setStpLogic as setStpLogic$1, setStpPermLogic, setStpPermLogic as setStpPermLogic$1 } from "@xlt-token/core";
3
- import { sign, verify } from "jsonwebtoken";
3
+ import { DEFAULT_XLT_TOKEN_CONFIG, MemoryStore, MemoryStore as MemoryStore$1, NotLoginException as NotLoginException$1, NotLoginType, NotLoginType as NotLoginType$1, NotPermissionException as NotPermissionException$1, NotRoleException as NotRoleException$1, NotSafeException as NotSafeException$1, StpLogic, StpLogic as StpLogic$1, StpPermLogic, StpPermLogic as StpPermLogic$1, StpUtil, UuidStrategy, UuidStrategy as UuidStrategy$1, XLT_CHECK_LOGIN_KEY, XLT_IGNORE_KEY, XLT_PERMISSION_KEY, XLT_ROLE_KEY, XLT_STP_INTERFACE, XLT_STP_INTERFACE as XLT_STP_INTERFACE$1, XLT_TOKEN_CONFIG, XLT_TOKEN_CONFIG as XLT_TOKEN_CONFIG$1, XLT_TOKEN_HOOKS, XLT_TOKEN_HOOKS as XLT_TOKEN_HOOKS$1, XLT_TOKEN_STORE, XLT_TOKEN_STORE as XLT_TOKEN_STORE$1, XLT_TOKEN_STRATEGY, XLT_TOKEN_STRATEGY as XLT_TOKEN_STRATEGY$1, XltMode, XltMode as XltMode$1, XltSession, createExpressContext, createExpressContext as createExpressContext$1, createMockHttpContext, createXltToken, matchPermission, normalizeXltTokenConfig, setStpLogic, setStpLogic as setStpLogic$1, setStpPermLogic, setStpPermLogic as setStpPermLogic$1 } from "@xlt-token/core";
4
+ import { randomUUID } from "node:crypto";
4
5
  import { Reflector } from "@nestjs/core";
5
6
 
6
7
  //#region \0@oxc-project+runtime@0.112.0/helpers/decorate.js
@@ -18,51 +19,6 @@ let XltTokenModule = class XltTokenModule {
18
19
  static {
19
20
  _XltTokenModule = this;
20
21
  }
21
- static createStoreProvider(store) {
22
- if (!store) return {
23
- provide: XLT_TOKEN_STORE$1,
24
- useClass: MemoryStore$1
25
- };
26
- return "useClass" in store ? {
27
- provide: XLT_TOKEN_STORE$1,
28
- useClass: store.useClass
29
- } : {
30
- provide: XLT_TOKEN_STORE$1,
31
- useValue: store.useValue
32
- };
33
- }
34
- static createStrategyProvider(strategy) {
35
- return strategy?.useClass ? {
36
- provide: XLT_TOKEN_STRATEGY$1,
37
- useClass: strategy.useClass
38
- } : {
39
- provide: XLT_TOKEN_STRATEGY$1,
40
- useClass: UuidStrategy$1
41
- };
42
- }
43
- static createStpInterfaceProvider(stpInterface) {
44
- if (stpInterface) return {
45
- provide: XLT_STP_INTERFACE$1,
46
- useClass: stpInterface
47
- };
48
- return {
49
- provide: XLT_STP_INTERFACE$1,
50
- useValue: {
51
- getPermissionList: () => {
52
- throw new Error("StpInterface not registered: getPermissionList");
53
- },
54
- getRoleList: () => {
55
- throw new Error("StpInterface not registered: getRoleList");
56
- }
57
- }
58
- };
59
- }
60
- static createHooksProvider(hooks) {
61
- return {
62
- provide: XLT_TOKEN_HOOKS$1,
63
- useValue: hooks ?? {}
64
- };
65
- }
66
22
  static {
67
23
  this.stpLogicProvider = {
68
24
  provide: StpLogic$1,
@@ -113,10 +69,7 @@ let XltTokenModule = class XltTokenModule {
113
69
  providers: [
114
70
  {
115
71
  provide: XLT_TOKEN_CONFIG$1,
116
- useValue: {
117
- ...DEFAULT_XLT_TOKEN_CONFIG$1,
118
- ...userConfig
119
- }
72
+ useValue: normalizeXltTokenConfig(userConfig)
120
73
  },
121
74
  _XltTokenModule.createStoreProvider(store),
122
75
  _XltTokenModule.createStrategyProvider(strategy),
@@ -141,10 +94,7 @@ let XltTokenModule = class XltTokenModule {
141
94
  provide: XLT_TOKEN_CONFIG$1,
142
95
  useFactory: async (...args) => {
143
96
  const { config = {} } = await useFactory(...args);
144
- return {
145
- ...DEFAULT_XLT_TOKEN_CONFIG$1,
146
- ...config
147
- };
97
+ return normalizeXltTokenConfig(config);
148
98
  },
149
99
  inject
150
100
  },
@@ -161,6 +111,51 @@ let XltTokenModule = class XltTokenModule {
161
111
  global: isGlobal
162
112
  };
163
113
  }
114
+ static createStoreProvider(store) {
115
+ if (!store) return {
116
+ provide: XLT_TOKEN_STORE$1,
117
+ useClass: MemoryStore$1
118
+ };
119
+ return "useClass" in store ? {
120
+ provide: XLT_TOKEN_STORE$1,
121
+ useClass: store.useClass
122
+ } : {
123
+ provide: XLT_TOKEN_STORE$1,
124
+ useValue: store.useValue
125
+ };
126
+ }
127
+ static createStrategyProvider(strategy) {
128
+ return strategy?.useClass ? {
129
+ provide: XLT_TOKEN_STRATEGY$1,
130
+ useClass: strategy.useClass
131
+ } : {
132
+ provide: XLT_TOKEN_STRATEGY$1,
133
+ useClass: UuidStrategy$1
134
+ };
135
+ }
136
+ static createStpInterfaceProvider(stpInterface) {
137
+ if (stpInterface) return {
138
+ provide: XLT_STP_INTERFACE$1,
139
+ useClass: stpInterface
140
+ };
141
+ return {
142
+ provide: XLT_STP_INTERFACE$1,
143
+ useValue: {
144
+ getPermissionList: () => {
145
+ throw new Error("StpInterface not registered: getPermissionList");
146
+ },
147
+ getRoleList: () => {
148
+ throw new Error("StpInterface not registered: getRoleList");
149
+ }
150
+ }
151
+ };
152
+ }
153
+ static createHooksProvider(hooks) {
154
+ return {
155
+ provide: XLT_TOKEN_HOOKS$1,
156
+ useValue: hooks ?? {}
157
+ };
158
+ }
164
159
  };
165
160
  XltTokenModule = _XltTokenModule = __decorate([Module({})], XltTokenModule);
166
161
 
@@ -234,34 +229,55 @@ RedisStore = __decorate([
234
229
 
235
230
  //#endregion
236
231
  //#region src/token/jwt-strategy.ts
237
- var _ref$2;
232
+ const require = createRequire(import.meta.url);
233
+ let jsonwebtoken;
234
+ function getJsonwebtoken() {
235
+ try {
236
+ jsonwebtoken ??= require("jsonwebtoken");
237
+ return jsonwebtoken;
238
+ } catch (error) {
239
+ if (error.code === "MODULE_NOT_FOUND") throw new Error("JwtStrategy requires the optional peer dependency \"jsonwebtoken\". Install it in your application with \"pnpm add jsonwebtoken\".");
240
+ throw error;
241
+ }
242
+ }
238
243
  let JwtStrategy = class JwtStrategy {
239
244
  constructor(config) {
240
245
  this.config = config;
241
246
  }
242
- createToken(loginId, config) {
243
- const jwt = config.jwt;
247
+ ensureJwtConfig(config) {
248
+ const jwt = (config ?? this.config).jwt;
249
+ if (!jwt || !jwt.secret) throw new Error("JwtStrategy requires jwt config with a secret. Provide { jwt: { secret: \"your-secret\" } } in the module config.");
250
+ return jwt;
251
+ }
252
+ createToken(loginId, config, options) {
253
+ const { sign } = getJsonwebtoken();
254
+ const jwt = this.ensureJwtConfig(config);
255
+ const jti = randomUUID();
256
+ const resolvedTimeout = options?.timeout ?? config.timeout;
257
+ const hasExpiry = typeof resolvedTimeout === "number" ? resolvedTimeout > 0 : true;
244
258
  return sign({
245
259
  sub: loginId,
246
- jti: crypto.randomUUID()
260
+ jti
247
261
  }, jwt.secret, {
248
262
  algorithm: jwt.algorithm ?? "HS256",
249
263
  ...jwt.issuer && { issuer: jwt.issuer },
250
264
  ...jwt.audience && { audience: jwt.audience },
251
- ...config.timeout > 0 && { expiresIn: config.timeout }
265
+ ...hasExpiry && { expiresIn: resolvedTimeout }
252
266
  });
253
267
  }
254
268
  generateToken(payload) {
255
- return sign(payload, this.config.jwt.secret);
269
+ const { sign } = getJsonwebtoken();
270
+ return sign(payload, this.ensureJwtConfig().secret);
256
271
  }
257
272
  verifyToken(token) {
258
- return verify(token, this.config.jwt.secret);
273
+ const { verify } = getJsonwebtoken();
274
+ return verify(token, this.ensureJwtConfig().secret);
259
275
  }
260
276
  };
261
277
  JwtStrategy = __decorate([
262
278
  Injectable(),
263
279
  __decorateParam(0, Inject(XLT_TOKEN_CONFIG$1)),
264
- __decorateMetadata("design:paramtypes", [typeof (_ref$2 = typeof XltTokenConfig !== "undefined" && XltTokenConfig) === "function" ? _ref$2 : Object])
280
+ __decorateMetadata("design:paramtypes", [Object])
265
281
  ], JwtStrategy);
266
282
 
267
283
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["XLT_TOKEN_STORE","MemoryStore","XLT_TOKEN_STRATEGY","UuidStrategy","XLT_STP_INTERFACE","XLT_TOKEN_HOOKS","StpLogic","XLT_TOKEN_CONFIG","StpPermLogic","DEFAULT_XLT_TOKEN_CONFIG","XLT_TOKEN_CONFIG","XltMode","XltMode","NotLoginType","createExpressContext","CoreNotLoginException","CoreNotPermissionException","CoreNotRoleException","CoreNotSafeException","XLT_TOKEN_CONFIG","CoreNotLoginException","XLT_TOKEN_CONFIG"],"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/exceptions/not-login.exception.ts","../src/exceptions/not-permission.exception.ts","../src/exceptions/not-role.exception.ts","../src/exceptions/not-safe.exception.ts","../src/http/nest-bridge.ts","../src/guards/xlt-token.guard.ts","../src/guards/xlt-abstract-login.guard.ts"],"sourcesContent":["import { Module, ModuleMetadata, Provider } from '@nestjs/common';\nimport {\n DEFAULT_XLT_TOKEN_CONFIG,\n MemoryStore,\n StpInterface,\n StpLogic,\n StpPermLogic,\n TokenStrategy,\n UuidStrategy,\n XLT_STP_INTERFACE,\n XLT_TOKEN_CONFIG,\n XLT_TOKEN_HOOKS,\n XLT_TOKEN_STORE,\n XLT_TOKEN_STRATEGY,\n XltHooks,\n XltTokenConfig,\n XltTokenStore,\n setStpLogic,\n setStpPermLogic,\n} from '@xlt-token/core';\n\nexport interface XltTokenModuleOptions {\n config?: Partial<XltTokenConfig>;\n store?: { useClass: new (...args: any[]) => XltTokenStore } | { useValue: XltTokenStore };\n strategy?: { useClass: new (...args: any[]) => TokenStrategy };\n isGlobal?: boolean;\n providers?: Provider[];\n stpInterface?: new (...args: any[]) => StpInterface;\n hooks?: XltHooks;\n}\n\nexport interface XltTokenModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {\n useFactory: (...args: any[]) => Promise<XltTokenModuleOptions> | XltTokenModuleOptions;\n inject?: any[];\n store?: { useClass: new (...args: any[]) => XltTokenStore } | { useValue: XltTokenStore };\n strategy?: { useClass: new (...args: any[]) => TokenStrategy };\n isGlobal?: boolean;\n providers?: Provider[];\n stpInterface?: new (...args: any[]) => StpInterface;\n hooks?: XltHooks;\n}\n\n@Module({})\nexport class XltTokenModule {\n private static createStoreProvider(\n store?: XltTokenModuleOptions['store'],\n ): Provider {\n if (!store) return { provide: XLT_TOKEN_STORE, useClass: MemoryStore };\n return 'useClass' in store\n ? { provide: XLT_TOKEN_STORE, useClass: store.useClass }\n : { provide: XLT_TOKEN_STORE, useValue: store.useValue };\n }\n\n private static createStrategyProvider(\n strategy?: XltTokenModuleOptions['strategy'],\n ): Provider {\n return strategy?.useClass\n ? { provide: XLT_TOKEN_STRATEGY, useClass: strategy.useClass }\n : { provide: XLT_TOKEN_STRATEGY, useClass: UuidStrategy };\n }\n\n private static createStpInterfaceProvider(\n stpInterface?: new (...args: any[]) => StpInterface,\n ): Provider {\n if (stpInterface) return { provide: XLT_STP_INTERFACE, useClass: stpInterface };\n return {\n provide: XLT_STP_INTERFACE,\n useValue: {\n getPermissionList: () => { throw new Error('StpInterface not registered: getPermissionList'); },\n getRoleList: () => { throw new Error('StpInterface not registered: getRoleList'); },\n },\n };\n }\n\n private static createHooksProvider(\n hooks?: XltTokenModuleOptions['hooks'],\n ): Provider {\n return { provide: XLT_TOKEN_HOOKS, useValue: hooks ?? {} };\n }\n\n private static readonly stpLogicProvider: Provider = {\n provide: StpLogic,\n useFactory: (\n config: XltTokenConfig,\n store: XltTokenStore,\n strategy: TokenStrategy,\n hooks: XltHooks,\n ) => new StpLogic(config, store, strategy, hooks),\n inject: [XLT_TOKEN_CONFIG, XLT_TOKEN_STORE, XLT_TOKEN_STRATEGY, XLT_TOKEN_HOOKS],\n };\n\n private static readonly stpPermLogicProvider: Provider = {\n provide: StpPermLogic,\n useFactory: (\n stpInterface: StpInterface,\n store: XltTokenStore,\n config: XltTokenConfig,\n ) => new StpPermLogic(stpInterface, store, config),\n inject: [XLT_STP_INTERFACE, XLT_TOKEN_STORE, XLT_TOKEN_CONFIG],\n };\n\n private static readonly initProvider: Provider = {\n provide: 'XLT_TOKEN_INIT',\n useFactory: (stpLogic: StpLogic, stpPermLogic: StpPermLogic) => {\n setStpLogic(stpLogic);\n setStpPermLogic(stpPermLogic);\n return true;\n },\n inject: [StpLogic, StpPermLogic],\n };\n\n private static readonly moduleExports = [XLT_TOKEN_CONFIG, XLT_TOKEN_STORE, XLT_TOKEN_STRATEGY, StpLogic, StpPermLogic];\n\n static forRoot(options: XltTokenModuleOptions = {}) {\n const { config: userConfig, store, strategy, isGlobal = false, providers = [], stpInterface } = options;\n\n return {\n module: XltTokenModule,\n providers: [\n { provide: XLT_TOKEN_CONFIG, useValue: { ...DEFAULT_XLT_TOKEN_CONFIG, ...userConfig } },\n XltTokenModule.createStoreProvider(store),\n XltTokenModule.createStrategyProvider(strategy),\n XltTokenModule.createStpInterfaceProvider(stpInterface),\n XltTokenModule.createHooksProvider(options.hooks),\n XltTokenModule.stpLogicProvider,\n XltTokenModule.stpPermLogicProvider,\n XltTokenModule.initProvider,\n ...providers,\n ],\n exports: XltTokenModule.moduleExports,\n global: isGlobal,\n };\n }\n\n static forRootAsync(options: XltTokenModuleAsyncOptions) {\n const { useFactory, inject = [], imports = [], store, strategy, isGlobal = false, providers = [], stpInterface } = options;\n\n return {\n module: XltTokenModule,\n imports,\n providers: [\n {\n provide: XLT_TOKEN_CONFIG,\n useFactory: async (...args: any[]) => {\n const { config = {} } = await useFactory(...args);\n return { ...DEFAULT_XLT_TOKEN_CONFIG, ...config };\n },\n inject,\n },\n XltTokenModule.createStoreProvider(store),\n XltTokenModule.createStrategyProvider(strategy),\n XltTokenModule.createStpInterfaceProvider(stpInterface),\n XltTokenModule.createHooksProvider(options.hooks),\n XltTokenModule.stpLogicProvider,\n XltTokenModule.stpPermLogicProvider,\n XltTokenModule.initProvider,\n ...providers,\n ],\n exports: XltTokenModule.moduleExports,\n global: isGlobal,\n };\n }\n}\n","import { XltTokenStore } from '@xlt-token/core';\nimport { Inject, Injectable } from '@nestjs/common';\n\n\nexport const XLT_REDIS_CLIENT = 'XLT_REDIS_CLIENT';\n\n\n@Injectable()\nexport class RedisStore implements XltTokenStore {\n\n constructor(\n @Inject(XLT_REDIS_CLIENT)\n private readonly redisClient: any,\n ) {\n\n }\n\n\n async get(key:string):Promise<string | null> {\n return this.redisClient.get(key);\n }\n\n\n async set(key:string, value:string, timeoutSec:number):Promise<void> {\n if (timeoutSec === -1){\n await this.redisClient.set(key, value);\n }else {\n await this.redisClient.set(key, value, {EX: timeoutSec});\n }\n }\n\n\n async delete(key:string):Promise<void> {\n await this.redisClient.del(key);\n }\n\n\n async update(key:string, value:string):Promise<void> {\n const result = await this.redisClient.set(key, value,{XX:true,KEEPTTL:true})\n if (result ===null){\n throw new Error(`Key not found: ${key}`);\n }\n }\n\n\n async has(key:string):Promise<boolean> {\n const result = await this.redisClient.exists(key);\n return result === 1;\n }\n\n\n async updateTimeout(key:string, timeoutSec:number):Promise<void> {\n const exists = await this.redisClient.exists(key);\n\n if (!exists) {\n throw new Error(`Key not found: ${key}`);\n }\n\n if (timeoutSec === -1) {\n await this.redisClient.persist(key);\n }else {\n await this.redisClient.expire(key, timeoutSec);\n }\n\n }\n\n async getTimeout(key:string):Promise<number> {\n const result = await this.redisClient.ttl(key);\n // Redis TTL 返回值约定:\n // -2 = key 不存在\n // -1 = key 存在但无过期时间(永久)\n // >0 = 剩余秒数\n // 恰好与 XltTokenStore 接口约定一致\n return result;\n }\n\n async keys(pattern: string): Promise<string[]> {\n const result: string[] = [];\n let cursor = 0;\n do {\n const reply = await this.redisClient.scan(cursor, { MATCH: pattern, COUNT: 100 });\n cursor = reply.cursor;\n result.push(...reply.keys);\n } while (cursor !== 0);\n return result;\n }\n}\n","import { Inject, Injectable } from \"@nestjs/common\";\nimport { XLT_TOKEN_CONFIG, XltTokenConfig } from '@xlt-token/core';\nimport type { TokenStrategy } from '@xlt-token/core';\nimport { sign, verify, JwtPayload } from \"jsonwebtoken\";\n\n@Injectable()\nexport class JwtStrategy implements TokenStrategy {\n constructor(\n @Inject(XLT_TOKEN_CONFIG) private readonly config: XltTokenConfig\n ) { }\n\n\n\n createToken(loginId: string, config: XltTokenConfig): string {\n const jwt = config.jwt!;\n const jti = crypto.randomUUID();\n\n\n return sign({\n sub: loginId, jti\n }, jwt.secret, {\n algorithm: jwt.algorithm ?? 'HS256',\n ...(jwt.issuer && { issuer: jwt.issuer }),\n ...(jwt.audience && { audience: jwt.audience }),\n ...(config.timeout > 0 && { expiresIn: config.timeout }),\n })\n\n }\n\n\n generateToken(payload: any): string {\n return sign(payload, this.config.jwt!.secret);\n }\n\n\n\n verifyToken(token: string): JwtPayload & { sub: string; jti: string } {\n return verify(token, this.config.jwt!.secret) as any;\n }\n\n}\n","// 登录校验装饰器\n\nimport { SetMetadata } from '@nestjs/common';\nimport { XLT_CHECK_LOGIN_KEY } from '@xlt-token/core';\n\n\n/**\n * 登录校验装饰器\n * @constructor\n */\nexport const XltCheckLogin = () => SetMetadata(XLT_CHECK_LOGIN_KEY, true);\n","// 忽略校验装饰器\n\nimport { SetMetadata } from '@nestjs/common';\nimport { XLT_IGNORE_KEY } from '@xlt-token/core';\n\nexport const XltIgnore = () => SetMetadata(XLT_IGNORE_KEY, true);\n","// 注入当前用户 ID\n\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\n\n/**\n * 注入当前用户 ID\n * @constructor\n */\nexport const LoginId = createParamDecorator(\n (data: unknown, ctx: ExecutionContext) => {\n const request = ctx.switchToHttp().getRequest();\n return request.stpLoginId;\n },\n);\n","// 注入当前 Token\n\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\n\n\n/**\n * 注入当前 Token\n * @constructor\n */\nexport const TokenValue = createParamDecorator((data: any, ctx: ExecutionContext) => {\n const request = ctx.switchToHttp().getRequest();\n return request.stpToken;\n});\n","import { XLT_PERMISSION_KEY, XltMode } from '@xlt-token/core';\nimport { SetMetadata } from '@nestjs/common';\n\n\n/**\n * 权限检查装饰器\n * @param {string | string[]} permissions 权限列表\n * @param {Object} [options] 模式选项\n * @param {XltMode} [options.mode] 模式选项\n * @constructor\n */\nexport const XltCheckPermission = (permissions: string | string[], options?: { mode: XltMode; }) => {\n const perms = Array.isArray(permissions) ? permissions : [permissions];\n const mode = options?.mode ?? XltMode.AND;\n return SetMetadata(XLT_PERMISSION_KEY, { permissions: perms, mode });\n};\n","import { XLT_ROLE_KEY, XltMode } from '@xlt-token/core';\nimport { SetMetadata } from '@nestjs/common';\n\n\n/**\n * 角色检查装饰器\n * @param {string | string[]} roles 角色列表\n * @param {Object} [options] 模式选项\n * @param {XltMode} [options.mode] 模式选项\n * @constructor\n */\nexport const XltCheckRole = (roles: string | string[], options?: { mode: XltMode; }) => {\n const _roles = Array.isArray(roles) ? roles : [roles];\n const mode = options?.mode ?? XltMode.AND;\n return SetMetadata(XLT_ROLE_KEY, { roles: _roles, mode });\n\n};\n","import { SetMetadata } from \"@nestjs/common\"\n\nexport const XLT_CHECK_SAFE_KEY = 'XLT_CHECK_SAFE';\n\nexport const XltCheckSafe = (business: string) => {\n return SetMetadata(XLT_CHECK_SAFE_KEY, business);\n}\n","import { UnauthorizedException } from '@nestjs/common';\nimport { NotLoginType } from '@xlt-token/core';\n\nexport class NotLoginException extends UnauthorizedException {\n public readonly type: NotLoginType;\n public readonly token: string | undefined;\n\n constructor(type: NotLoginType, token?: string) {\n super({\n statusCode: 401,\n type,\n message: NotLoginException.describeType(type),\n });\n this.type = type;\n this.token = token;\n }\n\n private static describeType(type: NotLoginType): string {\n const map: Record<NotLoginType, string> = {\n [NotLoginType.NOT_TOKEN]: '未提供 Token',\n [NotLoginType.INVALID_TOKEN]: 'Token 无效',\n [NotLoginType.TOKEN_TIMEOUT]: 'Token 已过期',\n [NotLoginType.TOKEN_FREEZE]: 'Token 已被冻结',\n [NotLoginType.BE_REPLACED]: '已被顶下线',\n [NotLoginType.KICK_OUT]: '已被踢下线',\n };\n return map[type] ?? '未登录';\n }\n}\n\n","import { ForbiddenException } from '@nestjs/common';\nimport { XltMode } from '@xlt-token/core';\n\nexport class NotPermissionException extends ForbiddenException {\n public readonly permission: string | string[];\n public readonly mode: XltMode;\n\n constructor(permission: string | string[], mode: XltMode) {\n super({\n statusCode: 403,\n type: 'NOT_PERMISSION',\n message: `缺少权限: ${Array.isArray(permission) ? permission.join(', ') : permission}`,\n });\n this.permission = permission;\n this.mode = mode;\n }\n}\n","import { ForbiddenException } from '@nestjs/common';\nimport { XltMode } from '@xlt-token/core';\n\nexport class NotRoleException extends ForbiddenException {\n public readonly role: string | string[];\n public readonly mode: XltMode;\n\n constructor(role: string | string[], mode: XltMode) {\n super({\n statusCode: 403,\n type: 'NOT_ROLE',\n message: `缺少角色: ${Array.isArray(role) ? role.join(', ') : role}`,\n });\n this.role = role;\n this.mode = mode;\n }\n}\n","import { ForbiddenException } from \"@nestjs/common\";\n\nexport class NotSafeException extends ForbiddenException {\n readonly business: string;\n\n\n constructor(business: string) {\n super({\n statusCode: 403,\n type: 'NOT_SAFE',\n message: `二级认证未开启:${business}`,\n });\n this.business = business;\n }\n\n}\n","import {\n createExpressContext,\n type CookieOptions,\n type ExpressLikeResponse,\n NotLoginException as CoreNotLoginException,\n NotPermissionException as CoreNotPermissionException,\n NotRoleException as CoreNotRoleException,\n NotSafeException as CoreNotSafeException,\n} from '@xlt-token/core';\nimport { NotLoginException } from '../exceptions/not-login.exception.js';\nimport { NotPermissionException } from '../exceptions/not-permission.exception.js';\nimport { NotRoleException } from '../exceptions/not-role.exception.js';\nimport { NotSafeException } from '../exceptions/not-safe.exception.js';\n\n/**\n * Fastify reply 的写回 API 与 Express response 不同:\n * - 写 header:Express 用 `res.setHeader(n, v)`,Fastify 用 `reply.header(n, v)`\n * - 写 cookie:Express 用 `res.cookie(n, v, o)`,Fastify 用 `reply.setCookie(n, v, o)`\n *\n * 这里把任意一种 response 归一化成 core 期望的 {@link ExpressLikeResponse} 形态,\n * 让核心层无需感知底层 HTTP 平台。读取侧(headers/cookies/query)两个平台形态一致,\n * 直接复用 core 的 createExpressContext。\n */\nfunction normalizeResponse(res: any): ExpressLikeResponse {\n return {\n setHeader(name: string, value: string): void {\n if (typeof res?.setHeader === 'function') {\n // Express response / 原生 Node 响应\n res.setHeader(name, value);\n } else if (typeof res?.header === 'function') {\n // Fastify reply\n res.header(name, value);\n } else {\n throw new Error(\n 'xlt-token: 当前 response 不支持写入 header(既无 setHeader 也无 header 方法)',\n );\n }\n },\n cookie(name: string, value: string, options?: CookieOptions): void {\n if (typeof res?.cookie === 'function') {\n // Express response(或已注册 @fastify/cookie 暴露的 cookie 别名)\n res.cookie(name, value, options);\n } else if (typeof res?.setCookie === 'function') {\n // Fastify reply + @fastify/cookie 插件\n res.setCookie(name, value, options);\n } else {\n throw new Error(\n 'xlt-token: 当前 response 不支持写入 cookie。'\n + '若使用 Fastify,请先注册 @fastify/cookie 插件。',\n );\n }\n },\n };\n}\n\nexport function createNestHttpContext(req: any, res: any) {\n return createExpressContext(req, normalizeResponse(res));\n}\n\nexport function rethrowCoreAuthException(error: unknown): never {\n if (error instanceof CoreNotLoginException) {\n throw new NotLoginException(error.type, error.token);\n }\n if (error instanceof CoreNotPermissionException) {\n throw new NotPermissionException(error.permission, error.mode);\n }\n if (error instanceof CoreNotRoleException) {\n throw new NotRoleException(error.role, error.mode);\n }\n if (error instanceof CoreNotSafeException) {\n throw new NotSafeException(error.business);\n }\n throw error;\n}\n","// 全局守卫\n\nimport { CanActivate, ExecutionContext, Inject, Injectable, Optional } from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport {\n type AuthResult,\n StpLogic,\n StpPermLogic,\n XLT_CHECK_LOGIN_KEY,\n XLT_IGNORE_KEY,\n XLT_PERMISSION_KEY,\n XLT_ROLE_KEY,\n XLT_TOKEN_CONFIG,\n type XltTokenConfig,\n} from '@xlt-token/core';\nimport { XLT_CHECK_SAFE_KEY } from '../decorators/xlt-check-safe.decorator.js';\nimport { createNestHttpContext, rethrowCoreAuthException } from '../http/nest-bridge.js';\n\n@Injectable()\nexport class XltTokenGuard implements CanActivate {\n constructor(\n private readonly reflector: Reflector,\n @Inject(XLT_TOKEN_CONFIG) private readonly config: XltTokenConfig,\n private readonly stpLogic: StpLogic,\n @Optional() private readonly stpPermLogic?: StpPermLogic,\n ) {\n }\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n if (!this.requiresLogin(context)) return true;\n\n const request = context.switchToHttp().getRequest();\n const response = context.switchToHttp().getResponse();\n\n let result: AuthResult;\n try {\n result = await this.stpLogic.checkLogin(createNestHttpContext(request, response));\n } catch (error) {\n rethrowCoreAuthException(error);\n }\n\n const business = this.getBusiness(context);\n request.stpLoginId = result.loginId;\n request.stpToken = result.token;\n\n try {\n if (this.stpPermLogic) {\n const handler = context.getHandler();\n const cls = context.getClass();\n\n const permMeta = this.reflector.getAllAndOverride(XLT_PERMISSION_KEY, [handler, cls]);\n if (permMeta) {\n await this.stpPermLogic.checkPermission(result.loginId!, permMeta.permissions, permMeta.mode);\n }\n\n const roleMeta = this.reflector.getAllAndOverride(XLT_ROLE_KEY, [handler, cls]);\n if (roleMeta) {\n await this.stpPermLogic.checkRole(result.loginId!, roleMeta.roles, roleMeta.mode);\n }\n }\n\n if (business) {\n await this.stpLogic.checkSafe(result.token!, business);\n }\n } catch (error) {\n rethrowCoreAuthException(error);\n }\n\n return true;\n }\n\n private requiresLogin(context: ExecutionContext): boolean {\n const isIgnored = this.reflector.getAllAndOverride<boolean>(XLT_IGNORE_KEY, [\n context.getHandler(),\n context.getClass(),\n ]);\n\n if (this.config.defaultCheck) {\n return !isIgnored;\n }\n\n const shouldCheck = this.reflector.getAllAndOverride<boolean>(XLT_CHECK_LOGIN_KEY, [\n context.getHandler(),\n context.getClass(),\n ]);\n return shouldCheck ?? false;\n }\n\n private getBusiness(context: ExecutionContext): string {\n return this.reflector.getAllAndOverride<string>(XLT_CHECK_SAFE_KEY, [\n context.getHandler(),\n context.getClass(),\n ]);\n }\n}\n","import { CanActivate, ExecutionContext, Inject, Injectable } from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport {\n NotLoginException as CoreNotLoginException,\n NotLoginType,\n StpLogic,\n XLT_CHECK_LOGIN_KEY,\n XLT_IGNORE_KEY,\n XLT_TOKEN_CONFIG,\n type XltTokenConfig,\n} from '@xlt-token/core';\nimport { NotLoginException } from '../exceptions/not-login.exception.js';\nimport { createNestHttpContext } from '../http/nest-bridge.js';\n\n@Injectable()\nexport abstract class XltAbstractLoginGuard implements CanActivate {\n protected constructor(\n protected readonly reflector: Reflector,\n @Inject(XLT_TOKEN_CONFIG) protected readonly config: XltTokenConfig,\n protected readonly stpLogic: StpLogic,\n ) {}\n\n async canActivate(ctx: ExecutionContext): Promise<boolean> {\n if (!this.requiresLogin(ctx)) return true;\n\n const request = ctx.switchToHttp().getRequest();\n const response = ctx.switchToHttp().getResponse();\n\n let result: { ok: boolean; loginId?: string; token?: string; reason?: NotLoginType };\n try {\n result = await this.stpLogic.checkLogin(createNestHttpContext(request, response));\n } catch (err) {\n if (err instanceof CoreNotLoginException) {\n await this.onAuthFail?.({ ok: false, reason: err.type, token: err.token }, request);\n throw new NotLoginException(err.type, err.token);\n }\n throw err;\n }\n\n request.stpLoginId = result.loginId;\n request.stpToken = result.token;\n await this.onAuthSuccess?.(result, request);\n return true;\n }\n\n protected requiresLogin(ctx: ExecutionContext): boolean {\n const isIgnored = this.reflector.getAllAndOverride<boolean>(XLT_IGNORE_KEY, [ctx.getHandler(), ctx.getClass()]);\n\n if (this.config.defaultCheck) return !isIgnored;\n\n return this.reflector.getAllAndOverride<boolean>(XLT_CHECK_LOGIN_KEY, [ctx.getHandler(), ctx.getClass()]) ?? false;\n }\n\n protected onAuthSuccess?(\n result: {\n ok: boolean;\n loginId?: string | undefined;\n token?: string | undefined;\n reason?: NotLoginType | undefined;\n },\n request: any,\n ): void | Promise<void>;\n\n protected onAuthFail?(\n result: {\n ok: boolean;\n loginId?: string | undefined;\n token?: string | undefined;\n reason?: NotLoginType | undefined;\n },\n request: any,\n ): void | Promise<void>;\n\n protected onPermissionDenied?(\n result: {\n ok: boolean;\n loginId?: string | undefined;\n token?: string | undefined;\n reason?: NotLoginType | undefined;\n },\n request: any,\n ): void | Promise<void>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["StpLogic","XLT_TOKEN_CONFIG","XLT_TOKEN_STORE","XLT_TOKEN_STRATEGY","XLT_TOKEN_HOOKS","StpPermLogic","XLT_STP_INTERFACE","MemoryStore","UuidStrategy","XLT_TOKEN_CONFIG","XltMode","XltMode","NotLoginType","createExpressContext","CoreNotLoginException","CoreNotPermissionException","CoreNotRoleException","CoreNotSafeException","XLT_TOKEN_CONFIG","CoreNotLoginException","XLT_TOKEN_CONFIG"],"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/exceptions/not-login.exception.ts","../src/exceptions/not-permission.exception.ts","../src/exceptions/not-role.exception.ts","../src/exceptions/not-safe.exception.ts","../src/http/nest-bridge.ts","../src/guards/xlt-token.guard.ts","../src/guards/xlt-abstract-login.guard.ts"],"sourcesContent":["import type { ModuleMetadata, Provider } from '@nestjs/common';\nimport { Module } from '@nestjs/common';\nimport type { StpInterface, TokenStrategy, XltHooks, XltTokenConfig, XltTokenConfigInput, XltTokenStore, } from '@xlt-token/core';\nimport {\n DEFAULT_XLT_TOKEN_CONFIG,\n MemoryStore,\n setStpLogic,\n setStpPermLogic,\n StpLogic,\n StpPermLogic,\n UuidStrategy,\n XLT_STP_INTERFACE,\n XLT_TOKEN_CONFIG,\n XLT_TOKEN_HOOKS,\n XLT_TOKEN_STORE,\n XLT_TOKEN_STRATEGY,\n normalizeXltTokenConfig\n} from '@xlt-token/core';\n\nexport interface XltTokenModuleOptions {\n config?: Partial<XltTokenConfigInput>;\n store?: { useClass: new (...args: any[]) => XltTokenStore } | { useValue: XltTokenStore };\n strategy?: { useClass: new (...args: any[]) => TokenStrategy };\n isGlobal?: boolean;\n providers?: Provider[];\n stpInterface?: new (...args: any[]) => StpInterface;\n hooks?: XltHooks;\n}\n\nexport interface XltTokenModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {\n useFactory: (...args: any[]) => Promise<XltTokenModuleOptions> | XltTokenModuleOptions;\n inject?: any[];\n store?: { useClass: new (...args: any[]) => XltTokenStore } | { useValue: XltTokenStore };\n strategy?: { useClass: new (...args: any[]) => TokenStrategy };\n isGlobal?: boolean;\n providers?: Provider[];\n stpInterface?: new (...args: any[]) => StpInterface;\n hooks?: XltHooks;\n}\n\n@Module({})\nexport class XltTokenModule {\n private static readonly stpLogicProvider: Provider = {\n provide: StpLogic,\n useFactory: (\n config: XltTokenConfig,\n store: XltTokenStore,\n strategy: TokenStrategy,\n hooks: XltHooks,\n ) => new StpLogic(config, store, strategy, hooks),\n inject: [ XLT_TOKEN_CONFIG, XLT_TOKEN_STORE, XLT_TOKEN_STRATEGY, XLT_TOKEN_HOOKS ],\n };\n private static readonly stpPermLogicProvider: Provider = {\n provide: StpPermLogic,\n useFactory: (\n stpInterface: StpInterface,\n store: XltTokenStore,\n config: XltTokenConfig,\n ) => new StpPermLogic(stpInterface, store, config),\n inject: [ XLT_STP_INTERFACE, XLT_TOKEN_STORE, XLT_TOKEN_CONFIG ],\n };\n private static readonly initProvider: Provider = {\n provide: 'XLT_TOKEN_INIT',\n useFactory: (stpLogic: StpLogic, stpPermLogic: StpPermLogic) => {\n setStpLogic(stpLogic);\n setStpPermLogic(stpPermLogic);\n return true;\n },\n inject: [ StpLogic, StpPermLogic ],\n };\n private static readonly moduleExports = [ XLT_TOKEN_CONFIG, XLT_TOKEN_STORE, XLT_TOKEN_STRATEGY, StpLogic, StpPermLogic ];\n\n static forRoot(options: XltTokenModuleOptions = {}) {\n const {config: userConfig, store, strategy, isGlobal = false, providers = [], stpInterface} = options;\n\n return {\n module: XltTokenModule,\n providers: [\n {provide: XLT_TOKEN_CONFIG, useValue: normalizeXltTokenConfig(userConfig)},\n XltTokenModule.createStoreProvider(store),\n XltTokenModule.createStrategyProvider(strategy),\n XltTokenModule.createStpInterfaceProvider(stpInterface),\n XltTokenModule.createHooksProvider(options.hooks),\n XltTokenModule.stpLogicProvider,\n XltTokenModule.stpPermLogicProvider,\n XltTokenModule.initProvider,\n ...providers,\n ],\n exports: XltTokenModule.moduleExports,\n global: isGlobal,\n };\n }\n\n static forRootAsync(options: XltTokenModuleAsyncOptions) {\n const {\n useFactory,\n inject = [],\n imports = [],\n store,\n strategy,\n isGlobal = false,\n providers = [],\n stpInterface\n } = options;\n\n return {\n module: XltTokenModule,\n imports,\n providers: [\n {\n provide: XLT_TOKEN_CONFIG,\n useFactory: async (...args: any[]) => {\n const {config = {}} = await useFactory(...args);\n return normalizeXltTokenConfig(config)\n },\n inject,\n },\n XltTokenModule.createStoreProvider(store),\n XltTokenModule.createStrategyProvider(strategy),\n XltTokenModule.createStpInterfaceProvider(stpInterface),\n XltTokenModule.createHooksProvider(options.hooks),\n XltTokenModule.stpLogicProvider,\n XltTokenModule.stpPermLogicProvider,\n XltTokenModule.initProvider,\n ...providers,\n ],\n exports: XltTokenModule.moduleExports,\n global: isGlobal,\n };\n }\n\n private static createStoreProvider(\n store?: XltTokenModuleOptions['store'],\n ): Provider {\n if ( !store ) return {provide: XLT_TOKEN_STORE, useClass: MemoryStore};\n return 'useClass' in store\n ? {provide: XLT_TOKEN_STORE, useClass: store.useClass}\n : {provide: XLT_TOKEN_STORE, useValue: store.useValue};\n }\n\n private static createStrategyProvider(\n strategy?: XltTokenModuleOptions['strategy'],\n ): Provider {\n return strategy?.useClass\n ? {provide: XLT_TOKEN_STRATEGY, useClass: strategy.useClass}\n : {provide: XLT_TOKEN_STRATEGY, useClass: UuidStrategy};\n }\n\n private static createStpInterfaceProvider(\n stpInterface?: new (...args: any[]) => StpInterface,\n ): Provider {\n if ( stpInterface ) return {provide: XLT_STP_INTERFACE, useClass: stpInterface};\n return {\n provide: XLT_STP_INTERFACE,\n useValue: {\n getPermissionList: () => {\n throw new Error('StpInterface not registered: getPermissionList');\n },\n getRoleList: () => {\n throw new Error('StpInterface not registered: getRoleList');\n },\n },\n };\n }\n\n private static createHooksProvider(\n hooks?: XltTokenModuleOptions['hooks'],\n ): Provider {\n return {provide: XLT_TOKEN_HOOKS, useValue: hooks ?? {}};\n }\n}\n","import type { XltTokenStore } from '@xlt-token/core';\nimport { Inject, Injectable } from '@nestjs/common';\n\n\nexport const XLT_REDIS_CLIENT = 'XLT_REDIS_CLIENT';\n\n\n@Injectable()\nexport class RedisStore implements XltTokenStore {\n\n constructor(\n @Inject(XLT_REDIS_CLIENT)\n private readonly redisClient: any,\n ) {\n\n }\n\n\n async get(key:string):Promise<string | null> {\n return this.redisClient.get(key);\n }\n\n\n async set(key:string, value:string, timeoutSec:number):Promise<void> {\n if (timeoutSec === -1){\n await this.redisClient.set(key, value);\n }else {\n await this.redisClient.set(key, value, {EX: timeoutSec});\n }\n }\n\n\n async delete(key:string):Promise<void> {\n await this.redisClient.del(key);\n }\n\n\n async update(key:string, value:string):Promise<void> {\n const result = await this.redisClient.set(key, value,{XX:true,KEEPTTL:true})\n if (result ===null){\n throw new Error(`Key not found: ${key}`);\n }\n }\n\n\n async has(key:string):Promise<boolean> {\n const result = await this.redisClient.exists(key);\n return result === 1;\n }\n\n\n async updateTimeout(key:string, timeoutSec:number):Promise<void> {\n const exists = await this.redisClient.exists(key);\n\n if (!exists) {\n throw new Error(`Key not found: ${key}`);\n }\n\n if (timeoutSec === -1) {\n await this.redisClient.persist(key);\n }else {\n await this.redisClient.expire(key, timeoutSec);\n }\n\n }\n\n async getTimeout(key:string):Promise<number> {\n const result = await this.redisClient.ttl(key);\n // Redis TTL 返回值约定:\n // -2 = key 不存在\n // -1 = key 存在但无过期时间(永久)\n // >0 = 剩余秒数\n // 恰好与 XltTokenStore 接口约定一致\n return result;\n }\n\n async keys(pattern: string): Promise<string[]> {\n const result: string[] = [];\n let cursor = 0;\n do {\n const reply = await this.redisClient.scan(cursor, { MATCH: pattern, COUNT: 100 });\n cursor = reply.cursor;\n result.push(...reply.keys);\n } while (cursor !== 0);\n return result;\n }\n}\n","import { Inject, Injectable } from \"@nestjs/common\";\nimport { randomUUID } from 'node:crypto';\nimport { createRequire } from 'node:module';\nimport { XLT_TOKEN_CONFIG } from '@xlt-token/core';\nimport type { DurationInput, TokenStrategy, XltTokenConfig } from '@xlt-token/core';\n\nconst require = createRequire(import.meta.url);\n\nlet jsonwebtoken: typeof import('jsonwebtoken') | undefined;\n\nexport type XltJwtPayload = Record<string, any> & { sub: string; jti: string };\n\nfunction getJsonwebtoken(): typeof import('jsonwebtoken') {\n try {\n jsonwebtoken ??= require('jsonwebtoken') as typeof import('jsonwebtoken');\n return jsonwebtoken;\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'JwtStrategy requires the optional peer dependency \"jsonwebtoken\". '\n + 'Install it in your application with \"pnpm add jsonwebtoken\".',\n );\n }\n throw error;\n }\n}\n\n@Injectable()\nexport class JwtStrategy implements TokenStrategy<XltJwtPayload> {\n constructor(\n @Inject(XLT_TOKEN_CONFIG) private readonly config: XltTokenConfig\n ) { }\n\n private ensureJwtConfig(config?: XltTokenConfig): NonNullable<XltTokenConfig['jwt']> {\n const jwt = (config ?? this.config).jwt;\n if (!jwt || !jwt.secret) {\n throw new Error(\n 'JwtStrategy requires jwt config with a secret. '\n + 'Provide { jwt: { secret: \"your-secret\" } } in the module config.',\n );\n }\n return jwt;\n }\n\n createToken(loginId: string, config: XltTokenConfig, options?: { timeout?: DurationInput }): string {\n const { sign } = getJsonwebtoken();\n const jwt = this.ensureJwtConfig(config);\n const jti = randomUUID();\n\n const resolvedTimeout = options?.timeout ?? config.timeout;\n const hasExpiry = typeof resolvedTimeout === 'number' ? resolvedTimeout > 0 : true;\n\n return sign({\n sub: loginId, jti\n }, jwt.secret, {\n algorithm: jwt.algorithm ?? 'HS256',\n ...(jwt.issuer && { issuer: jwt.issuer }),\n ...(jwt.audience && { audience: jwt.audience }),\n ...(hasExpiry && { expiresIn: resolvedTimeout }),\n })\n }\n\n generateToken(payload: any): string {\n const { sign } = getJsonwebtoken();\n const jwt = this.ensureJwtConfig();\n return sign(payload, jwt.secret);\n }\n\n verifyToken(token: string): XltJwtPayload {\n const { verify } = getJsonwebtoken();\n const jwt = this.ensureJwtConfig();\n return verify(token, jwt.secret) as XltJwtPayload;\n }\n\n}\n","// 登录校验装饰器\n\nimport { SetMetadata } from '@nestjs/common';\nimport { XLT_CHECK_LOGIN_KEY } from '@xlt-token/core';\n\n\n/**\n * 登录校验装饰器\n * @constructor\n */\nexport const XltCheckLogin = () => SetMetadata(XLT_CHECK_LOGIN_KEY, true);\n","// 忽略校验装饰器\n\nimport { SetMetadata } from '@nestjs/common';\nimport { XLT_IGNORE_KEY } from '@xlt-token/core';\n\nexport const XltIgnore = () => SetMetadata(XLT_IGNORE_KEY, true);\n","// 注入当前用户 ID\n\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\n\n/**\n * 注入当前用户 ID\n * @constructor\n */\nexport const LoginId = createParamDecorator(\n (data: unknown, ctx: ExecutionContext) => {\n const request = ctx.switchToHttp().getRequest();\n return request.stpLoginId;\n },\n);\n","// 注入当前 Token\n\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\n\n\n/**\n * 注入当前 Token\n * @constructor\n */\nexport const TokenValue = createParamDecorator((data: any, ctx: ExecutionContext) => {\n const request = ctx.switchToHttp().getRequest();\n return request.stpToken;\n});\n","import { XLT_PERMISSION_KEY, XltMode } from '@xlt-token/core';\nimport { SetMetadata } from '@nestjs/common';\n\n\n/**\n * 权限检查装饰器\n * @param {string | string[]} permissions 权限列表\n * @param {Object} [options] 模式选项\n * @param {XltMode} [options.mode] 模式选项\n * @constructor\n */\nexport const XltCheckPermission = (permissions: string | string[], options?: { mode: XltMode; }) => {\n const perms = Array.isArray(permissions) ? permissions : [permissions];\n const mode = options?.mode ?? XltMode.AND;\n return SetMetadata(XLT_PERMISSION_KEY, { permissions: perms, mode });\n};\n","import { XLT_ROLE_KEY, XltMode } from '@xlt-token/core';\nimport { SetMetadata } from '@nestjs/common';\n\n\n/**\n * 角色检查装饰器\n * @param {string | string[]} roles 角色列表\n * @param {Object} [options] 模式选项\n * @param {XltMode} [options.mode] 模式选项\n * @constructor\n */\nexport const XltCheckRole = (roles: string | string[], options?: { mode: XltMode; }) => {\n const _roles = Array.isArray(roles) ? roles : [roles];\n const mode = options?.mode ?? XltMode.AND;\n return SetMetadata(XLT_ROLE_KEY, { roles: _roles, mode });\n\n};\n","import { SetMetadata } from \"@nestjs/common\"\n\nexport const XLT_CHECK_SAFE_KEY = 'XLT_CHECK_SAFE';\n\nexport const XltCheckSafe = (business: string) => {\n return SetMetadata(XLT_CHECK_SAFE_KEY, business);\n}\n","import { UnauthorizedException } from '@nestjs/common';\nimport { NotLoginType } from '@xlt-token/core';\n\nexport class NotLoginException extends UnauthorizedException {\n public readonly type: NotLoginType;\n public readonly token: string | undefined;\n\n constructor(type: NotLoginType, token?: string) {\n super({\n statusCode: 401,\n type,\n message: NotLoginException.describeType(type),\n });\n this.type = type;\n this.token = token;\n }\n\n private static describeType(type: NotLoginType): string {\n const map: Record<NotLoginType, string> = {\n [NotLoginType.NOT_TOKEN]: '未提供 Token',\n [NotLoginType.INVALID_TOKEN]: 'Token 无效',\n [NotLoginType.TOKEN_TIMEOUT]: 'Token 已过期',\n [NotLoginType.TOKEN_FREEZE]: 'Token 已被冻结',\n [NotLoginType.BE_REPLACED]: '已被顶下线',\n [NotLoginType.KICK_OUT]: '已被踢下线',\n };\n return map[type] ?? '未登录';\n }\n}\n\n","import { ForbiddenException } from '@nestjs/common';\nimport { XltMode } from '@xlt-token/core';\n\nexport class NotPermissionException extends ForbiddenException {\n public readonly permission: string | string[];\n public readonly mode: XltMode;\n\n constructor(permission: string | string[], mode: XltMode) {\n super({\n statusCode: 403,\n type: 'NOT_PERMISSION',\n message: `缺少权限: ${Array.isArray(permission) ? permission.join(', ') : permission}`,\n });\n this.permission = permission;\n this.mode = mode;\n }\n}\n","import { ForbiddenException } from '@nestjs/common';\nimport { XltMode } from '@xlt-token/core';\n\nexport class NotRoleException extends ForbiddenException {\n public readonly role: string | string[];\n public readonly mode: XltMode;\n\n constructor(role: string | string[], mode: XltMode) {\n super({\n statusCode: 403,\n type: 'NOT_ROLE',\n message: `缺少角色: ${Array.isArray(role) ? role.join(', ') : role}`,\n });\n this.role = role;\n this.mode = mode;\n }\n}\n","import { ForbiddenException } from \"@nestjs/common\";\n\nexport class NotSafeException extends ForbiddenException {\n readonly business: string;\n\n\n constructor(business: string) {\n super({\n statusCode: 403,\n type: 'NOT_SAFE',\n message: `二级认证未开启:${business}`,\n });\n this.business = business;\n }\n\n}\n","import {\n createExpressContext,\n type CookieOptions,\n type ExpressLikeResponse,\n NotLoginException as CoreNotLoginException,\n NotPermissionException as CoreNotPermissionException,\n NotRoleException as CoreNotRoleException,\n NotSafeException as CoreNotSafeException,\n} from '@xlt-token/core';\nimport { NotLoginException } from '../exceptions/not-login.exception.js';\nimport { NotPermissionException } from '../exceptions/not-permission.exception.js';\nimport { NotRoleException } from '../exceptions/not-role.exception.js';\nimport { NotSafeException } from '../exceptions/not-safe.exception.js';\n\n/**\n * Fastify reply 的写回 API 与 Express response 不同:\n * - 写 header:Express 用 `res.setHeader(n, v)`,Fastify 用 `reply.header(n, v)`\n * - 写 cookie:Express 用 `res.cookie(n, v, o)`,Fastify 用 `reply.setCookie(n, v, o)`\n *\n * 这里把任意一种 response 归一化成 core 期望的 {@link ExpressLikeResponse} 形态,\n * 让核心层无需感知底层 HTTP 平台。读取侧(headers/cookies/query)两个平台形态一致,\n * 直接复用 core 的 createExpressContext。\n */\nfunction normalizeResponse(res: any): ExpressLikeResponse {\n return {\n setHeader(name: string, value: string): void {\n if (typeof res?.setHeader === 'function') {\n // Express response / 原生 Node 响应\n res.setHeader(name, value);\n } else if (typeof res?.header === 'function') {\n // Fastify reply\n res.header(name, value);\n } else {\n throw new Error(\n 'xlt-token: 当前 response 不支持写入 header(既无 setHeader 也无 header 方法)',\n );\n }\n },\n cookie(name: string, value: string, options?: CookieOptions): void {\n if (typeof res?.cookie === 'function') {\n // Express response(或已注册 @fastify/cookie 暴露的 cookie 别名)\n res.cookie(name, value, options);\n } else if (typeof res?.setCookie === 'function') {\n // Fastify reply + @fastify/cookie 插件\n res.setCookie(name, value, options);\n } else {\n throw new Error(\n 'xlt-token: 当前 response 不支持写入 cookie。'\n + '若使用 Fastify,请先注册 @fastify/cookie 插件。',\n );\n }\n },\n };\n}\n\nexport function createNestHttpContext(req: any, res: any) {\n return createExpressContext(req, normalizeResponse(res));\n}\n\nexport function rethrowCoreAuthException(error: unknown): never {\n if (error instanceof CoreNotLoginException) {\n throw new NotLoginException(error.type, error.token);\n }\n if (error instanceof CoreNotPermissionException) {\n throw new NotPermissionException(error.permission, error.mode);\n }\n if (error instanceof CoreNotRoleException) {\n throw new NotRoleException(error.role, error.mode);\n }\n if (error instanceof CoreNotSafeException) {\n throw new NotSafeException(error.business);\n }\n throw error;\n}\n","// 全局守卫\n\nimport { CanActivate, ExecutionContext, Inject, Injectable, Optional } from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport {\n type AuthResult,\n StpLogic,\n StpPermLogic,\n XLT_CHECK_LOGIN_KEY,\n XLT_IGNORE_KEY,\n XLT_PERMISSION_KEY,\n XLT_ROLE_KEY,\n XLT_TOKEN_CONFIG,\n type XltTokenConfig,\n} from '@xlt-token/core';\nimport { XLT_CHECK_SAFE_KEY } from '../decorators/xlt-check-safe.decorator.js';\nimport { createNestHttpContext, rethrowCoreAuthException } from '../http/nest-bridge.js';\n\n@Injectable()\nexport class XltTokenGuard implements CanActivate {\n constructor(\n private readonly reflector: Reflector,\n @Inject(XLT_TOKEN_CONFIG) private readonly config: XltTokenConfig,\n private readonly stpLogic: StpLogic,\n @Optional() private readonly stpPermLogic?: StpPermLogic,\n ) {\n }\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n if (!this.requiresLogin(context)) return true;\n\n const request = context.switchToHttp().getRequest();\n const response = context.switchToHttp().getResponse();\n\n let result: AuthResult;\n try {\n result = await this.stpLogic.checkLogin(createNestHttpContext(request, response));\n } catch (error) {\n rethrowCoreAuthException(error);\n }\n\n const business = this.getBusiness(context);\n request.stpLoginId = result.loginId;\n request.stpToken = result.token;\n\n try {\n if (this.stpPermLogic) {\n const handler = context.getHandler();\n const cls = context.getClass();\n\n const permMeta = this.reflector.getAllAndOverride(XLT_PERMISSION_KEY, [handler, cls]);\n if (permMeta) {\n await this.stpPermLogic.checkPermission(result.loginId!, permMeta.permissions, permMeta.mode);\n }\n\n const roleMeta = this.reflector.getAllAndOverride(XLT_ROLE_KEY, [handler, cls]);\n if (roleMeta) {\n await this.stpPermLogic.checkRole(result.loginId!, roleMeta.roles, roleMeta.mode);\n }\n }\n\n if (business) {\n await this.stpLogic.checkSafe(result.token!, business);\n }\n } catch (error) {\n rethrowCoreAuthException(error);\n }\n\n return true;\n }\n\n private requiresLogin(context: ExecutionContext): boolean {\n const isIgnored = this.reflector.getAllAndOverride<boolean>(XLT_IGNORE_KEY, [\n context.getHandler(),\n context.getClass(),\n ]);\n\n if (this.config.defaultCheck) {\n return !isIgnored;\n }\n\n const shouldCheck = this.reflector.getAllAndOverride<boolean>(XLT_CHECK_LOGIN_KEY, [\n context.getHandler(),\n context.getClass(),\n ]);\n return shouldCheck ?? false;\n }\n\n private getBusiness(context: ExecutionContext): string {\n return this.reflector.getAllAndOverride<string>(XLT_CHECK_SAFE_KEY, [\n context.getHandler(),\n context.getClass(),\n ]);\n }\n}\n","import { CanActivate, ExecutionContext, Inject, Injectable } from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport {\n NotLoginException as CoreNotLoginException,\n NotLoginType,\n StpLogic,\n XLT_CHECK_LOGIN_KEY,\n XLT_IGNORE_KEY,\n XLT_TOKEN_CONFIG,\n type XltTokenConfig,\n} from '@xlt-token/core';\nimport { NotLoginException } from '../exceptions/not-login.exception.js';\nimport { createNestHttpContext } from '../http/nest-bridge.js';\n\n@Injectable()\nexport abstract class XltAbstractLoginGuard implements CanActivate {\n protected constructor(\n protected readonly reflector: Reflector,\n @Inject(XLT_TOKEN_CONFIG) protected readonly config: XltTokenConfig,\n protected readonly stpLogic: StpLogic,\n ) {}\n\n async canActivate(ctx: ExecutionContext): Promise<boolean> {\n if (!this.requiresLogin(ctx)) return true;\n\n const request = ctx.switchToHttp().getRequest();\n const response = ctx.switchToHttp().getResponse();\n\n let result: { ok: boolean; loginId?: string; token?: string; reason?: NotLoginType };\n try {\n result = await this.stpLogic.checkLogin(createNestHttpContext(request, response));\n } catch (err) {\n if (err instanceof CoreNotLoginException) {\n await this.onAuthFail?.({ ok: false, reason: err.type, token: err.token }, request);\n throw new NotLoginException(err.type, err.token);\n }\n throw err;\n }\n\n request.stpLoginId = result.loginId;\n request.stpToken = result.token;\n await this.onAuthSuccess?.(result, request);\n return true;\n }\n\n protected requiresLogin(ctx: ExecutionContext): boolean {\n const isIgnored = this.reflector.getAllAndOverride<boolean>(XLT_IGNORE_KEY, [ctx.getHandler(), ctx.getClass()]);\n\n if (this.config.defaultCheck) return !isIgnored;\n\n return this.reflector.getAllAndOverride<boolean>(XLT_CHECK_LOGIN_KEY, [ctx.getHandler(), ctx.getClass()]) ?? false;\n }\n\n protected onAuthSuccess?(\n result: {\n ok: boolean;\n loginId?: string | undefined;\n token?: string | undefined;\n reason?: NotLoginType | undefined;\n },\n request: any,\n ): void | Promise<void>;\n\n protected onAuthFail?(\n result: {\n ok: boolean;\n loginId?: string | undefined;\n token?: string | undefined;\n reason?: NotLoginType | undefined;\n },\n request: any,\n ): void | Promise<void>;\n\n protected onPermissionDenied?(\n result: {\n ok: boolean;\n loginId?: string | undefined;\n token?: string | undefined;\n reason?: NotLoginType | undefined;\n },\n request: any,\n ): void | Promise<void>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyCO,2BAAM,eAAe;;;;;0BAC6B;GACjD,SAASA;GACT,aACI,QACA,OACA,UACA,UACC,IAAIA,WAAS,QAAQ,OAAO,UAAU,MAAM;GACjD,QAAQ;IAAEC;IAAkBC;IAAiBC;IAAoBC;IAAiB;GACrF;;;8BACwD;GACrD,SAASC;GACT,aACI,cACA,OACA,WACC,IAAIA,eAAa,cAAc,OAAO,OAAO;GAClD,QAAQ;IAAEC;IAAmBJ;IAAiBD;IAAkB;GACnE;;;sBACgD;GAC7C,SAAS;GACT,aAAa,UAAoB,iBAA+B;AAC5D,kBAAY,SAAS;AACrB,sBAAgB,aAAa;AAC7B,WAAO;;GAEX,QAAQ,CAAED,YAAUK,eAAc;GACrC;;;uBACuC;GAAEJ;GAAkBC;GAAiBC;GAAoBH;GAAUK;GAAc;;CAEzH,OAAO,QAAQ,UAAiC,EAAE,EAAE;EAChD,MAAM,EAAC,QAAQ,YAAY,OAAO,UAAU,WAAW,OAAO,YAAY,EAAE,EAAE,iBAAgB;AAE9F,SAAO;GACH;GACA,WAAW;IACP;KAAC,SAASJ;KAAkB,UAAU,wBAAwB,WAAW;KAAC;oBAC3D,oBAAoB,MAAM;oBAC1B,uBAAuB,SAAS;oBAChC,2BAA2B,aAAa;oBACxC,oBAAoB,QAAQ,MAAM;oBAClC;oBACA;oBACA;IACf,GAAG;IACN;GACD,yBAAwB;GACxB,QAAQ;GACX;;CAGL,OAAO,aAAa,SAAqC;EACrD,MAAM,EACF,YACA,SAAS,EAAE,EACX,UAAU,EAAE,EACZ,OACA,UACA,WAAW,OACX,YAAY,EAAE,EACd,iBACA;AAEJ,SAAO;GACH;GACA;GACA,WAAW;IACP;KACI,SAASA;KACT,YAAY,OAAO,GAAG,SAAgB;MAClC,MAAM,EAAC,SAAS,EAAE,KAAI,MAAM,WAAW,GAAG,KAAK;AAC/C,aAAO,wBAAwB,OAAO;;KAE1C;KACH;oBACc,oBAAoB,MAAM;oBAC1B,uBAAuB,SAAS;oBAChC,2BAA2B,aAAa;oBACxC,oBAAoB,QAAQ,MAAM;oBAClC;oBACA;oBACA;IACf,GAAG;IACN;GACD,yBAAwB;GACxB,QAAQ;GACX;;CAGL,OAAe,oBACX,OACQ;AACR,MAAK,CAAC,MAAQ,QAAO;GAAC,SAASC;GAAiB,UAAUK;GAAY;AACtE,SAAO,cAAc,QACf;GAAC,SAASL;GAAiB,UAAU,MAAM;GAAS,GACpD;GAAC,SAASA;GAAiB,UAAU,MAAM;GAAS;;CAG9D,OAAe,uBACX,UACQ;AACR,SAAO,UAAU,WACX;GAAC,SAASC;GAAoB,UAAU,SAAS;GAAS,GAC1D;GAAC,SAASA;GAAoB,UAAUK;GAAa;;CAG/D,OAAe,2BACX,cACQ;AACR,MAAK,aAAe,QAAO;GAAC,SAASF;GAAmB,UAAU;GAAa;AAC/E,SAAO;GACH,SAASA;GACT,UAAU;IACN,yBAAyB;AACrB,WAAM,IAAI,MAAM,iDAAiD;;IAErE,mBAAmB;AACf,WAAM,IAAI,MAAM,2CAA2C;;IAElE;GACJ;;CAGL,OAAe,oBACX,OACQ;AACR,SAAO;GAAC,SAASF;GAAiB,UAAU,SAAS,EAAE;GAAC;;;+CAhI/D,OAAO,EAAE,CAAC;;;;;;;;;;;;;;;;;;ACpCX,MAAc,mBAAmB;AAIzB,uBAAM,WAAoC;CAEhD,YACE,AACiB,aACjB;EADiB;;CAMnB,MAAM,IAAI,KAAmC;AAC3C,SAAO,KAAK,YAAY,IAAI,IAAI;;CAIlC,MAAM,IAAI,KAAY,OAAc,YAAiC;AACnE,MAAI,eAAe,GACjB,OAAM,KAAK,YAAY,IAAI,KAAK,MAAM;MAEtC,OAAM,KAAK,YAAY,IAAI,KAAK,OAAO,EAAC,IAAI,YAAW,CAAC;;CAK5D,MAAM,OAAO,KAA0B;AACrC,QAAM,KAAK,YAAY,IAAI,IAAI;;CAIjC,MAAM,OAAO,KAAY,OAA4B;AAEnD,MADe,MAAM,KAAK,YAAY,IAAI,KAAK,OAAM;GAAC,IAAG;GAAK,SAAQ;GAAK,CAAC,KAC9D,KACZ,OAAM,IAAI,MAAM,kBAAkB,MAAM;;CAK5C,MAAM,IAAI,KAA6B;AAErC,SADe,MAAM,KAAK,YAAY,OAAO,IAAI,KAC/B;;CAIpB,MAAM,cAAc,KAAY,YAAiC;AAG/D,MAAI,CAFY,MAAO,KAAK,YAAY,OAAO,IAAI,CAGjD,OAAM,IAAI,MAAM,kBAAkB,MAAM;AAG1C,MAAI,eAAe,GACjB,OAAM,KAAK,YAAY,QAAQ,IAAI;MAEnC,OAAM,KAAK,YAAY,OAAO,KAAK,WAAW;;CAKlD,MAAM,WAAW,KAA4B;AAO3C,SANe,MAAM,KAAK,YAAY,IAAI,IAAI;;CAShD,MAAM,KAAK,SAAoC;EAC7C,MAAM,SAAmB,EAAE;EAC3B,IAAI,SAAS;AACb,KAAG;GACD,MAAM,QAAQ,MAAM,KAAK,YAAY,KAAK,QAAQ;IAAE,OAAO;IAAS,OAAO;IAAK,CAAC;AACjF,YAAS,MAAM;AACf,UAAO,KAAK,GAAG,MAAM,KAAK;WACnB,WAAW;AACpB,SAAO;;;;CA7EV,YAAY;oBAIR,OAAO,iBAAiB;;;;;;ACL7B,MAAM,UAAU,cAAc,OAAO,KAAK,IAAI;AAE9C,IAAI;AAIJ,SAAS,kBAAiD;AACxD,KAAI;AACF,mBAAiB,QAAQ,eAAe;AACxC,SAAO;UACA,OAAO;AAEd,MADY,MACJ,SAAS,mBACf,OAAM,IAAI,MACR,qIAED;AAEH,QAAM;;;AAKH,wBAAM,YAAoD;CAC/D,YACE,AAA2C,QAC3C;EAD2C;;CAG7C,AAAQ,gBAAgB,QAA6D;EACnF,MAAM,OAAO,UAAU,KAAK,QAAQ;AACpC,MAAI,CAAC,OAAO,CAAC,IAAI,OACf,OAAM,IAAI,MACR,oHAED;AAEH,SAAO;;CAGT,YAAY,SAAiB,QAAwB,SAA+C;EAClG,MAAM,EAAE,SAAS,iBAAiB;EAClC,MAAM,MAAM,KAAK,gBAAgB,OAAO;EACxC,MAAM,MAAM,YAAY;EAExB,MAAM,kBAAkB,SAAS,WAAW,OAAO;EACnD,MAAM,YAAY,OAAO,oBAAoB,WAAW,kBAAkB,IAAI;AAE9E,SAAO,KAAK;GACV,KAAK;GAAS;GACf,EAAE,IAAI,QAAQ;GACb,WAAW,IAAI,aAAa;GAC5B,GAAI,IAAI,UAAU,EAAE,QAAQ,IAAI,QAAQ;GACxC,GAAI,IAAI,YAAY,EAAE,UAAU,IAAI,UAAU;GAC9C,GAAI,aAAa,EAAE,WAAW,iBAAiB;GAChD,CAAC;;CAGJ,cAAc,SAAsB;EAClC,MAAM,EAAE,SAAS,iBAAiB;AAElC,SAAO,KAAK,SADA,KAAK,iBAAiB,CACT,OAAO;;CAGlC,YAAY,OAA8B;EACxC,MAAM,EAAE,WAAW,iBAAiB;AAEpC,SAAO,OAAO,OADF,KAAK,iBAAiB,CACT,OAAO;;;;CA5CnC,YAAY;oBAGR,OAAOK,mBAAiB;;;;;;;;;;ACrB7B,MAAa,sBAAsB,YAAY,qBAAqB,KAAK;;;;ACLzE,MAAa,kBAAkB,YAAY,gBAAgB,KAAK;;;;;;;;ACGhE,MAAa,UAAU,sBACpB,MAAe,QAA0B;AAExC,QADgB,IAAI,cAAc,CAAC,YAAY,CAChC;EAElB;;;;;;;;ACJD,MAAa,aAAa,sBAAsB,MAAW,QAA0B;AAEnF,QADgB,IAAI,cAAc,CAAC,YAAY,CAChC;EACf;;;;;;;;;;;ACDF,MAAa,sBAAsB,aAAgC,YAAiC;AAGlG,QAAO,YAAY,oBAAoB;EAAE,aAF3B,MAAM,QAAQ,YAAY,GAAG,cAAc,CAAC,YAAY;EAET,MADhD,SAAS,QAAQC,UAAQ;EAC6B,CAAC;;;;;;;;;;;;ACHtE,MAAa,gBAAgB,OAA0B,YAAiC;AAGtF,QAAO,YAAY,cAAc;EAAE,OAFpB,MAAM,QAAQ,MAAM,GAAG,QAAQ,CAAC,MAAM;EAEH,MADrC,SAAS,QAAQC,UAAQ;EACkB,CAAC;;;;;ACZ3D,MAAa,qBAAqB;AAElC,MAAa,gBAAgB,aAAqB;AAChD,QAAO,YAAY,oBAAoB,SAAS;;;;;ACFlD,IAAa,oBAAb,MAAa,0BAA0B,sBAAsB;CAI3D,YAAY,MAAoB,OAAgB;AAC9C,QAAM;GACJ,YAAY;GACZ;GACA,SAAS,kBAAkB,aAAa,KAAK;GAC9C,CAAC;AACF,OAAK,OAAO;AACZ,OAAK,QAAQ;;CAGf,OAAe,aAAa,MAA4B;AAStD,SAR0C;IACvCC,eAAa,YAAY;IACzBA,eAAa,gBAAgB;IAC7BA,eAAa,gBAAgB;IAC7BA,eAAa,eAAe;IAC5BA,eAAa,cAAc;IAC3BA,eAAa,WAAW;GAC1B,CACU,SAAS;;;;;;ACvBxB,IAAa,yBAAb,cAA4C,mBAAmB;CAI7D,YAAY,YAA+B,MAAe;AACxD,QAAM;GACJ,YAAY;GACZ,MAAM;GACN,SAAS,SAAS,MAAM,QAAQ,WAAW,GAAG,WAAW,KAAK,KAAK,GAAG;GACvE,CAAC;AACF,OAAK,aAAa;AAClB,OAAK,OAAO;;;;;;ACXhB,IAAa,mBAAb,cAAsC,mBAAmB;CAIvD,YAAY,MAAyB,MAAe;AAClD,QAAM;GACJ,YAAY;GACZ,MAAM;GACN,SAAS,SAAS,MAAM,QAAQ,KAAK,GAAG,KAAK,KAAK,KAAK,GAAG;GAC3D,CAAC;AACF,OAAK,OAAO;AACZ,OAAK,OAAO;;;;;;ACZhB,IAAa,mBAAb,cAAsC,mBAAmB;CAIvD,YAAY,UAAkB;AAC5B,QAAM;GACJ,YAAY;GACZ,MAAM;GACN,SAAS,WAAW;GACrB,CAAC;AACF,OAAK,WAAW;;;;;;;;;;;;;;;ACWpB,SAAS,kBAAkB,KAA+B;AACxD,QAAO;EACL,UAAU,MAAc,OAAqB;AAC3C,OAAI,OAAO,KAAK,cAAc,WAE5B,KAAI,UAAU,MAAM,MAAM;YACjB,OAAO,KAAK,WAAW,WAEhC,KAAI,OAAO,MAAM,MAAM;OAEvB,OAAM,IAAI,MACR,iEACD;;EAGL,OAAO,MAAc,OAAe,SAA+B;AACjE,OAAI,OAAO,KAAK,WAAW,WAEzB,KAAI,OAAO,MAAM,OAAO,QAAQ;YACvB,OAAO,KAAK,cAAc,WAEnC,KAAI,UAAU,MAAM,OAAO,QAAQ;OAEnC,OAAM,IAAI,MACR,2EAED;;EAGN;;AAGH,SAAgB,sBAAsB,KAAU,KAAU;AACxD,QAAOC,uBAAqB,KAAK,kBAAkB,IAAI,CAAC;;AAG1D,SAAgB,yBAAyB,OAAuB;AAC9D,KAAI,iBAAiBC,oBACnB,OAAM,IAAI,kBAAkB,MAAM,MAAM,MAAM,MAAM;AAEtD,KAAI,iBAAiBC,yBACnB,OAAM,IAAI,uBAAuB,MAAM,YAAY,MAAM,KAAK;AAEhE,KAAI,iBAAiBC,mBACnB,OAAM,IAAI,iBAAiB,MAAM,MAAM,MAAM,KAAK;AAEpD,KAAI,iBAAiBC,mBACnB,OAAM,IAAI,iBAAiB,MAAM,SAAS;AAE5C,OAAM;;;;;;ACrDD,0BAAM,cAAqC;CAChD,YACE,AAAiB,WACjB,AAA2C,QAC3C,AAAiB,UACjB,AAA6B,cAC7B;EAJiB;EAC0B;EAC1B;EACY;;CAI/B,MAAM,YAAY,SAA6C;AAC7D,MAAI,CAAC,KAAK,cAAc,QAAQ,CAAE,QAAO;EAEzC,MAAM,UAAU,QAAQ,cAAc,CAAC,YAAY;EACnD,MAAM,WAAW,QAAQ,cAAc,CAAC,aAAa;EAErD,IAAI;AACJ,MAAI;AACF,YAAS,MAAM,KAAK,SAAS,WAAW,sBAAsB,SAAS,SAAS,CAAC;WAC1E,OAAO;AACd,4BAAyB,MAAM;;EAGjC,MAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,UAAQ,aAAa,OAAO;AAC5B,UAAQ,WAAW,OAAO;AAE1B,MAAI;AACF,OAAI,KAAK,cAAc;IACrB,MAAM,UAAU,QAAQ,YAAY;IACpC,MAAM,MAAM,QAAQ,UAAU;IAE9B,MAAM,WAAW,KAAK,UAAU,kBAAkB,oBAAoB,CAAC,SAAS,IAAI,CAAC;AACrF,QAAI,SACF,OAAM,KAAK,aAAa,gBAAgB,OAAO,SAAU,SAAS,aAAa,SAAS,KAAK;IAG/F,MAAM,WAAW,KAAK,UAAU,kBAAkB,cAAc,CAAC,SAAS,IAAI,CAAC;AAC/E,QAAI,SACF,OAAM,KAAK,aAAa,UAAU,OAAO,SAAU,SAAS,OAAO,SAAS,KAAK;;AAIrF,OAAI,SACF,OAAM,KAAK,SAAS,UAAU,OAAO,OAAQ,SAAS;WAEjD,OAAO;AACd,4BAAyB,MAAM;;AAGjC,SAAO;;CAGT,AAAQ,cAAc,SAAoC;EACxD,MAAM,YAAY,KAAK,UAAU,kBAA2B,gBAAgB,CAC1E,QAAQ,YAAY,EACpB,QAAQ,UAAU,CACnB,CAAC;AAEF,MAAI,KAAK,OAAO,aACd,QAAO,CAAC;AAOV,SAJoB,KAAK,UAAU,kBAA2B,qBAAqB,CACjF,QAAQ,YAAY,EACpB,QAAQ,UAAU,CACnB,CAAC,IACoB;;CAGxB,AAAQ,YAAY,SAAmC;AACrD,SAAO,KAAK,UAAU,kBAA0B,oBAAoB,CAClE,QAAQ,YAAY,EACpB,QAAQ,UAAU,CACnB,CAAC;;;;CA1EL,YAAY;oBAIR,OAAOC,mBAAiB;oBAExB,UAAU;;;;;;;;;;;;ACTR,kCAAe,sBAA6C;CACjE,AAAU,YACR,AAAmB,WACnB,AAA6C,QAC7C,AAAmB,UACnB;EAHmB;EAC0B;EAC1B;;CAGrB,MAAM,YAAY,KAAyC;AACzD,MAAI,CAAC,KAAK,cAAc,IAAI,CAAE,QAAO;EAErC,MAAM,UAAU,IAAI,cAAc,CAAC,YAAY;EAC/C,MAAM,WAAW,IAAI,cAAc,CAAC,aAAa;EAEjD,IAAI;AACJ,MAAI;AACF,YAAS,MAAM,KAAK,SAAS,WAAW,sBAAsB,SAAS,SAAS,CAAC;WAC1E,KAAK;AACZ,OAAI,eAAeC,qBAAuB;AACxC,UAAM,KAAK,aAAa;KAAE,IAAI;KAAO,QAAQ,IAAI;KAAM,OAAO,IAAI;KAAO,EAAE,QAAQ;AACnF,UAAM,IAAI,kBAAkB,IAAI,MAAM,IAAI,MAAM;;AAElD,SAAM;;AAGR,UAAQ,aAAa,OAAO;AAC5B,UAAQ,WAAW,OAAO;AAC1B,QAAM,KAAK,gBAAgB,QAAQ,QAAQ;AAC3C,SAAO;;CAGT,AAAU,cAAc,KAAgC;EACtD,MAAM,YAAY,KAAK,UAAU,kBAA2B,gBAAgB,CAAC,IAAI,YAAY,EAAE,IAAI,UAAU,CAAC,CAAC;AAE/G,MAAI,KAAK,OAAO,aAAc,QAAO,CAAC;AAEtC,SAAO,KAAK,UAAU,kBAA2B,qBAAqB,CAAC,IAAI,YAAY,EAAE,IAAI,UAAU,CAAC,CAAC,IAAI;;;;CApChH,YAAY;oBAIR,OAAOC,mBAAiB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xlt-token/nestjs",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "NestJS integration for xlt-token",
5
5
  "keywords": [
6
6
  "nestjs",
@@ -26,8 +26,14 @@
26
26
  "type": "module",
27
27
  "exports": {
28
28
  ".": {
29
- "import": "./dist/index.mjs",
30
- "require": "./dist/index.cjs"
29
+ "import": {
30
+ "types": "./dist/index.d.mts",
31
+ "default": "./dist/index.mjs"
32
+ },
33
+ "require": {
34
+ "types": "./dist/index.d.cts",
35
+ "default": "./dist/index.cjs"
36
+ }
31
37
  },
32
38
  "./package.json": "./package.json"
33
39
  },
@@ -41,8 +47,8 @@
41
47
  "README.md"
42
48
  ],
43
49
  "peerDependencies": {
44
- "@nestjs/common": "^10.0.0 || ^11.0.0",
45
- "@nestjs/core": "^10.0.0 || ^11.0.0",
50
+ "@nestjs/common": "^10.0.0 || ^11.0.0 || ^12.0.0",
51
+ "@nestjs/core": "^10.0.0 || ^11.0.0 || ^12.0.0",
46
52
  "reflect-metadata": "^0.1.13 || ^0.2.0",
47
53
  "rxjs": "^7.0.0"
48
54
  },
@@ -55,7 +61,7 @@
55
61
  }
56
62
  },
57
63
  "dependencies": {
58
- "@xlt-token/core": "^1.0.1",
64
+ "@xlt-token/core": "^1.1.0",
59
65
  "uuid": "^10.0.0"
60
66
  },
61
67
  "devDependencies": {