@echo-nova-404/sso-tool 0.1.12-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.js +18 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/sso-tool.constant.d.ts +7 -0
- package/dist/constants/sso-tool.constant.js +12 -0
- package/dist/constants/sso-tool.constant.js.map +1 -0
- package/dist/decorators/auth.decorator.d.ts +5 -0
- package/dist/decorators/auth.decorator.js +14 -0
- package/dist/decorators/auth.decorator.js.map +1 -0
- package/dist/decorators/index.d.ts +2 -0
- package/dist/decorators/index.js +19 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/roles-check.decorator.d.ts +1 -0
- package/dist/decorators/roles-check.decorator.js +6 -0
- package/dist/decorators/roles-check.decorator.js.map +1 -0
- package/dist/guards/auth.guard.d.ts +10 -0
- package/dist/guards/auth.guard.js +43 -0
- package/dist/guards/auth.guard.js.map +1 -0
- package/dist/guards/index.d.ts +1 -0
- package/dist/guards/index.js +18 -0
- package/dist/guards/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/sso-tool-v1/guards/auth-v1.guard.d.ts +9 -0
- package/dist/sso-tool-v1/guards/auth-v1.guard.js +58 -0
- package/dist/sso-tool-v1/guards/auth-v1.guard.js.map +1 -0
- package/dist/sso-tool-v1/guards/index.d.ts +1 -0
- package/dist/sso-tool-v1/guards/index.js +18 -0
- package/dist/sso-tool-v1/guards/index.js.map +1 -0
- package/dist/sso-tool-v1/index.d.ts +3 -0
- package/dist/sso-tool-v1/index.js +20 -0
- package/dist/sso-tool-v1/index.js.map +1 -0
- package/dist/sso-tool-v1/services/index.d.ts +1 -0
- package/dist/sso-tool-v1/services/index.js +18 -0
- package/dist/sso-tool-v1/services/index.js.map +1 -0
- package/dist/sso-tool-v1/services/sso-tool-v1.service.d.ts +28 -0
- package/dist/sso-tool-v1/services/sso-tool-v1.service.js +92 -0
- package/dist/sso-tool-v1/services/sso-tool-v1.service.js.map +1 -0
- package/dist/sso-tool-v1/sso-tool-v1.module.d.ts +4 -0
- package/dist/sso-tool-v1/sso-tool-v1.module.js +27 -0
- package/dist/sso-tool-v1/sso-tool-v1.module.js.map +1 -0
- package/dist/sso-tool-v1/types/index.d.ts +1 -0
- package/dist/sso-tool-v1/types/index.js +18 -0
- package/dist/sso-tool-v1/types/index.js.map +1 -0
- package/dist/sso-tool-v1/types/sso-tool-v1.type.d.ts +82 -0
- package/dist/sso-tool-v1/types/sso-tool-v1.type.js +3 -0
- package/dist/sso-tool-v1/types/sso-tool-v1.type.js.map +1 -0
- package/dist/sso-tool.module.d.ts +11 -0
- package/dist/sso-tool.module.js +41 -0
- package/dist/sso-tool.module.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/sso-tool.type.d.ts +30 -0
- package/dist/types/sso-tool.type.js +3 -0
- package/dist/types/sso-tool.type.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/service.util.d.ts +1 -0
- package/dist/utils/service.util.js +13 -0
- package/dist/utils/service.util.js.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
## @nch-nestjs/sso-tool
|
|
2
|
+
|
|
3
|
+
Библиотека для NestJS для проверки авторизации в серверных приложениях, использующих `SSO`.
|
|
4
|
+
|
|
5
|
+
### Установка
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
npm install @nch-nestjs/sso-tool
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Подключение и использование
|
|
12
|
+
|
|
13
|
+
В `app.module.ts` подключите `SsoToolModule`
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { Module } from '@nestjs/common';
|
|
17
|
+
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
18
|
+
import { SsoApiVersion, SsoToolModule } from '@nch-nestjs/sso-tool';
|
|
19
|
+
|
|
20
|
+
@Module({
|
|
21
|
+
imports: [
|
|
22
|
+
ConfigModule.forRoot({
|
|
23
|
+
isGlobal: true
|
|
24
|
+
}),
|
|
25
|
+
SsoToolModule.forRootAsync({
|
|
26
|
+
inject: [ConfigService],
|
|
27
|
+
useFactory: async (configService: ConfigService) => ({
|
|
28
|
+
domain: configService.getOrThrow<string>('SSO_DOMAIN'),
|
|
29
|
+
version: SsoApiVersion.V1,
|
|
30
|
+
projectId: configService.getOrThrow<string>('SSO_PROJECT_ID'),
|
|
31
|
+
}),
|
|
32
|
+
}),
|
|
33
|
+
],
|
|
34
|
+
controllers: [],
|
|
35
|
+
providers: [],
|
|
36
|
+
})
|
|
37
|
+
export class AppModule {}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Подключите декоратор `@Auth`
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { Controller, Get } from '@nestjs/common';
|
|
44
|
+
import { Auth } from '@nch-nestjs/sso-tool';
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@Controller({
|
|
48
|
+
path: 'user',
|
|
49
|
+
version: '1',
|
|
50
|
+
})
|
|
51
|
+
export class UserController {
|
|
52
|
+
|
|
53
|
+
@Auth(['default'])
|
|
54
|
+
@Get('')
|
|
55
|
+
async getUsers() {
|
|
56
|
+
return [
|
|
57
|
+
{
|
|
58
|
+
id: 1,
|
|
59
|
+
name: 'Пользователь'
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Использование API SSO
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
import { Injectable } from '@nestjs/common';
|
|
71
|
+
import { SsoToolV1Service } from "@nch-nestjs/sso-tool";
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@Injectable()
|
|
75
|
+
export class GeneralService {
|
|
76
|
+
|
|
77
|
+
constructor(
|
|
78
|
+
private readonly ssoToolV1Service: SsoToolV1Service
|
|
79
|
+
) {}
|
|
80
|
+
|
|
81
|
+
async getMyUser(token: string) {
|
|
82
|
+
return await this.ssoToolV1Service.getUser(token);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './sso-tool.constant';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./sso-tool.constant"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SsoApiVersion = exports.SSO_TOOL_DEFAULT_NAME = void 0;
|
|
4
|
+
exports.SSO_TOOL_DEFAULT_NAME = 'sso-tool';
|
|
5
|
+
/**
|
|
6
|
+
* Версия API
|
|
7
|
+
*/
|
|
8
|
+
var SsoApiVersion;
|
|
9
|
+
(function (SsoApiVersion) {
|
|
10
|
+
SsoApiVersion["V1"] = "v1";
|
|
11
|
+
})(SsoApiVersion || (exports.SsoApiVersion = SsoApiVersion = {}));
|
|
12
|
+
//# sourceMappingURL=sso-tool.constant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-tool.constant.js","sourceRoot":"","sources":["../../src/constants/sso-tool.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,UAAU,CAAC;AAEhD;;GAEG;AACH,IAAY,aAEX;AAFD,WAAY,aAAa;IACxB,0BAAS,CAAA;AACV,CAAC,EAFW,aAAa,6BAAb,aAAa,QAExB"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Декоратор, проверяющий авторизацию
|
|
3
|
+
* @param {string[]} roles список роллей, которым предоставлен доступ
|
|
4
|
+
*/
|
|
5
|
+
export declare const Auth: (roles?: string[]) => <TFunction extends Function, Y>(target: TFunction | object, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Auth = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
6
|
+
const guards_1 = require("../guards");
|
|
7
|
+
const roles_check_decorator_1 = require("./roles-check.decorator");
|
|
8
|
+
/**
|
|
9
|
+
* Декоратор, проверяющий авторизацию
|
|
10
|
+
* @param {string[]} roles список роллей, которым предоставлен доступ
|
|
11
|
+
*/
|
|
12
|
+
const Auth = (roles = []) => (0, common_1.applyDecorators)((0, common_1.UseGuards)(guards_1.AuthGuard), (0, roles_check_decorator_1.RolesCheck)(roles), (0, swagger_1.ApiBearerAuth)());
|
|
13
|
+
exports.Auth = Auth;
|
|
14
|
+
//# sourceMappingURL=auth.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.decorator.js","sourceRoot":"","sources":["../../src/decorators/auth.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA4D;AAC5D,6CAAgD;AAChD,sCAAsC;AACtC,mEAAqD;AAErD;;;GAGG;AACI,MAAM,IAAI,GAAG,CAAC,QAAkB,EAAE,EAAE,EAAE,CAC5C,IAAA,wBAAe,EAAC,IAAA,kBAAS,EAAC,kBAAS,CAAC,EAAE,IAAA,kCAAU,EAAC,KAAK,CAAC,EAAE,IAAA,uBAAa,GAAE,CAAC,CAAC;AAD9D,QAAA,IAAI,QAC0D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./auth.decorator"), exports);
|
|
18
|
+
__exportStar(require("./roles-check.decorator"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,0DAAwC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const RolesCheck: import("@nestjs/core").ReflectableDecorator<string[], string[]>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles-check.decorator.js","sourceRoot":"","sources":["../../src/decorators/roles-check.decorator.ts"],"names":[],"mappings":";;;AAAA,uCAAyC;AAE5B,QAAA,UAAU,GAAG,gBAAS,CAAC,eAAe,EAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { AuthV1Guard } from '../sso-tool-v1';
|
|
3
|
+
import { type SsoToolOptions } from '../types';
|
|
4
|
+
export declare class AuthGuard implements CanActivate {
|
|
5
|
+
private readonly authCheckOptions;
|
|
6
|
+
private readonly authV1Guard;
|
|
7
|
+
private readonly version;
|
|
8
|
+
constructor(authCheckOptions: SsoToolOptions, authV1Guard: AuthV1Guard);
|
|
9
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.AuthGuard = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const constants_1 = require("../constants");
|
|
18
|
+
const sso_tool_v1_1 = require("../sso-tool-v1");
|
|
19
|
+
let AuthGuard = class AuthGuard {
|
|
20
|
+
authCheckOptions;
|
|
21
|
+
authV1Guard;
|
|
22
|
+
version;
|
|
23
|
+
constructor(authCheckOptions, authV1Guard) {
|
|
24
|
+
this.authCheckOptions = authCheckOptions;
|
|
25
|
+
this.authV1Guard = authV1Guard;
|
|
26
|
+
this.version = this.authCheckOptions.version;
|
|
27
|
+
}
|
|
28
|
+
async canActivate(context) {
|
|
29
|
+
switch (this.version) {
|
|
30
|
+
case constants_1.SsoApiVersion.V1:
|
|
31
|
+
return this.authV1Guard.canActivate(context);
|
|
32
|
+
default:
|
|
33
|
+
throw new Error('Неуказан параметр "version"');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
exports.AuthGuard = AuthGuard;
|
|
38
|
+
exports.AuthGuard = AuthGuard = __decorate([
|
|
39
|
+
(0, common_1.Injectable)(),
|
|
40
|
+
__param(0, (0, common_1.Inject)(constants_1.SSO_TOOL_DEFAULT_NAME)),
|
|
41
|
+
__metadata("design:paramtypes", [Object, sso_tool_v1_1.AuthV1Guard])
|
|
42
|
+
], AuthGuard);
|
|
43
|
+
//# sourceMappingURL=auth.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["../../src/guards/auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAmF;AACnF,4CAAoE;AACpE,gDAA6C;AAItC,IAAM,SAAS,GAAf,MAAM,SAAS;IAKH;IACA;IALD,OAAO,CAA4B;IAEpD,YAEkB,gBAAgC,EAChC,WAAwB;QADxB,qBAAgB,GAAhB,gBAAgB,CAAgB;QAChC,gBAAW,GAAX,WAAW,CAAa;QAEzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAyB;QAC1C,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,KAAK,yBAAa,CAAC,EAAE;gBACpB,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9C;gBACC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;IACF,CAAC;CACD,CAAA;AAnBY,8BAAS;oBAAT,SAAS;IADrB,IAAA,mBAAU,GAAE;IAKV,WAAA,IAAA,eAAM,EAAC,iCAAqB,CAAC,CAAA;6CAEA,yBAAW;GAN9B,SAAS,CAmBrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './auth.guard';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./auth.guard"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guards/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.SsoToolV1Service = exports.Auth = exports.SsoApiVersion = void 0;
|
|
18
|
+
var constants_1 = require("./constants");
|
|
19
|
+
Object.defineProperty(exports, "SsoApiVersion", { enumerable: true, get: function () { return constants_1.SsoApiVersion; } });
|
|
20
|
+
var decorators_1 = require("./decorators");
|
|
21
|
+
Object.defineProperty(exports, "Auth", { enumerable: true, get: function () { return decorators_1.Auth; } });
|
|
22
|
+
__exportStar(require("./sso-tool.module"), exports);
|
|
23
|
+
var sso_tool_v1_1 = require("./sso-tool-v1");
|
|
24
|
+
Object.defineProperty(exports, "SsoToolV1Service", { enumerable: true, get: function () { return sso_tool_v1_1.SsoToolV1Service; } });
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AACtB,2CAAoC;AAA3B,kGAAA,IAAI,OAAA;AACb,oDAAkC;AAClC,6CAAiD;AAAxC,+GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { SsoToolV1Service } from '../services';
|
|
4
|
+
export declare class AuthV1Guard implements CanActivate {
|
|
5
|
+
private reflector;
|
|
6
|
+
private readonly ssoToolV1Service;
|
|
7
|
+
constructor(reflector: Reflector, ssoToolV1Service: SsoToolV1Service);
|
|
8
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AuthV1Guard = void 0;
|
|
13
|
+
const i18n_kit_1 = require("@nch-nestjs/i18n-kit");
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const core_1 = require("@nestjs/core");
|
|
16
|
+
const decorators_1 = require("../../decorators");
|
|
17
|
+
const services_1 = require("../services");
|
|
18
|
+
let AuthV1Guard = class AuthV1Guard {
|
|
19
|
+
reflector;
|
|
20
|
+
ssoToolV1Service;
|
|
21
|
+
constructor(reflector, ssoToolV1Service) {
|
|
22
|
+
this.reflector = reflector;
|
|
23
|
+
this.ssoToolV1Service = ssoToolV1Service;
|
|
24
|
+
}
|
|
25
|
+
async canActivate(context) {
|
|
26
|
+
const roles = this.reflector.get(decorators_1.RolesCheck, context.getHandler());
|
|
27
|
+
const request = context.switchToHttp().getRequest();
|
|
28
|
+
const token = request.headers.authorization?.replace('Bearer ', '');
|
|
29
|
+
if (!token) {
|
|
30
|
+
throw (0, i18n_kit_1.i18nException)(common_1.UnauthorizedException, {
|
|
31
|
+
messageKey: 'exception.UNAUTHORIZE.MESSAGE.DEFAULT',
|
|
32
|
+
descriptionKey: 'exception.UNAUTHORIZE.ERROR',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const { active, user, roles: tokenRoles } = await this.ssoToolV1Service.checkAuth(token);
|
|
36
|
+
const rolesAccess = (tokenRoles && roles.some((item) => tokenRoles.includes(item))) || !roles.length;
|
|
37
|
+
if (!(active && user)) {
|
|
38
|
+
throw (0, i18n_kit_1.i18nException)(common_1.UnauthorizedException, {
|
|
39
|
+
messageKey: 'exception.UNAUTHORIZE.MESSAGE.DEFAULT',
|
|
40
|
+
descriptionKey: 'exception.UNAUTHORIZE.ERROR',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (!rolesAccess) {
|
|
44
|
+
throw (0, i18n_kit_1.i18nException)(common_1.ForbiddenException, {
|
|
45
|
+
messageKey: 'exception.FORBIDDEN.MESSAGE.DEFAULT',
|
|
46
|
+
descriptionKey: 'exception.FORBIDDEN.ERROR',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.AuthV1Guard = AuthV1Guard;
|
|
53
|
+
exports.AuthV1Guard = AuthV1Guard = __decorate([
|
|
54
|
+
(0, common_1.Injectable)(),
|
|
55
|
+
__metadata("design:paramtypes", [core_1.Reflector,
|
|
56
|
+
services_1.SsoToolV1Service])
|
|
57
|
+
], AuthV1Guard);
|
|
58
|
+
//# sourceMappingURL=auth-v1.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-v1.guard.js","sourceRoot":"","sources":["../../../src/sso-tool-v1/guards/auth-v1.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAqD;AACrD,2CAMwB;AACxB,uCAAyC;AACzC,iDAA8C;AAC9C,0CAA+C;AAGxC,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEd;IACS;IAFlB,YACS,SAAoB,EACX,gBAAkC;QAD3C,cAAS,GAAT,SAAS,CAAW;QACX,qBAAgB,GAAhB,gBAAgB,CAAkB;IACjD,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAA,wBAAa,EAAC,8BAAqB,EAAE;gBAC1C,UAAU,EAAE,uCAAuC;gBACnD,cAAc,EAAE,6BAA6B;aAC7C,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzF,MAAM,WAAW,GAChB,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAClF,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAA,wBAAa,EAAC,8BAAqB,EAAE;gBAC1C,UAAU,EAAE,uCAAuC;gBACnD,cAAc,EAAE,6BAA6B;aAC7C,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,MAAM,IAAA,wBAAa,EAAC,2BAAkB,EAAE;gBACvC,UAAU,EAAE,qCAAqC;gBACjD,cAAc,EAAE,2BAA2B;aAC3C,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAA;AAjCY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAGQ,gBAAS;QACO,2BAAgB;GAHxC,WAAW,CAiCvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './auth-v1.guard';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./auth-v1.guard"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sso-tool-v1/guards/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./guards"), exports);
|
|
18
|
+
__exportStar(require("./services"), exports);
|
|
19
|
+
__exportStar(require("./sso-tool-v1.module"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sso-tool-v1/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,6CAA2B;AAC3B,uDAAqC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './sso-tool-v1.service';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./sso-tool-v1.service"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sso-tool-v1/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type SsoToolOptions } from '../../types';
|
|
2
|
+
import { AuthCheckV1Response, UserAvatarResponseV1, UserDataV1 } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Сервис вызова API Single Sign-On (v1)
|
|
5
|
+
*/
|
|
6
|
+
export declare class SsoToolV1Service {
|
|
7
|
+
private readonly authCheckOptions;
|
|
8
|
+
private readonly domain;
|
|
9
|
+
private readonly projectId;
|
|
10
|
+
private readonly defaultHeaders;
|
|
11
|
+
constructor(authCheckOptions: SsoToolOptions);
|
|
12
|
+
/**
|
|
13
|
+
* Метод для проверки авторизации пользователя
|
|
14
|
+
* @param {string} access access-token пользователя
|
|
15
|
+
*/
|
|
16
|
+
checkAuth(access: string): Promise<AuthCheckV1Response>;
|
|
17
|
+
/**
|
|
18
|
+
* Метод для получения информации о пользователе
|
|
19
|
+
* @param {string} access access-token пользователя
|
|
20
|
+
*/
|
|
21
|
+
getUser(access: string): Promise<UserDataV1>;
|
|
22
|
+
/**
|
|
23
|
+
* Метод для получения аватара пользователя
|
|
24
|
+
* @param {string} access access-token пользователя
|
|
25
|
+
* @param {string} avatarName название аватара пользователя
|
|
26
|
+
*/
|
|
27
|
+
getUserAvatar(access: string, avatarName: string): Promise<UserAvatarResponseV1>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.SsoToolV1Service = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const constants_1 = require("../../constants");
|
|
18
|
+
const utils_1 = require("../../utils");
|
|
19
|
+
/**
|
|
20
|
+
* Сервис вызова API Single Sign-On (v1)
|
|
21
|
+
*/
|
|
22
|
+
let SsoToolV1Service = class SsoToolV1Service {
|
|
23
|
+
authCheckOptions;
|
|
24
|
+
domain;
|
|
25
|
+
projectId;
|
|
26
|
+
defaultHeaders;
|
|
27
|
+
constructor(authCheckOptions) {
|
|
28
|
+
this.authCheckOptions = authCheckOptions;
|
|
29
|
+
this.domain = this.authCheckOptions.domain;
|
|
30
|
+
this.projectId = this.authCheckOptions.projectId;
|
|
31
|
+
this.defaultHeaders = {
|
|
32
|
+
Accept: 'application/json',
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Метод для проверки авторизации пользователя
|
|
38
|
+
* @param {string} access access-token пользователя
|
|
39
|
+
*/
|
|
40
|
+
async checkAuth(access) {
|
|
41
|
+
const url = new URL(`/v1/check`, this.domain);
|
|
42
|
+
const response = await fetch(url, {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: this.defaultHeaders,
|
|
45
|
+
body: JSON.stringify({
|
|
46
|
+
access: access,
|
|
47
|
+
projectId: this.projectId,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
return await (0, utils_1.handleResponse)(response, 200);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Метод для получения информации о пользователе
|
|
54
|
+
* @param {string} access access-token пользователя
|
|
55
|
+
*/
|
|
56
|
+
async getUser(access) {
|
|
57
|
+
const url = new URL(`/v1/user/me`, this.domain);
|
|
58
|
+
const headers = {
|
|
59
|
+
...this.defaultHeaders,
|
|
60
|
+
Authorization: `Bearer ${access}`,
|
|
61
|
+
};
|
|
62
|
+
const response = await fetch(url, {
|
|
63
|
+
method: 'GET',
|
|
64
|
+
headers: headers,
|
|
65
|
+
});
|
|
66
|
+
return await (0, utils_1.handleResponse)(response, 200);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Метод для получения аватара пользователя
|
|
70
|
+
* @param {string} access access-token пользователя
|
|
71
|
+
* @param {string} avatarName название аватара пользователя
|
|
72
|
+
*/
|
|
73
|
+
async getUserAvatar(access, avatarName) {
|
|
74
|
+
const url = new URL(`/v1/user/me/avatar/${avatarName}`, this.domain);
|
|
75
|
+
const headers = {
|
|
76
|
+
...this.defaultHeaders,
|
|
77
|
+
Authorization: `Bearer ${access}`,
|
|
78
|
+
};
|
|
79
|
+
const response = await fetch(url, {
|
|
80
|
+
method: 'GET',
|
|
81
|
+
headers: headers,
|
|
82
|
+
});
|
|
83
|
+
return await (0, utils_1.handleResponse)(response, 200);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
exports.SsoToolV1Service = SsoToolV1Service;
|
|
87
|
+
exports.SsoToolV1Service = SsoToolV1Service = __decorate([
|
|
88
|
+
(0, common_1.Injectable)(),
|
|
89
|
+
__param(0, (0, common_1.Inject)(constants_1.SSO_TOOL_DEFAULT_NAME)),
|
|
90
|
+
__metadata("design:paramtypes", [Object])
|
|
91
|
+
], SsoToolV1Service);
|
|
92
|
+
//# sourceMappingURL=sso-tool-v1.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-tool-v1.service.js","sourceRoot":"","sources":["../../../src/sso-tool-v1/services/sso-tool-v1.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,+CAAwD;AAExD,uCAA6C;AAG7C;;GAEG;AAEI,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAOV;IAND,MAAM,CAA2B;IACjC,SAAS,CAA8B;IACvC,cAAc,CAAiB;IAEhD,YAEkB,gBAAgC;QAAhC,qBAAgB,GAAhB,gBAAgB,CAAgB;QAEjD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;QACjD,IAAI,CAAC,cAAc,GAAG;YACrB,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SAClC,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,MAAc;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,cAAc;YAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,MAAM,EAAE,MAAM;gBACd,SAAS,EAAE,IAAI,CAAC,SAAS;aACzB,CAAC;SACF,CAAC,CAAC;QACH,OAAO,MAAM,IAAA,sBAAc,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc;QAC3B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG;YACf,GAAG,IAAI,CAAC,cAAc;YACtB,aAAa,EAAE,UAAU,MAAM,EAAE;SACjC,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,OAAO;SAChB,CAAC,CAAC;QACH,OAAO,MAAM,IAAA,sBAAc,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,UAAkB;QACrD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,sBAAsB,UAAU,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG;YACf,GAAG,IAAI,CAAC,cAAc;YACtB,aAAa,EAAE,UAAU,MAAM,EAAE;SACjC,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,OAAO;SAChB,CAAC,CAAC;QACH,OAAO,MAAM,IAAA,sBAAc,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;CACD,CAAA;AApEY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAOV,WAAA,IAAA,eAAM,EAAC,iCAAqB,CAAC,CAAA;;GANnB,gBAAgB,CAoE5B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var SsoToolV1Module_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SsoToolV1Module = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const guards_1 = require("./guards");
|
|
13
|
+
const services_1 = require("./services");
|
|
14
|
+
let SsoToolV1Module = SsoToolV1Module_1 = class SsoToolV1Module {
|
|
15
|
+
static registerProviders(providers = []) {
|
|
16
|
+
return {
|
|
17
|
+
module: SsoToolV1Module_1,
|
|
18
|
+
providers: [services_1.SsoToolV1Service, guards_1.AuthV1Guard, ...providers],
|
|
19
|
+
exports: [services_1.SsoToolV1Service, guards_1.AuthV1Guard, ...providers],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
exports.SsoToolV1Module = SsoToolV1Module;
|
|
24
|
+
exports.SsoToolV1Module = SsoToolV1Module = SsoToolV1Module_1 = __decorate([
|
|
25
|
+
(0, common_1.Module)({})
|
|
26
|
+
], SsoToolV1Module);
|
|
27
|
+
//# sourceMappingURL=sso-tool-v1.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-tool-v1.module.js","sourceRoot":"","sources":["../../src/sso-tool-v1/sso-tool-v1.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+D;AAC/D,qCAAuC;AACvC,yCAA8C;AAGvC,IAAM,eAAe,uBAArB,MAAM,eAAe;IAC3B,MAAM,CAAC,iBAAiB,CAAC,YAAwB,EAAE;QAClD,OAAO;YACN,MAAM,EAAE,iBAAe;YACvB,SAAS,EAAE,CAAC,2BAAgB,EAAE,oBAAW,EAAE,GAAG,SAAS,CAAC;YACxD,OAAO,EAAE,CAAC,2BAAgB,EAAE,oBAAW,EAAE,GAAG,SAAS,CAAC;SACtD,CAAC;IACH,CAAC;CACD,CAAA;AARY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,eAAe,CAQ3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './sso-tool-v1.type';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./sso-tool-v1.type"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sso-tool-v1/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export interface UserDataV1 {
|
|
2
|
+
/**
|
|
3
|
+
* Id пользователя
|
|
4
|
+
*/
|
|
5
|
+
userId: string;
|
|
6
|
+
/**
|
|
7
|
+
* Username пользователя в Zitadel
|
|
8
|
+
*/
|
|
9
|
+
username: string;
|
|
10
|
+
/**
|
|
11
|
+
* Nickname пользователя в Zitadel
|
|
12
|
+
*/
|
|
13
|
+
nickname: string;
|
|
14
|
+
/**
|
|
15
|
+
* E-mail пользователя
|
|
16
|
+
*/
|
|
17
|
+
email: string;
|
|
18
|
+
/**
|
|
19
|
+
* Логин пользователя
|
|
20
|
+
*/
|
|
21
|
+
loginName: string;
|
|
22
|
+
/**
|
|
23
|
+
* Имя пользователя
|
|
24
|
+
*/
|
|
25
|
+
givenName: string;
|
|
26
|
+
/**
|
|
27
|
+
* Фамилия пользователя
|
|
28
|
+
*/
|
|
29
|
+
familyName: string;
|
|
30
|
+
/**
|
|
31
|
+
* Отчество пользователя
|
|
32
|
+
*/
|
|
33
|
+
additionalName: string;
|
|
34
|
+
/**
|
|
35
|
+
* Имя пользователя в Zitadel
|
|
36
|
+
*/
|
|
37
|
+
displayName: string;
|
|
38
|
+
/**
|
|
39
|
+
* Дата создания пользователя
|
|
40
|
+
*/
|
|
41
|
+
createDate: Date;
|
|
42
|
+
/**
|
|
43
|
+
* Список доступных аватаров
|
|
44
|
+
*/
|
|
45
|
+
avatars: UserAvatars[];
|
|
46
|
+
}
|
|
47
|
+
export interface UserAvatars {
|
|
48
|
+
/**
|
|
49
|
+
* Название аватара
|
|
50
|
+
*/
|
|
51
|
+
name: string;
|
|
52
|
+
/**
|
|
53
|
+
* Параметр отвечает за выбор основного аватара
|
|
54
|
+
*/
|
|
55
|
+
isDefault: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Тэги аватара
|
|
58
|
+
*/
|
|
59
|
+
tags: string[];
|
|
60
|
+
}
|
|
61
|
+
export interface AuthCheckV1Response {
|
|
62
|
+
/**
|
|
63
|
+
* Параметр отвечает за валидность access-token
|
|
64
|
+
* - `true`: access-token валиден.
|
|
65
|
+
* - `false`: access-token не валиден.
|
|
66
|
+
*/
|
|
67
|
+
active: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Информация о пользователе. Данные доступны при `active: true`
|
|
70
|
+
*/
|
|
71
|
+
user?: Omit<UserDataV1, 'nickname' | 'username' | 'avatars'>;
|
|
72
|
+
/**
|
|
73
|
+
* Роли пользователя. Доступны при `active: true`
|
|
74
|
+
*/
|
|
75
|
+
roles?: string[];
|
|
76
|
+
}
|
|
77
|
+
export interface UserAvatarResponseV1 {
|
|
78
|
+
/**
|
|
79
|
+
* Ссылка на аватар пользователя
|
|
80
|
+
*/
|
|
81
|
+
url: string;
|
|
82
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-tool-v1.type.js","sourceRoot":"","sources":["../../../src/sso-tool-v1/types/sso-tool-v1.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { SsoToolAsyncModuleOptions } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Модуль Single Sign-On
|
|
5
|
+
*/
|
|
6
|
+
export declare class SsoToolModule {
|
|
7
|
+
/**
|
|
8
|
+
* Метод для настройки конфигурации модуля
|
|
9
|
+
*/
|
|
10
|
+
static forRootAsync({ inject, useFactory, }: SsoToolAsyncModuleOptions): Promise<DynamicModule>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var SsoToolModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SsoToolModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const constants_1 = require("./constants");
|
|
13
|
+
const guards_1 = require("./guards");
|
|
14
|
+
const sso_tool_v1_1 = require("./sso-tool-v1");
|
|
15
|
+
/**
|
|
16
|
+
* Модуль Single Sign-On
|
|
17
|
+
*/
|
|
18
|
+
let SsoToolModule = SsoToolModule_1 = class SsoToolModule {
|
|
19
|
+
/**
|
|
20
|
+
* Метод для настройки конфигурации модуля
|
|
21
|
+
*/
|
|
22
|
+
static async forRootAsync({ inject, useFactory, }) {
|
|
23
|
+
const SsoToolProvider = {
|
|
24
|
+
provide: constants_1.SSO_TOOL_DEFAULT_NAME,
|
|
25
|
+
inject: inject,
|
|
26
|
+
useFactory: useFactory,
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
module: SsoToolModule_1,
|
|
30
|
+
imports: [sso_tool_v1_1.SsoToolV1Module.registerProviders([SsoToolProvider])],
|
|
31
|
+
providers: [SsoToolProvider, guards_1.AuthGuard],
|
|
32
|
+
exports: [guards_1.AuthGuard, sso_tool_v1_1.SsoToolV1Module],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
exports.SsoToolModule = SsoToolModule;
|
|
37
|
+
exports.SsoToolModule = SsoToolModule = SsoToolModule_1 = __decorate([
|
|
38
|
+
(0, common_1.Global)(),
|
|
39
|
+
(0, common_1.Module)({})
|
|
40
|
+
], SsoToolModule);
|
|
41
|
+
//# sourceMappingURL=sso-tool.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-tool.module.js","sourceRoot":"","sources":["../src/sso-tool.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA8E;AAC9E,2CAAoD;AACpD,qCAAqC;AACrC,+CAAgD;AAGhD;;GAEG;AAGI,IAAM,aAAa,qBAAnB,MAAM,aAAa;IACzB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EACzB,MAAM,EACN,UAAU,GACiB;QAC3B,MAAM,eAAe,GAAa;YACjC,OAAO,EAAE,iCAAqB;YAC9B,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,UAAU;SACtB,CAAC;QACF,OAAO;YACN,MAAM,EAAE,eAAa;YACrB,OAAO,EAAE,CAAC,6BAAe,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YAC/D,SAAS,EAAE,CAAC,eAAe,EAAE,kBAAS,CAAC;YACvC,OAAO,EAAE,CAAC,kBAAS,EAAE,6BAAe,CAAC;SACrC,CAAC;IACH,CAAC;CACD,CAAA;AApBY,sCAAa;wBAAb,aAAa;IAFzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,aAAa,CAoBzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './sso-tool.type';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./sso-tool.type"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';
|
|
2
|
+
import { OptionalFactoryDependency } from '@nestjs/common/interfaces/modules/optional-factory-dependency.interface';
|
|
3
|
+
import { SsoApiVersion } from '../constants';
|
|
4
|
+
export interface SsoToolAsyncModuleOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Функция, возвращающая экземпляр Provider, который будет доступен внутри модуля.
|
|
7
|
+
*/
|
|
8
|
+
useFactory: (...args: any[]) => Promise<SsoToolOptions>;
|
|
9
|
+
/**
|
|
10
|
+
* Необязательный список поставщиков, которые будут использованы в контекст useFactory.
|
|
11
|
+
*/
|
|
12
|
+
inject?: Array<InjectionToken | OptionalFactoryDependency>;
|
|
13
|
+
}
|
|
14
|
+
export interface SsoToolOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Домен Single Sign-On
|
|
17
|
+
*/
|
|
18
|
+
domain: string;
|
|
19
|
+
/**
|
|
20
|
+
* Версия API Single Sign-On используемая в декораторах
|
|
21
|
+
*/
|
|
22
|
+
version: SsoApiVersion;
|
|
23
|
+
/**
|
|
24
|
+
* Id проекта в Single Sign-On
|
|
25
|
+
*/
|
|
26
|
+
projectId: string;
|
|
27
|
+
}
|
|
28
|
+
export interface SsoToolHeaders {
|
|
29
|
+
[key: string]: string;
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-tool.type.js","sourceRoot":"","sources":["../../src/types/sso-tool.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './service.util';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./service.util"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const handleResponse: <DataType>(response: Response, status?: number) => Promise<DataType>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleResponse = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const handleResponse = async (response, status = 200) => {
|
|
6
|
+
if (response.status !== status) {
|
|
7
|
+
const errorData = await response.json();
|
|
8
|
+
throw new common_1.HttpException(errorData, response.status);
|
|
9
|
+
}
|
|
10
|
+
return await response.json();
|
|
11
|
+
};
|
|
12
|
+
exports.handleResponse = handleResponse;
|
|
13
|
+
//# sourceMappingURL=service.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.util.js","sourceRoot":"","sources":["../../src/utils/service.util.ts"],"names":[],"mappings":";;;AAAA,2CAA+C;AAExC,MAAM,cAAc,GAAG,KAAK,EAClC,QAAkB,EAClB,MAAM,GAAG,GAAG,EACQ,EAAE;IACtB,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,sBAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC,CAAC;AATW,QAAA,cAAc,kBASzB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@echo-nova-404/sso-tool",
|
|
3
|
+
"version": "0.1.12-beta",
|
|
4
|
+
"description": "A library for authorization checks using SSO",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"readmeFilename": "README.md",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "nest build",
|
|
14
|
+
"start:dev": "nest start --watch",
|
|
15
|
+
"biome:format": "biome format .",
|
|
16
|
+
"biome:check": "biome check .",
|
|
17
|
+
"biome:lint": "biome lint .",
|
|
18
|
+
"biome:apply-formatting": "biome format --write . ; biome check --write . ; biome lint ."
|
|
19
|
+
},
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@nestjs/common": "^11.0.1",
|
|
25
|
+
"@nestjs/core": "^11.0.1",
|
|
26
|
+
"@nestjs/swagger": "^11.2.0"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@nch-nestjs/i18n-kit": "^0.1.1"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@biomejs/biome": "^2.3.11",
|
|
33
|
+
"@nestjs/cli": "^11.0.0",
|
|
34
|
+
"@nestjs/schematics": "^11.0.0",
|
|
35
|
+
"@types/node": "^24.10.1",
|
|
36
|
+
"globals": "^16.0.0",
|
|
37
|
+
"source-map-support": "^0.5.21",
|
|
38
|
+
"supertest": "^7.0.0",
|
|
39
|
+
"ts-loader": "^9.5.2",
|
|
40
|
+
"ts-node": "^10.9.2",
|
|
41
|
+
"tsconfig-paths": "^4.2.0",
|
|
42
|
+
"typescript": "^5.7.3"
|
|
43
|
+
}
|
|
44
|
+
}
|