@illustrisinteractive/sentinel-nest 0.0.1
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/.prettierrc +4 -0
- package/README.md +98 -0
- package/config/config.json +24 -0
- package/dist/bin/commit.d.ts +1 -0
- package/dist/bin/commit.js +136 -0
- package/dist/bin/commit.js.map +1 -0
- package/dist/bin/init.d.ts +2 -0
- package/dist/bin/init.js +179 -0
- package/dist/bin/init.js.map +1 -0
- package/dist/bin/migrations/1-create-permission.d.ts +6 -0
- package/dist/bin/migrations/1-create-permission.js +30 -0
- package/dist/bin/migrations/1-create-permission.js.map +1 -0
- package/dist/bin/migrations/2-create-role.d.ts +2 -0
- package/dist/bin/migrations/2-create-role.js +29 -0
- package/dist/bin/migrations/2-create-role.js.map +1 -0
- package/dist/bin/migrations/3-create-rolepermissions.d.ts +2 -0
- package/dist/bin/migrations/3-create-rolepermissions.js +46 -0
- package/dist/bin/migrations/3-create-rolepermissions.js.map +1 -0
- package/dist/bin/migrations/4-create-model-roles.d.ts +2 -0
- package/dist/bin/migrations/4-create-model-roles.js +46 -0
- package/dist/bin/migrations/4-create-model-roles.js.map +1 -0
- package/dist/bin/resource.d.ts +1 -0
- package/dist/bin/resource.js +91 -0
- package/dist/bin/resource.js.map +1 -0
- package/dist/bin/sentinel.d.ts +2 -0
- package/dist/bin/sentinel.js +52 -0
- package/dist/bin/sentinel.js.map +1 -0
- package/dist/models/SecuredResource.d.ts +8 -0
- package/dist/models/SecuredResource.js +9 -0
- package/dist/models/SecuredResource.js.map +1 -0
- package/dist/models/SentinelConfig.d.ts +7 -0
- package/dist/models/SentinelConfig.js +3 -0
- package/dist/models/SentinelConfig.js.map +1 -0
- package/dist/models/sequelize/PermissionKey.d.ts +7 -0
- package/dist/models/sequelize/PermissionKey.js +39 -0
- package/dist/models/sequelize/PermissionKey.js.map +1 -0
- package/dist/prisma.config.d.ts +3 -0
- package/dist/prisma.config.js +14 -0
- package/dist/prisma.config.js.map +1 -0
- package/dist/src/can.decorator.d.ts +2 -0
- package/dist/src/can.decorator.js +6 -0
- package/dist/src/can.decorator.js.map +1 -0
- package/dist/src/generated/prisma/browser.d.ts +10 -0
- package/dist/src/generated/prisma/browser.js +44 -0
- package/dist/src/generated/prisma/browser.js.map +1 -0
- package/dist/src/generated/prisma/client.d.ts +14 -0
- package/dist/src/generated/prisma/client.js +46 -0
- package/dist/src/generated/prisma/client.js.map +1 -0
- package/dist/src/generated/prisma/commonInputTypes.d.ts +263 -0
- package/dist/src/generated/prisma/commonInputTypes.js +3 -0
- package/dist/src/generated/prisma/commonInputTypes.js.map +1 -0
- package/dist/src/generated/prisma/enums.d.ts +1 -0
- package/dist/src/generated/prisma/enums.js +3 -0
- package/dist/src/generated/prisma/enums.js.map +1 -0
- package/dist/src/generated/prisma/internal/class.d.ts +50 -0
- package/dist/src/generated/prisma/internal/class.js +75 -0
- package/dist/src/generated/prisma/internal/class.js.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.d.ts +778 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.js +128 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.js.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.d.ts +88 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js +112 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/src/generated/prisma/models/ModelHasRoles.d.ts +691 -0
- package/dist/src/generated/prisma/models/ModelHasRoles.js +3 -0
- package/dist/src/generated/prisma/models/ModelHasRoles.js.map +1 -0
- package/dist/src/generated/prisma/models/PermissionKeys.d.ts +547 -0
- package/dist/src/generated/prisma/models/PermissionKeys.js +3 -0
- package/dist/src/generated/prisma/models/PermissionKeys.js.map +1 -0
- package/dist/src/generated/prisma/models/RoleHasPermissions.d.ts +675 -0
- package/dist/src/generated/prisma/models/RoleHasPermissions.js +3 -0
- package/dist/src/generated/prisma/models/RoleHasPermissions.js.map +1 -0
- package/dist/src/generated/prisma/models/Roles.d.ts +582 -0
- package/dist/src/generated/prisma/models/Roles.js +3 -0
- package/dist/src/generated/prisma/models/Roles.js.map +1 -0
- package/dist/src/generated/prisma/models/SequelizeMeta.d.ts +289 -0
- package/dist/src/generated/prisma/models/SequelizeMeta.js +3 -0
- package/dist/src/generated/prisma/models/SequelizeMeta.js.map +1 -0
- package/dist/src/generated/prisma/models/Users.d.ts +572 -0
- package/dist/src/generated/prisma/models/Users.js +3 -0
- package/dist/src/generated/prisma/models/Users.js.map +1 -0
- package/dist/src/generated/prisma/models.d.ts +7 -0
- package/dist/src/generated/prisma/models.js +3 -0
- package/dist/src/generated/prisma/models.js.map +1 -0
- package/dist/src/main.d.ts +6 -0
- package/dist/src/main.js +23 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/models/SecuredResource.d.ts +8 -0
- package/dist/src/models/SecuredResource.js +9 -0
- package/dist/src/models/SecuredResource.js.map +1 -0
- package/dist/src/models/SentinelConfig.d.ts +7 -0
- package/dist/src/models/SentinelConfig.js +3 -0
- package/dist/src/models/SentinelConfig.js.map +1 -0
- package/dist/src/models/SentinelModel.d.ts +35 -0
- package/dist/src/models/SentinelModel.js +3 -0
- package/dist/src/models/SentinelModel.js.map +1 -0
- package/dist/src/models/SentinelModuleOptions.d.ts +7 -0
- package/dist/src/models/SentinelModuleOptions.js +3 -0
- package/dist/src/models/SentinelModuleOptions.js.map +1 -0
- package/dist/src/prisma.service.d.ts +4 -0
- package/dist/src/prisma.service.js +29 -0
- package/dist/src/prisma.service.js.map +1 -0
- package/dist/src/sentinel.guard.d.ts +9 -0
- package/dist/src/sentinel.guard.js +73 -0
- package/dist/src/sentinel.guard.js.map +1 -0
- package/dist/src/sentinel.module-definition.d.ts +2 -0
- package/dist/src/sentinel.module-definition.js +7 -0
- package/dist/src/sentinel.module-definition.js.map +1 -0
- package/dist/src/sentinel.module.d.ts +3 -0
- package/dist/src/sentinel.module.js +40 -0
- package/dist/src/sentinel.module.js.map +1 -0
- package/dist/src/sentinel.service.d.ts +39 -0
- package/dist/src/sentinel.service.js +146 -0
- package/dist/src/sentinel.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/eslint.config.mjs +34 -0
- package/models/index.js +43 -0
- package/models/permissionkey.js +31 -0
- package/models/role.js +23 -0
- package/models/rolehaspermission.js +43 -0
- package/nest-cli.json +8 -0
- package/package.json +103 -0
- package/prisma/migrations/20260227023704_init/migration.sql +74 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +62 -0
- package/prisma.config.ts +14 -0
- package/src/bin/commit.ts +186 -0
- package/src/bin/init.ts +251 -0
- package/src/bin/migrations/1-create-permission.js +32 -0
- package/src/bin/migrations/2-create-role.js +29 -0
- package/src/bin/migrations/3-create-rolepermissions.js +46 -0
- package/src/bin/migrations/4-create-model-roles.js +46 -0
- package/src/bin/resource.ts +107 -0
- package/src/bin/sentinel.ts +115 -0
- package/src/bin/tsconfig.json +30 -0
- package/src/can.decorator.ts +4 -0
- package/src/generated/prisma/browser.ts +49 -0
- package/src/generated/prisma/client.ts +69 -0
- package/src/generated/prisma/commonInputTypes.ts +302 -0
- package/src/generated/prisma/enums.ts +15 -0
- package/src/generated/prisma/internal/class.ts +250 -0
- package/src/generated/prisma/internal/prismaNamespace.ts +1213 -0
- package/src/generated/prisma/internal/prismaNamespaceBrowser.ts +163 -0
- package/src/generated/prisma/models/ModelHasRoles.ts +1521 -0
- package/src/generated/prisma/models/PermissionKeys.ts +1362 -0
- package/src/generated/prisma/models/RoleHasPermissions.ts +1503 -0
- package/src/generated/prisma/models/Roles.ts +1437 -0
- package/src/generated/prisma/models/SequelizeMeta.ts +1032 -0
- package/src/generated/prisma/models/Users.ts +1402 -0
- package/src/generated/prisma/models.ts +17 -0
- package/src/main.ts +24 -0
- package/src/models/SecuredResource.d.ts +8 -0
- package/src/models/SecuredResource.ts +9 -0
- package/src/models/SentinelConfig.d.ts +7 -0
- package/src/models/SentinelConfig.ts +8 -0
- package/src/models/SentinelModel.ts +39 -0
- package/src/models/SentinelModuleOptions.ts +11 -0
- package/src/models/sequelize/PermissionKey.ts +22 -0
- package/src/models/tsconfig.json +25 -0
- package/src/prisma.service.ts +13 -0
- package/src/sentinel.guard.ts +63 -0
- package/src/sentinel.module-definition.ts +5 -0
- package/src/sentinel.module.ts +27 -0
- package/src/sentinel.service.ts +188 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +25 -0
package/.prettierrc
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="120" alt="Nest Logo" /></a>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
|
|
6
|
+
[circleci-url]: https://circleci.com/gh/nestjs/nest
|
|
7
|
+
|
|
8
|
+
<p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a>
|
|
11
|
+
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
|
|
12
|
+
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
|
|
13
|
+
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
|
|
14
|
+
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
|
|
15
|
+
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
|
|
16
|
+
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
|
|
17
|
+
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg" alt="Donate us"/></a>
|
|
18
|
+
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
|
|
19
|
+
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow" alt="Follow us on Twitter"></a>
|
|
20
|
+
</p>
|
|
21
|
+
<!--[](https://opencollective.com/nest#backer)
|
|
22
|
+
[](https://opencollective.com/nest#sponsor)-->
|
|
23
|
+
|
|
24
|
+
## Description
|
|
25
|
+
|
|
26
|
+
[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.
|
|
27
|
+
|
|
28
|
+
## Project setup
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
$ npm install
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Compile and run the project
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# development
|
|
38
|
+
$ npm run start
|
|
39
|
+
|
|
40
|
+
# watch mode
|
|
41
|
+
$ npm run start:dev
|
|
42
|
+
|
|
43
|
+
# production mode
|
|
44
|
+
$ npm run start:prod
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Run tests
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# unit tests
|
|
51
|
+
$ npm run test
|
|
52
|
+
|
|
53
|
+
# e2e tests
|
|
54
|
+
$ npm run test:e2e
|
|
55
|
+
|
|
56
|
+
# test coverage
|
|
57
|
+
$ npm run test:cov
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Deployment
|
|
61
|
+
|
|
62
|
+
When you're ready to deploy your NestJS application to production, there are some key steps you can take to ensure it runs as efficiently as possible. Check out the [deployment documentation](https://docs.nestjs.com/deployment) for more information.
|
|
63
|
+
|
|
64
|
+
If you are looking for a cloud-based platform to deploy your NestJS application, check out [Mau](https://mau.nestjs.com), our official platform for deploying NestJS applications on AWS. Mau makes deployment straightforward and fast, requiring just a few simple steps:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
$ npm install -g @nestjs/mau
|
|
68
|
+
$ mau deploy
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
With Mau, you can deploy your application in just a few clicks, allowing you to focus on building features rather than managing infrastructure.
|
|
72
|
+
|
|
73
|
+
## Resources
|
|
74
|
+
|
|
75
|
+
Check out a few resources that may come in handy when working with NestJS:
|
|
76
|
+
|
|
77
|
+
- Visit the [NestJS Documentation](https://docs.nestjs.com) to learn more about the framework.
|
|
78
|
+
- For questions and support, please visit our [Discord channel](https://discord.gg/G7Qnnhy).
|
|
79
|
+
- To dive deeper and get more hands-on experience, check out our official video [courses](https://courses.nestjs.com/).
|
|
80
|
+
- Deploy your application to AWS with the help of [NestJS Mau](https://mau.nestjs.com) in just a few clicks.
|
|
81
|
+
- Visualize your application graph and interact with the NestJS application in real-time using [NestJS Devtools](https://devtools.nestjs.com).
|
|
82
|
+
- Need help with your project (part-time to full-time)? Check out our official [enterprise support](https://enterprise.nestjs.com).
|
|
83
|
+
- To stay in the loop and get updates, follow us on [X](https://x.com/nestframework) and [LinkedIn](https://linkedin.com/company/nestjs).
|
|
84
|
+
- Looking for a job, or have a job to offer? Check out our official [Jobs board](https://jobs.nestjs.com).
|
|
85
|
+
|
|
86
|
+
## Support
|
|
87
|
+
|
|
88
|
+
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).
|
|
89
|
+
|
|
90
|
+
## Stay in touch
|
|
91
|
+
|
|
92
|
+
- Author - [Kamil Myśliwiec](https://twitter.com/kammysliwiec)
|
|
93
|
+
- Website - [https://nestjs.com](https://nestjs.com/)
|
|
94
|
+
- Twitter - [@nestframework](https://twitter.com/nestframework)
|
|
95
|
+
|
|
96
|
+
## License
|
|
97
|
+
|
|
98
|
+
Nest is [MIT licensed](https://github.com/nestjs/nest/blob/master/LICENSE).
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"development": {
|
|
3
|
+
"username": "postgres",
|
|
4
|
+
"password": "root",
|
|
5
|
+
"database": "pmo",
|
|
6
|
+
"host": "127.0.0.1",
|
|
7
|
+
"dialect": "postgres",
|
|
8
|
+
"port": 5433
|
|
9
|
+
},
|
|
10
|
+
"test": {
|
|
11
|
+
"username": "root",
|
|
12
|
+
"password": null,
|
|
13
|
+
"database": "database_test",
|
|
14
|
+
"host": "127.0.0.1",
|
|
15
|
+
"dialect": "mysql"
|
|
16
|
+
},
|
|
17
|
+
"production": {
|
|
18
|
+
"username": "root",
|
|
19
|
+
"password": null,
|
|
20
|
+
"database": "database_production",
|
|
21
|
+
"host": "127.0.0.1",
|
|
22
|
+
"dialect": "mysql"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const commit: (envFrom: string, skipPrompts?: boolean) => Promise<void>;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.commit = void 0;
|
|
7
|
+
const prompts_1 = require("@clack/prompts");
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const process_1 = require("process");
|
|
12
|
+
const sequelize_typescript_1 = require("sequelize-typescript");
|
|
13
|
+
const PermissionKey_1 = require("../models/sequelize/PermissionKey");
|
|
14
|
+
const commit = async (envFrom, skipPrompts = false) => {
|
|
15
|
+
(0, prompts_1.intro)('Sentinel CLI');
|
|
16
|
+
prompts_1.log.info('Commit - Prepare your Secured Resources for persistence.');
|
|
17
|
+
if (envFrom) {
|
|
18
|
+
try {
|
|
19
|
+
process.loadEnvFile(envFrom);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
prompts_1.log.error(`Sentinel CLI failed to commit your Secured Resources during ENV file loading. ${error}`);
|
|
23
|
+
(0, process_1.exit)(-1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (!fs_1.default.existsSync(process.cwd() + '\\src\\sentinel\\sentinel.config.json')) {
|
|
27
|
+
prompts_1.log.error(`"sentinel.config.json" was not found in (${process.cwd() + '\\src\\sentinel'}). Have you initialized Sentinel using "npx sentinel init"?`);
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
await import('file://' + process.cwd() + '\\src\\sentinel\\sentinel.config.json', {
|
|
31
|
+
with: { type: 'json' },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.log(error);
|
|
36
|
+
(0, process_1.exit)(-1);
|
|
37
|
+
}
|
|
38
|
+
if (!fs_1.default.existsSync('src\\sentinel\\resources')) {
|
|
39
|
+
prompts_1.log.error(`Resources folder not found in ${process.cwd() + '\\src\\sentinel\\resources'}. Have you created any Secured Resources with "npx sentinel resource <name>"?`);
|
|
40
|
+
}
|
|
41
|
+
await new Promise((resolve) => {
|
|
42
|
+
(0, child_process_1.exec)(`tsc -p ${'src\\sentinel\\resources'}\\tsconfig.json`, () => {
|
|
43
|
+
resolve(undefined);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
const compilePath = process.cwd() + `${'\\src\\sentinel\\resources'}\\.sentinel`;
|
|
47
|
+
const resourcesToImport = fs_1.default
|
|
48
|
+
.readdirSync(compilePath)
|
|
49
|
+
.filter((file) => path_1.default.extname(file) == '.js');
|
|
50
|
+
prompts_1.log.info(`Found ${resourcesToImport.length} files in Secured Resources directory.`);
|
|
51
|
+
const resources = [];
|
|
52
|
+
const promises = [];
|
|
53
|
+
resourcesToImport.forEach((_res) => {
|
|
54
|
+
promises.push(new Promise(async (resolve) => {
|
|
55
|
+
const res = (await import(`file://${compilePath}/${_res}`)).default[_res.split('.')[0]];
|
|
56
|
+
resources.push(res);
|
|
57
|
+
resolve(undefined);
|
|
58
|
+
}));
|
|
59
|
+
});
|
|
60
|
+
await Promise.all(promises);
|
|
61
|
+
prompts_1.log.info('Secured Resources Graph');
|
|
62
|
+
resources.forEach((res) => {
|
|
63
|
+
prompts_1.log.step(res.name);
|
|
64
|
+
let message = '';
|
|
65
|
+
if (res.actions) {
|
|
66
|
+
Object.keys(res.actions).forEach((_key) => {
|
|
67
|
+
const action = res.actions[_key];
|
|
68
|
+
message += `-> ${_key} - ${action.description || 'No description.'}\n`;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
prompts_1.log.message(message);
|
|
72
|
+
});
|
|
73
|
+
if (!skipPrompts) {
|
|
74
|
+
const ok = await (0, prompts_1.confirm)({
|
|
75
|
+
message: `Are you sure you want to commit ${resources.length} Secured Resources to your database? Please review the graph above if all Actions were successfully read.`,
|
|
76
|
+
});
|
|
77
|
+
if (!ok) {
|
|
78
|
+
prompts_1.log.error('Commit was cancelled.');
|
|
79
|
+
(0, process_1.exit)(-1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const opts = {
|
|
84
|
+
SENTINEL_DB_HOST: process.env.SENTINEL_DB_HOST,
|
|
85
|
+
SENTINEL_DB_USER: process.env.SENTINEL_DB_USER,
|
|
86
|
+
SENTINEL_DB_PASS: process.env.SENTINEL_DB_PASS,
|
|
87
|
+
SENTINEL_DB_PORT: process.env.SENTINEL_DB_PORT,
|
|
88
|
+
SENTINEL_DB_DATABASE: process.env.SENTINEL_DB_DATABASE,
|
|
89
|
+
};
|
|
90
|
+
const missingOpts = Object.keys(opts).filter((key) => {
|
|
91
|
+
return opts[key] === undefined;
|
|
92
|
+
});
|
|
93
|
+
if (missingOpts.length != 0) {
|
|
94
|
+
prompts_1.log.error(`Sentinel CLI failed to commit your Secured Resources due to missing environment variables: ${missingOpts}.`);
|
|
95
|
+
prompts_1.log.message('If these variables are defined in a file, run `npx sentinel init --env-from="<path>"` instead.');
|
|
96
|
+
(0, process_1.exit)(-1);
|
|
97
|
+
}
|
|
98
|
+
const sequelize = new sequelize_typescript_1.Sequelize({
|
|
99
|
+
dialect: 'postgres',
|
|
100
|
+
host: opts.SENTINEL_DB_HOST,
|
|
101
|
+
username: opts.SENTINEL_DB_USER,
|
|
102
|
+
password: opts.SENTINEL_DB_PASS,
|
|
103
|
+
port: opts.SENTINEL_DB_PORT,
|
|
104
|
+
database: opts.SENTINEL_DB_DATABASE,
|
|
105
|
+
models: [PermissionKey_1.PermissionKey],
|
|
106
|
+
});
|
|
107
|
+
try {
|
|
108
|
+
await sequelize.authenticate();
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.log(error);
|
|
112
|
+
prompts_1.log.error('Sentinel CLI cannot connect to your database. Initialization failed.');
|
|
113
|
+
(0, process_1.exit)(-1);
|
|
114
|
+
}
|
|
115
|
+
prompts_1.log.success('Successfully connected to your database.');
|
|
116
|
+
const keysToSeed = [];
|
|
117
|
+
for (const res of resources) {
|
|
118
|
+
Object.keys(res.actions).forEach((_key) => {
|
|
119
|
+
const action = res.actions[_key];
|
|
120
|
+
keysToSeed.push(PermissionKey_1.PermissionKey.upsert({
|
|
121
|
+
id: `${res.name.toLowerCase()}.${_key.toLowerCase()}`,
|
|
122
|
+
resource: res.name,
|
|
123
|
+
action: _key,
|
|
124
|
+
description: action.description || '',
|
|
125
|
+
})[0]);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
await Promise.all(keysToSeed);
|
|
129
|
+
prompts_1.log.success('Successfully commited all Secured Resources and their actions');
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.log(error);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
exports.commit = commit;
|
|
136
|
+
//# sourceMappingURL=commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/bin/commit.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/init.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.init = void 0;
|
|
8
|
+
const prompts_1 = require("@clack/prompts");
|
|
9
|
+
const process_1 = require("process");
|
|
10
|
+
const sequelize_1 = require("sequelize");
|
|
11
|
+
const umzug_1 = require("umzug");
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const init = async (modelTable, modelKey, nxReadFrom, env_file, skip = false, verbose = false) => {
|
|
14
|
+
(0, prompts_1.intro)('Sentinel CLI');
|
|
15
|
+
prompts_1.log.info('Initialize - Preparing your Nest.js project for Sentinel');
|
|
16
|
+
let nestConfig = undefined;
|
|
17
|
+
const tsconfig = {
|
|
18
|
+
compilerOptions: {
|
|
19
|
+
module: 'nodenext',
|
|
20
|
+
moduleResolution: 'nodenext',
|
|
21
|
+
resolvePackageJsonExports: true,
|
|
22
|
+
esModuleInterop: true,
|
|
23
|
+
isolatedModules: true,
|
|
24
|
+
declaration: true,
|
|
25
|
+
removeComments: true,
|
|
26
|
+
emitDecoratorMetadata: true,
|
|
27
|
+
experimentalDecorators: true,
|
|
28
|
+
allowSyntheticDefaultImports: true,
|
|
29
|
+
target: 'ES2023',
|
|
30
|
+
sourceMap: true,
|
|
31
|
+
outDir: '.sentinel/',
|
|
32
|
+
baseUrl: './',
|
|
33
|
+
incremental: true,
|
|
34
|
+
skipLibCheck: true,
|
|
35
|
+
strictNullChecks: true,
|
|
36
|
+
forceConsistentCasingInFileNames: true,
|
|
37
|
+
noImplicitAny: false,
|
|
38
|
+
strictBindCallApply: false,
|
|
39
|
+
noFallthroughCasesInSwitch: false,
|
|
40
|
+
allowJs: true,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
if (nxReadFrom) {
|
|
44
|
+
prompts_1.log.info('--nx-read-from flag specified. Sentinel CLI will try to detect all Nest projects in the provided path and generate a "nest-cli.json" file.');
|
|
45
|
+
const newNestConfig = {
|
|
46
|
+
projects: {},
|
|
47
|
+
monorepo: true,
|
|
48
|
+
};
|
|
49
|
+
const nxPath = process.cwd() + '\\' + nxReadFrom;
|
|
50
|
+
if (!fs_1.default.existsSync(nxPath)) {
|
|
51
|
+
prompts_1.log.error(`The path specified in --nx-read-from (${nxPath}) does not exist.`);
|
|
52
|
+
(0, process_1.exit)(-1);
|
|
53
|
+
}
|
|
54
|
+
const dirs = fs_1.default.readdirSync(nxPath);
|
|
55
|
+
dirs.forEach((dir) => {
|
|
56
|
+
if (fs_1.default.existsSync(nxPath + '\\' + dir + '\\project.json')) {
|
|
57
|
+
prompts_1.log.step(`Project detected in ${nxPath + '\\' + dir}. Assuming as Nest project with name (${dir})`);
|
|
58
|
+
newNestConfig.projects[dir] = {
|
|
59
|
+
root: `${nxReadFrom}/${dir}`,
|
|
60
|
+
sourceRoot: `${nxReadFrom}/${dir}/src`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
fs_1.default.writeFileSync(process.cwd() + '/nest-cli.json', JSON.stringify(newNestConfig, null, 2));
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
nestConfig = (await import('file://' + process.cwd() + '\\nest-cli.json', {
|
|
68
|
+
with: { type: 'json' },
|
|
69
|
+
})).default;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
prompts_1.log.warn(`Your project's "nest-cli.json" file was not found in the current working directory in ${process.cwd()}. Sentinel CLI will now treat your project as an Nx monorepo.`);
|
|
73
|
+
(0, process_1.exit)(-1);
|
|
74
|
+
}
|
|
75
|
+
if (env_file) {
|
|
76
|
+
try {
|
|
77
|
+
process.loadEnvFile(env_file);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
prompts_1.log.error(`Sentinel CLI failed to initialize Sentinel during ENV file loading. ${error}`);
|
|
81
|
+
(0, process_1.exit)(-1);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (skip) {
|
|
85
|
+
prompts_1.log.warn("Sentinel CLI will not execute the migrations to create the tables required by Sentinel within your database. Make sure that you're doing this for good reason.");
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
try {
|
|
89
|
+
process.env.SENTINEL_MODEL_REFERENCE_TABLE = modelTable;
|
|
90
|
+
process.env.SENTINEL_MODEL_REFERENCE_KEY = modelKey;
|
|
91
|
+
const opts = {
|
|
92
|
+
SENTINEL_DB_HOST: process.env.SENTINEL_DB_HOST,
|
|
93
|
+
SENTINEL_DB_USER: process.env.SENTINEL_DB_USER,
|
|
94
|
+
SENTINEL_DB_PASS: process.env.SENTINEL_DB_PASS,
|
|
95
|
+
SENTINEL_DB_PORT: process.env.SENTINEL_DB_PORT,
|
|
96
|
+
SENTINEL_DB_DATABASE: process.env.SENTINEL_DB_DATABASE,
|
|
97
|
+
};
|
|
98
|
+
const missingOpts = Object.keys(opts).filter((key) => {
|
|
99
|
+
return opts[key] === undefined;
|
|
100
|
+
});
|
|
101
|
+
if (missingOpts.length != 0) {
|
|
102
|
+
prompts_1.log.error(`Sentinel CLI failed to initialize Sentinel due to missing environment variables: ${missingOpts}.`);
|
|
103
|
+
prompts_1.log.message('If these variables are defined in a file, run \`npx sentinel init --env-from="<path>"\` instead.');
|
|
104
|
+
(0, process_1.exit)(-1);
|
|
105
|
+
}
|
|
106
|
+
const sequelize = new sequelize_1.Sequelize({
|
|
107
|
+
dialect: 'postgres',
|
|
108
|
+
host: opts.SENTINEL_DB_HOST,
|
|
109
|
+
username: opts.SENTINEL_DB_USER,
|
|
110
|
+
password: opts.SENTINEL_DB_PASS,
|
|
111
|
+
port: opts.SENTINEL_DB_PORT,
|
|
112
|
+
database: opts.SENTINEL_DB_DATABASE,
|
|
113
|
+
});
|
|
114
|
+
try {
|
|
115
|
+
await sequelize.authenticate();
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
prompts_1.log.error('Sentinel CLI cannot connect to your database. Initialization failed.');
|
|
119
|
+
(0, process_1.exit)(-1);
|
|
120
|
+
}
|
|
121
|
+
prompts_1.log.success('Successfully connected to your database.');
|
|
122
|
+
const umzug = new umzug_1.Umzug({
|
|
123
|
+
migrations: {
|
|
124
|
+
glob: ['migrations/*.js', { cwd: __dirname }],
|
|
125
|
+
},
|
|
126
|
+
context: sequelize.getQueryInterface(),
|
|
127
|
+
storage: new umzug_1.SequelizeStorage({ sequelize }),
|
|
128
|
+
logger: verbose ? console : undefined,
|
|
129
|
+
});
|
|
130
|
+
await umzug.up();
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.log(error);
|
|
134
|
+
}
|
|
135
|
+
prompts_1.log.success('Successfully ran all migrations.');
|
|
136
|
+
}
|
|
137
|
+
let selectedProject = {
|
|
138
|
+
name: 'default',
|
|
139
|
+
sourceRoot: 'src',
|
|
140
|
+
sentinelConfigPath: 'src\\sentinel',
|
|
141
|
+
};
|
|
142
|
+
if (nestConfig.monorepo || nestConfig.projects) {
|
|
143
|
+
prompts_1.log.info('Monorepo Nest.js project detected. You will be prompted to select which Application to install Sentinel in.');
|
|
144
|
+
selectedProject = (await (0, prompts_1.select)({
|
|
145
|
+
message: 'Select which Application to configure Sentinel for:',
|
|
146
|
+
options: Object.keys(nestConfig.projects).map((app) => ({
|
|
147
|
+
label: app,
|
|
148
|
+
value: {
|
|
149
|
+
name: app,
|
|
150
|
+
sourceRoot: nestConfig.projects[app].sourceRoot,
|
|
151
|
+
sentinelConfigPath: nestConfig.projects[app].sourceRoot + '\\sentinel',
|
|
152
|
+
},
|
|
153
|
+
})),
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
prompts_1.log.info('Standalone Nest.js project detected. Default Application defined in your "main.ts" file will be used.');
|
|
158
|
+
}
|
|
159
|
+
prompts_1.log.info(`Sentinel CLI will configure Sentinel for application "${selectedProject.name}" in (${selectedProject.sourceRoot})`);
|
|
160
|
+
try {
|
|
161
|
+
fs_1.default.mkdirSync(selectedProject.sentinelConfigPath + '/resources', {
|
|
162
|
+
recursive: true,
|
|
163
|
+
});
|
|
164
|
+
fs_1.default.writeFileSync(selectedProject.sentinelConfigPath + '/sentinel.config.json', JSON.stringify(selectedProject, null, 2));
|
|
165
|
+
fs_1.default.writeFileSync(selectedProject.sentinelConfigPath + '/resources/tsconfig.json', JSON.stringify(tsconfig, null, 2));
|
|
166
|
+
prompts_1.log.success(`Sentinel Configuration file has been created in ${selectedProject.sentinelConfigPath + '/sentinel.config.json'}`);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
console.log(err);
|
|
170
|
+
prompts_1.log.error(err);
|
|
171
|
+
(0, process_1.exit)(-1);
|
|
172
|
+
}
|
|
173
|
+
prompts_1.log.success('Next Steps');
|
|
174
|
+
prompts_1.log.message(`You may now run${nestConfig.projects ? ` "cd apps/${selectedProject.name}" then ` : ' '}"npx sentinel resource <name>" to create a Secured Resource.`);
|
|
175
|
+
prompts_1.log.message('Afterwards, edit the generated file with your own list of Actions');
|
|
176
|
+
prompts_1.log.message("When you're ready, run `npx sentinel commit` to commit all of your Secured Resources to the database.");
|
|
177
|
+
};
|
|
178
|
+
exports.init = init;
|
|
179
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/bin/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { Sequelize } = require('sequelize');
|
|
3
|
+
async function up({ context: queryInterface }) {
|
|
4
|
+
await queryInterface.createTable('PermissionKeys', {
|
|
5
|
+
id: {
|
|
6
|
+
allowNull: false,
|
|
7
|
+
primaryKey: true,
|
|
8
|
+
type: Sequelize.STRING,
|
|
9
|
+
},
|
|
10
|
+
resource: {
|
|
11
|
+
type: Sequelize.STRING,
|
|
12
|
+
},
|
|
13
|
+
action: {
|
|
14
|
+
type: Sequelize.STRING,
|
|
15
|
+
},
|
|
16
|
+
createdAt: {
|
|
17
|
+
allowNull: false,
|
|
18
|
+
type: Sequelize.DATE,
|
|
19
|
+
},
|
|
20
|
+
updatedAt: {
|
|
21
|
+
allowNull: false,
|
|
22
|
+
type: Sequelize.DATE,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async function down({ context: queryInterface }) {
|
|
27
|
+
await queryInterface.dropTable('PermissionKeys');
|
|
28
|
+
}
|
|
29
|
+
module.exports = { up, down };
|
|
30
|
+
//# sourceMappingURL=1-create-permission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1-create-permission.js","sourceRoot":"","sources":["../../../src/bin/migrations/1-create-permission.js"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAE3C,KAAK,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE;IAC3C,MAAM,cAAc,CAAC,WAAW,CAAC,gBAAgB,EAAE;QACjD,EAAE,EAAE;YACF,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,SAAS,CAAC,MAAM;SACvB;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,SAAS,CAAC,MAAM;SACvB;QACD,MAAM,EAAE;YACN,IAAI,EAAE,SAAS,CAAC,MAAM;SACvB;QACD,SAAS,EAAE;YACT,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE,SAAS,CAAC,IAAI;SACrB;QACD,SAAS,EAAE;YACT,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE,SAAS,CAAC,IAAI;SACrB;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE;IAC7C,MAAM,cAAc,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { Sequelize } = require('sequelize');
|
|
3
|
+
module.exports = {
|
|
4
|
+
async up({ context: queryInterface }) {
|
|
5
|
+
await queryInterface.createTable('Roles', {
|
|
6
|
+
id: {
|
|
7
|
+
allowNull: false,
|
|
8
|
+
autoIncrement: true,
|
|
9
|
+
primaryKey: true,
|
|
10
|
+
type: Sequelize.INTEGER,
|
|
11
|
+
},
|
|
12
|
+
name: {
|
|
13
|
+
type: Sequelize.STRING,
|
|
14
|
+
},
|
|
15
|
+
createdAt: {
|
|
16
|
+
allowNull: false,
|
|
17
|
+
type: Sequelize.DATE,
|
|
18
|
+
},
|
|
19
|
+
updatedAt: {
|
|
20
|
+
allowNull: false,
|
|
21
|
+
type: Sequelize.DATE,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
async down({ context: queryInterface }) {
|
|
26
|
+
await queryInterface.dropTable('Roles');
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=2-create-role.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"2-create-role.js","sourceRoot":"","sources":["../../../src/bin/migrations/2-create-role.js"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAE3C,MAAM,CAAC,OAAO,GAAG;IACf,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE;QAClC,MAAM,cAAc,CAAC,WAAW,CAAC,OAAO,EAAE;YACxC,EAAE,EAAE;gBACF,SAAS,EAAE,KAAK;gBAChB,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,SAAS,CAAC,OAAO;aACxB;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,SAAS,CAAC,MAAM;aACvB;YACD,SAAS,EAAE;gBACT,SAAS,EAAE,KAAK;gBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB;YACD,SAAS,EAAE;gBACT,SAAS,EAAE,KAAK;gBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB;SACF,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE;QACpC,MAAM,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { Sequelize } = require('sequelize');
|
|
3
|
+
module.exports = {
|
|
4
|
+
async up({ context: queryInterface }) {
|
|
5
|
+
await queryInterface.createTable('RoleHasPermissions', {
|
|
6
|
+
id: {
|
|
7
|
+
allowNull: false,
|
|
8
|
+
autoIncrement: true,
|
|
9
|
+
primaryKey: true,
|
|
10
|
+
type: Sequelize.INTEGER,
|
|
11
|
+
},
|
|
12
|
+
role: {
|
|
13
|
+
type: Sequelize.INTEGER,
|
|
14
|
+
references: {
|
|
15
|
+
model: {
|
|
16
|
+
tableName: 'Roles',
|
|
17
|
+
},
|
|
18
|
+
key: 'id',
|
|
19
|
+
},
|
|
20
|
+
allowNull: false,
|
|
21
|
+
},
|
|
22
|
+
permission: {
|
|
23
|
+
type: Sequelize.STRING,
|
|
24
|
+
references: {
|
|
25
|
+
model: {
|
|
26
|
+
tableName: 'PermissionKeys',
|
|
27
|
+
},
|
|
28
|
+
key: 'id',
|
|
29
|
+
},
|
|
30
|
+
allowNull: false,
|
|
31
|
+
},
|
|
32
|
+
createdAt: {
|
|
33
|
+
allowNull: false,
|
|
34
|
+
type: Sequelize.DATE,
|
|
35
|
+
},
|
|
36
|
+
updatedAt: {
|
|
37
|
+
allowNull: false,
|
|
38
|
+
type: Sequelize.DATE,
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
async down({ context: queryInterface }) {
|
|
43
|
+
await queryInterface.dropTable('RoleHasPermissions');
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=3-create-rolepermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"3-create-rolepermissions.js","sourceRoot":"","sources":["../../../src/bin/migrations/3-create-rolepermissions.js"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAE3C,MAAM,CAAC,OAAO,GAAG;IACf,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE;QAClC,MAAM,cAAc,CAAC,WAAW,CAAC,oBAAoB,EAAE;YACrD,EAAE,EAAE;gBACF,SAAS,EAAE,KAAK;gBAChB,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,SAAS,CAAC,OAAO;aACxB;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,SAAS,CAAC,OAAO;gBACvB,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,SAAS,EAAE,OAAO;qBACnB;oBACD,GAAG,EAAE,IAAI;iBACV;gBACD,SAAS,EAAE,KAAK;aACjB;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,SAAS,CAAC,MAAM;gBACtB,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,SAAS,EAAE,gBAAgB;qBAC5B;oBACD,GAAG,EAAE,IAAI;iBACV;gBACD,SAAS,EAAE,KAAK;aACjB;YACD,SAAS,EAAE;gBACT,SAAS,EAAE,KAAK;gBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB;YACD,SAAS,EAAE;gBACT,SAAS,EAAE,KAAK;gBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB;SACF,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE;QACpC,MAAM,cAAc,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACvD,CAAC;CACF,CAAC"}
|