@adaptivestone/framework 5.0.0-beta.10 → 5.0.0-beta.12
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/CHANGELOG.md +12 -0
- package/LICENCE +1 -1
- package/cliCommand.ts +10 -0
- package/dist/Cli.d.ts +7 -0
- package/dist/Cli.js +19 -0
- package/dist/Cli.js.map +1 -0
- package/dist/cluster.d.ts +1 -0
- package/dist/cluster.js +18 -0
- package/dist/cluster.js.map +1 -0
- package/dist/commands/CreateUser.d.ts +32 -0
- package/dist/commands/CreateUser.js +81 -0
- package/dist/commands/CreateUser.js.map +1 -0
- package/dist/commands/Documentation.d.ts +5 -0
- package/dist/commands/Documentation.js +15 -0
- package/dist/commands/Documentation.js.map +1 -0
- package/dist/commands/DropIndex.d.ts +16 -0
- package/dist/commands/DropIndex.js +30 -0
- package/dist/commands/DropIndex.js.map +1 -0
- package/dist/commands/GenerateRandomBytes.d.ts +7 -0
- package/dist/commands/GenerateRandomBytes.js +18 -0
- package/dist/commands/GenerateRandomBytes.js.map +1 -0
- package/dist/commands/GetOpenApiJson.d.ts +17 -0
- package/dist/commands/GetOpenApiJson.js +272 -0
- package/dist/commands/GetOpenApiJson.js.map +1 -0
- package/dist/commands/SyncIndexes.d.ts +6 -0
- package/dist/commands/SyncIndexes.js +32 -0
- package/dist/commands/SyncIndexes.js.map +1 -0
- package/dist/commands/migration/Create.d.ts +18 -0
- package/dist/commands/migration/Create.js +57 -0
- package/dist/commands/migration/Create.js.map +1 -0
- package/dist/commands/migration/Migrate.d.ts +6 -0
- package/dist/commands/migration/Migrate.js +46 -0
- package/dist/commands/migration/Migrate.js.map +1 -0
- package/dist/config/auth.d.ts +6 -0
- package/dist/config/auth.js +7 -0
- package/dist/config/auth.js.map +1 -0
- package/dist/config/http.d.ts +8 -0
- package/dist/config/http.js +10 -0
- package/dist/config/http.js.map +1 -0
- package/dist/config/i18n.d.ts +10 -0
- package/dist/config/i18n.js +13 -0
- package/dist/config/i18n.js.map +1 -0
- package/dist/config/ipDetector.d.ts +5 -0
- package/dist/config/ipDetector.js +15 -0
- package/dist/config/ipDetector.js.map +1 -0
- package/dist/config/log.d.ts +22 -0
- package/dist/config/log.js +23 -0
- package/dist/config/log.js.map +1 -0
- package/dist/config/mongo.d.ts +4 -0
- package/dist/config/mongo.js +4 -0
- package/dist/config/mongo.js.map +1 -0
- package/dist/config/rateLimiter.d.ts +15 -0
- package/dist/config/rateLimiter.js +17 -0
- package/dist/config/rateLimiter.js.map +1 -0
- package/dist/config/redis.d.ts +5 -0
- package/dist/config/redis.js +5 -0
- package/dist/config/redis.js.map +1 -0
- package/dist/config/validate.d.ts +4 -0
- package/dist/config/validate.js +4 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/controllers/Auth.d.ts +74 -0
- package/dist/controllers/Auth.js +181 -0
- package/dist/controllers/Auth.js.map +1 -0
- package/dist/controllers/Home.d.ts +15 -0
- package/dist/controllers/Home.js +24 -0
- package/dist/controllers/Home.js.map +1 -0
- package/dist/controllers/index.d.ts +16 -0
- package/dist/controllers/index.js +59 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/folderConfig.d.ts +34 -0
- package/dist/folderConfig.js +15 -0
- package/dist/folderConfig.js.map +1 -0
- package/dist/helpers/files.d.ts +16 -0
- package/dist/helpers/files.js +73 -0
- package/dist/helpers/files.js.map +1 -0
- package/dist/helpers/logger.d.ts +4 -0
- package/dist/helpers/logger.js +28 -0
- package/dist/helpers/logger.js.map +1 -0
- package/dist/helpers/redis/clearNamespace.d.ts +3 -0
- package/dist/helpers/redis/clearNamespace.js +15 -0
- package/dist/helpers/redis/clearNamespace.js.map +1 -0
- package/dist/helpers/yup.d.ts +13 -0
- package/{helpers → dist/helpers}/yup.js +8 -9
- package/dist/helpers/yup.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/models/Lock.d.ts +62 -0
- package/dist/models/Lock.js +94 -0
- package/dist/models/Lock.js.map +1 -0
- package/dist/models/Migration.d.ts +11 -0
- package/dist/models/Migration.js +14 -0
- package/dist/models/Migration.js.map +1 -0
- package/dist/models/Sequence.d.ts +16 -0
- package/dist/models/Sequence.js +16 -0
- package/dist/models/Sequence.js.map +1 -0
- package/dist/models/User.d.ts +101 -0
- package/dist/models/User.js +230 -0
- package/dist/models/User.js.map +1 -0
- package/dist/modules/AbstractCommand.d.ts +30 -0
- package/dist/modules/AbstractCommand.js +44 -0
- package/dist/modules/AbstractCommand.js.map +1 -0
- package/dist/modules/AbstractConnector.d.ts +5 -0
- package/dist/modules/AbstractConnector.js +8 -0
- package/dist/modules/AbstractConnector.js.map +1 -0
- package/dist/modules/AbstractController.d.ts +90 -0
- package/dist/modules/AbstractController.js +324 -0
- package/dist/modules/AbstractController.js.map +1 -0
- package/dist/modules/AbstractModel.d.ts +32 -0
- package/dist/modules/AbstractModel.js +73 -0
- package/dist/modules/AbstractModel.js.map +1 -0
- package/dist/modules/Base.d.ts +29 -0
- package/dist/modules/Base.js +54 -0
- package/dist/modules/Base.js.map +1 -0
- package/dist/modules/BaseCli.d.ts +25 -0
- package/dist/modules/BaseCli.js +138 -0
- package/dist/modules/BaseCli.js.map +1 -0
- package/dist/server.d.ts +110 -0
- package/dist/server.js +372 -0
- package/dist/server.js.map +1 -0
- package/dist/services/cache/Cache.d.ts +31 -0
- package/dist/services/cache/Cache.js +115 -0
- package/dist/services/cache/Cache.js.map +1 -0
- package/dist/services/documentation/DocumentationGenerator.d.ts +11 -0
- package/dist/services/documentation/DocumentationGenerator.js +134 -0
- package/dist/services/documentation/DocumentationGenerator.js.map +1 -0
- package/dist/services/http/HttpServer.d.ts +35 -0
- package/dist/services/http/HttpServer.js +71 -0
- package/dist/services/http/HttpServer.js.map +1 -0
- package/dist/services/http/middleware/AbstractMiddleware.d.ts +25 -0
- package/dist/services/http/middleware/AbstractMiddleware.js +43 -0
- package/dist/services/http/middleware/AbstractMiddleware.js.map +1 -0
- package/dist/services/http/middleware/Auth.d.ts +9 -0
- package/dist/services/http/middleware/Auth.js +18 -0
- package/dist/services/http/middleware/Auth.js.map +1 -0
- package/dist/services/http/middleware/Cors.d.ts +10 -0
- package/dist/services/http/middleware/Cors.js +36 -0
- package/dist/services/http/middleware/Cors.js.map +1 -0
- package/dist/services/http/middleware/GetUserByToken.d.ts +19 -0
- package/dist/services/http/middleware/GetUserByToken.js +40 -0
- package/dist/services/http/middleware/GetUserByToken.js.map +1 -0
- package/dist/services/http/middleware/I18n.d.ts +26 -0
- package/dist/services/http/middleware/I18n.js +97 -0
- package/dist/services/http/middleware/I18n.js.map +1 -0
- package/dist/services/http/middleware/IpDetector.d.ts +12 -0
- package/dist/services/http/middleware/IpDetector.js +51 -0
- package/dist/services/http/middleware/IpDetector.js.map +1 -0
- package/dist/services/http/middleware/Pagination.d.ts +27 -0
- package/dist/services/http/middleware/Pagination.js +47 -0
- package/dist/services/http/middleware/Pagination.js.map +1 -0
- package/dist/services/http/middleware/PrepareAppInfo.d.ts +8 -0
- package/dist/services/http/middleware/PrepareAppInfo.js +17 -0
- package/dist/services/http/middleware/PrepareAppInfo.js.map +1 -0
- package/dist/services/http/middleware/RateLimiter.d.ts +18 -0
- package/dist/services/http/middleware/RateLimiter.js +106 -0
- package/dist/services/http/middleware/RateLimiter.js.map +1 -0
- package/dist/services/http/middleware/RequestLogger.d.ts +8 -0
- package/dist/services/http/middleware/RequestLogger.js +18 -0
- package/dist/services/http/middleware/RequestLogger.js.map +1 -0
- package/dist/services/http/middleware/RequestParser.d.ts +8 -0
- package/dist/services/http/middleware/RequestParser.js +35 -0
- package/dist/services/http/middleware/RequestParser.js.map +1 -0
- package/dist/services/http/middleware/Role.d.ts +9 -0
- package/dist/services/http/middleware/Role.js +24 -0
- package/dist/services/http/middleware/Role.js.map +1 -0
- package/dist/services/validate/ValidateService.d.ts +31 -0
- package/dist/services/validate/ValidateService.js +96 -0
- package/dist/services/validate/ValidateService.js.map +1 -0
- package/dist/services/validate/drivers/AbstractValidator.d.ts +14 -0
- package/dist/services/validate/drivers/AbstractValidator.js +32 -0
- package/dist/services/validate/drivers/AbstractValidator.js.map +1 -0
- package/dist/services/validate/drivers/CustomValidator.d.ts +14 -0
- package/dist/services/validate/drivers/CustomValidator.js +48 -0
- package/dist/services/validate/drivers/CustomValidator.js.map +1 -0
- package/dist/services/validate/drivers/YupValidator.d.ts +13 -0
- package/dist/services/validate/drivers/YupValidator.js +86 -0
- package/dist/services/validate/drivers/YupValidator.js.map +1 -0
- package/dist/tests/globalSetupVitest.d.ts +2 -0
- package/dist/tests/globalSetupVitest.js +29 -0
- package/dist/tests/globalSetupVitest.js.map +1 -0
- package/dist/tests/setupVitest.d.ts +1 -0
- package/dist/tests/setupVitest.js +99 -0
- package/dist/tests/setupVitest.js.map +1 -0
- package/package.json +19 -10
- package/Cli.js +0 -21
- package/cluster.js +0 -25
- package/commands/.gitkeep +0 -0
- package/commands/CreateUser.js +0 -106
- package/commands/Documentation.js +0 -17
- package/commands/DropIndex.js +0 -38
- package/commands/GenerateRandomBytes.js +0 -21
- package/commands/GetOpenApiJson.js +0 -336
- package/commands/SyncIndexes.js +0 -40
- package/commands/migration/Create.js +0 -72
- package/commands/migration/Migrate.js +0 -56
- package/config/auth.js +0 -9
- package/config/http.js +0 -9
- package/config/i18n.js +0 -12
- package/config/ipDetector.js +0 -14
- package/config/log.js +0 -22
- package/config/mongo.js +0 -3
- package/config/rateLimiter.js +0 -16
- package/config/redis.js +0 -4
- package/config/validate.js +0 -3
- package/controllers/Auth.js +0 -201
- package/controllers/Home.js +0 -28
- package/controllers/index.js +0 -60
- package/eslint.config.js +0 -68
- package/folderConfig.js +0 -13
- package/helpers/files.js +0 -76
- package/helpers/logger.js +0 -16
- package/helpers/redis/clearNamespace.js +0 -14
- package/index.js +0 -8
- package/jsconfig.json +0 -9
- package/locales/en/translation.json +0 -27
- package/locales/ru/translation.json +0 -27
- package/migrations/.gitkeep +0 -0
- package/models/Lock.js +0 -107
- package/models/Migration.js +0 -15
- package/models/Sequence.js +0 -22
- package/models/User.js +0 -280
- package/modules/AbstractCommand.js +0 -52
- package/modules/AbstractConnector.js +0 -9
- package/modules/AbstractController.js +0 -406
- package/modules/AbstractModel.d.ts +0 -48
- package/modules/AbstractModel.js +0 -92
- package/modules/Base.d.ts +0 -37
- package/modules/Base.js +0 -64
- package/modules/BaseCli.js +0 -157
- package/server.d.ts +0 -100
- package/server.js +0 -439
- package/services/cache/Cache.d.ts +0 -35
- package/services/cache/Cache.js +0 -124
- package/services/documentation/DocumentationGenerator.js +0 -169
- package/services/http/HttpServer.js +0 -89
- package/services/http/middleware/AbstractMiddleware.js +0 -51
- package/services/http/middleware/Auth.js +0 -20
- package/services/http/middleware/Cors.js +0 -46
- package/services/http/middleware/GetUserByToken.js +0 -47
- package/services/http/middleware/I18n.js +0 -117
- package/services/http/middleware/IpDetector.js +0 -59
- package/services/http/middleware/Pagination.js +0 -57
- package/services/http/middleware/PrepareAppInfo.js +0 -18
- package/services/http/middleware/RateLimiter.js +0 -134
- package/services/http/middleware/RequestLogger.js +0 -22
- package/services/http/middleware/RequestParser.js +0 -40
- package/services/http/middleware/Role.js +0 -29
- package/services/messaging/email/resources/.gitkeep +0 -1
- package/services/messaging/email/templates/.gitkeep +0 -0
- package/services/messaging/email/templates/recovery/html.pug +0 -8
- package/services/messaging/email/templates/recovery/subject.pug +0 -2
- package/services/messaging/email/templates/recovery/text.pug +0 -3
- package/services/messaging/email/templates/verification/html.pug +0 -10
- package/services/messaging/email/templates/verification/subject.pug +0 -1
- package/services/messaging/email/templates/verification/text.pug +0 -1
- package/services/validate/ValidateService.js +0 -157
- package/services/validate/drivers/AbstractValidator.js +0 -37
- package/services/validate/drivers/CustomValidator.js +0 -51
- package/services/validate/drivers/YupValidator.js +0 -103
- package/tests/globalSetupVitest.js +0 -35
- package/tests/setup.js +0 -120
- package/tests/setupVitest.js +0 -111
- package/types/Expand.d.ts +0 -11
- package/types/ICommandArguments.d.ts +0 -41
- package/types/TFoldersConfig.d.ts +0 -20
- package/views/404.pug +0 -3
- package/views/home.pug +0 -3
- package/views/layouts/base.pug +0 -39
- package/vitest.config.js +0 -17
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
### 5.0.0-beta.12
|
|
2
|
+
|
|
3
|
+
[BREAKING] Remove jest support for testing
|
|
4
|
+
[NEW] initial move to typescript. Potencially breaking.
|
|
5
|
+
[NEW] introduce src and dist folders
|
|
6
|
+
|
|
7
|
+
### 5.0.0-beta.11
|
|
8
|
+
|
|
9
|
+
[NEW] commands typing
|
|
10
|
+
[NEW] commands support TS files
|
|
11
|
+
[UPDATE] update deps
|
|
12
|
+
|
|
1
13
|
### 5.0.0-beta.9
|
|
2
14
|
|
|
3
15
|
[BREAKING] move email module to separate package @adaptivestone/framework-module-email. Please use it if you want to send emails
|
package/LICENCE
CHANGED
package/cliCommand.ts
ADDED
package/dist/Cli.d.ts
ADDED
package/dist/Cli.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
import BaseCli from "./modules/BaseCli.js";
|
|
3
|
+
import Server from "./server.js";
|
|
4
|
+
class Cli extends BaseCli {
|
|
5
|
+
constructor(serverConfig) {
|
|
6
|
+
mongoose.set('autoIndex', false); // we do not need create indexes on CLI.
|
|
7
|
+
const server = new Server(serverConfig);
|
|
8
|
+
super(server);
|
|
9
|
+
}
|
|
10
|
+
async run() {
|
|
11
|
+
await this.server.init({ isSkipModelInit: true, isSkipModelLoading: true });
|
|
12
|
+
const command = process.argv[2]?.toLowerCase();
|
|
13
|
+
await super.run(command);
|
|
14
|
+
this.app.events.emit('shutdown');
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export default Cli;
|
|
19
|
+
//# sourceMappingURL=Cli.js.map
|
package/dist/Cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,OAAO,MAAM,sBAAsB,CAAC;AAC3C,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,MAAM,GAAI,SAAQ,OAAO;IACvB,YAAY,YAA2B;QACrC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,wCAAwC;QAC1E,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;QACxC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAC/C,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/cluster.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import cluster from 'node:cluster';
|
|
2
|
+
import { cpus } from 'node:os';
|
|
3
|
+
const numCPUs = cpus().length;
|
|
4
|
+
if (cluster.isPrimary) {
|
|
5
|
+
console.log(`Master ${process.pid} is running`);
|
|
6
|
+
// Fork workers.
|
|
7
|
+
for (let i = 0; i < numCPUs; i += 1) {
|
|
8
|
+
cluster.fork();
|
|
9
|
+
}
|
|
10
|
+
cluster.on('exit', (worker, code, signal) => {
|
|
11
|
+
console.log(`Worker \x1B[45m ${worker.process.pid} \x1B[49m \x1B[41m †††† died †††† \x1B[49m. Code: ${signal || code}. Restarting...`);
|
|
12
|
+
cluster.fork();
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
import("./server.js");
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=cluster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.js","sourceRoot":"","sources":["../src/cluster.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC;AAE9B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC;IAChD,gBAAgB;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC1C,OAAO,CAAC,GAAG,CACT,mBACE,MAAM,CAAC,OAAO,CAAC,GACjB,qDACE,MAAM,IAAI,IACZ,iBAAiB,CAClB,CAAC;QACF,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;KAAM,CAAC;IACN,MAAM,CAAC,aAAa,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import AbstractCommand from '../modules/AbstractCommand.ts';
|
|
2
|
+
declare class CreateUser extends AbstractCommand {
|
|
3
|
+
static get description(): string;
|
|
4
|
+
/**
|
|
5
|
+
* You able to add command arguments for parsing there.
|
|
6
|
+
*/
|
|
7
|
+
static get commandArguments(): {
|
|
8
|
+
id: {
|
|
9
|
+
type: "string";
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
email: {
|
|
13
|
+
type: "string";
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
password: {
|
|
17
|
+
type: "string";
|
|
18
|
+
description: string;
|
|
19
|
+
};
|
|
20
|
+
roles: {
|
|
21
|
+
type: "string";
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
24
|
+
update: {
|
|
25
|
+
type: "boolean";
|
|
26
|
+
default: boolean;
|
|
27
|
+
description: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
run(): Promise<any>;
|
|
31
|
+
}
|
|
32
|
+
export default CreateUser;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import AbstractCommand from "../modules/AbstractCommand.js";
|
|
2
|
+
// Example: node src/cli createuser --email=somemail@gmail.com --password=somePassword --roles=user,admin,someOtherRoles
|
|
3
|
+
class CreateUser extends AbstractCommand {
|
|
4
|
+
static get description() {
|
|
5
|
+
return 'Create user in a database';
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* You able to add command arguments for parsing there.
|
|
9
|
+
*/
|
|
10
|
+
static get commandArguments() {
|
|
11
|
+
return {
|
|
12
|
+
id: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: 'User id to find user',
|
|
15
|
+
},
|
|
16
|
+
email: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'User id to find/create user',
|
|
19
|
+
},
|
|
20
|
+
password: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'New password for user',
|
|
23
|
+
},
|
|
24
|
+
roles: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'User roles comma separated string (--roles=user,admin,someOtherRoles)',
|
|
27
|
+
},
|
|
28
|
+
update: {
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
default: false,
|
|
31
|
+
description: 'Update user if it exists',
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
async run() {
|
|
36
|
+
const User = this.app.getModel('User');
|
|
37
|
+
const { id, email, password, roles, update } = this.args;
|
|
38
|
+
if (!email && !id) {
|
|
39
|
+
this.logger?.error('Input validation failded');
|
|
40
|
+
this.logger?.error('Please add "email" or "id" variables');
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
let user;
|
|
44
|
+
if (id) {
|
|
45
|
+
user = await User.findOne({ _id: id });
|
|
46
|
+
}
|
|
47
|
+
else if (email) {
|
|
48
|
+
user = await User.findOne({ email });
|
|
49
|
+
}
|
|
50
|
+
if (user && !update) {
|
|
51
|
+
this.logger?.error('We are found a user in database. But "update" option is not providing. Exitin');
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
if (!user && !password) {
|
|
55
|
+
this.logger?.error('For a new user we alway asking for a password. Please provide it and rerun command');
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (!user && !email) {
|
|
59
|
+
this.logger?.error('For a new user we alway asking for a email. Please provide it and rerun command');
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
if (!user) {
|
|
63
|
+
user = new User();
|
|
64
|
+
}
|
|
65
|
+
if (password) {
|
|
66
|
+
user.password = password;
|
|
67
|
+
}
|
|
68
|
+
if (email) {
|
|
69
|
+
user.email = email;
|
|
70
|
+
}
|
|
71
|
+
if (roles) {
|
|
72
|
+
user.roles = roles.split(',');
|
|
73
|
+
}
|
|
74
|
+
await user.save();
|
|
75
|
+
await user.generateToken();
|
|
76
|
+
this.logger?.info(`User was created/updated ${JSON.stringify(user, null, 4)}`);
|
|
77
|
+
return user;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export default CreateUser;
|
|
81
|
+
//# sourceMappingURL=CreateUser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateUser.js","sourceRoot":"","sources":["../../src/commands/CreateUser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import AbstractCommand from "../modules/AbstractCommand.js";
|
|
2
|
+
import ControllerManager from "../controllers/index.js";
|
|
3
|
+
class Documentation extends AbstractCommand {
|
|
4
|
+
static get description() {
|
|
5
|
+
return 'Generate documentation (internal)';
|
|
6
|
+
}
|
|
7
|
+
async run() {
|
|
8
|
+
const CM = new ControllerManager(this.app);
|
|
9
|
+
this.app.documentation = [];
|
|
10
|
+
await CM.initControllers();
|
|
11
|
+
return this.app.documentation;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export default Documentation;
|
|
15
|
+
//# sourceMappingURL=Documentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Documentation.js","sourceRoot":"","sources":["../../src/commands/Documentation.js"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAC5D,OAAO,iBAAiB,MAAM,yBAAyB,CAAC;AAExD,MAAM,aAAc,SAAQ,eAAe;IACzC,MAAM,KAAK,WAAW;QACpB,OAAO,mCAAmC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,EAAE,CAAC;QAC5B,MAAM,EAAE,CAAC,eAAe,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;IAChC,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import AbstractCommand from '../modules/AbstractCommand.ts';
|
|
2
|
+
declare class DropIndex extends AbstractCommand {
|
|
3
|
+
static get description(): string;
|
|
4
|
+
/**
|
|
5
|
+
* You able to add command arguments for parsing there.
|
|
6
|
+
*/
|
|
7
|
+
static get commandArguments(): {
|
|
8
|
+
model: {
|
|
9
|
+
type: "string";
|
|
10
|
+
description: string;
|
|
11
|
+
required: boolean;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
export default DropIndex;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import AbstractCommand from "../modules/AbstractCommand.js";
|
|
2
|
+
class DropIndex extends AbstractCommand {
|
|
3
|
+
static get description() {
|
|
4
|
+
return 'Drop indexes of model';
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* You able to add command arguments for parsing there.
|
|
8
|
+
*/
|
|
9
|
+
static get commandArguments() {
|
|
10
|
+
return {
|
|
11
|
+
model: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
description: 'Model name',
|
|
14
|
+
required: true,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async run() {
|
|
19
|
+
const Model = this.app.getModel(this.args.model);
|
|
20
|
+
if (!Model) {
|
|
21
|
+
this.logger?.error('Not able to find model');
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
await Model.collection.dropIndexes();
|
|
25
|
+
this.logger?.info('Success');
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export default DropIndex;
|
|
30
|
+
//# sourceMappingURL=DropIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropIndex.js","sourceRoot":"","sources":["../../src/commands/DropIndex.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAE5D,MAAM,SAAU,SAAQ,eAAe;IACrC,MAAM,KAAK,WAAW;QACpB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,MAAM,KAAK,gBAAgB;QACzB,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,QAAiB;gBACvB,WAAW,EAAE,YAAY;gBACzB,QAAQ,EAAE,IAAI;aACf;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAE7B,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import AbstractCommand from "../modules/AbstractCommand.js";
|
|
3
|
+
class GenerateRandomBytes extends AbstractCommand {
|
|
4
|
+
static get description() {
|
|
5
|
+
return 'Generate random bytes ising randomBytes from node:crypto';
|
|
6
|
+
}
|
|
7
|
+
static isShouldInitModels = false;
|
|
8
|
+
async run() {
|
|
9
|
+
const sizes = [16, 32, 64, 128, 256];
|
|
10
|
+
for (const size of sizes) {
|
|
11
|
+
const bytes = randomBytes(size).toString('hex');
|
|
12
|
+
this.logger?.info(`${size} bytes: ${bytes}`);
|
|
13
|
+
}
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export default GenerateRandomBytes;
|
|
18
|
+
//# sourceMappingURL=GenerateRandomBytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenerateRandomBytes.js","sourceRoot":"","sources":["../../src/commands/GenerateRandomBytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAE5D,MAAM,mBAAoB,SAAQ,eAAe;IAC/C,MAAM,KAAK,WAAW;QACpB,OAAO,2DAA2D,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAElC,KAAK,CAAC,GAAG;QACP,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,WAAW,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;;AAGH,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default GetOpenApiJson;
|
|
2
|
+
/**
|
|
3
|
+
* Command for generate documentation json file openApi
|
|
4
|
+
*/
|
|
5
|
+
declare class GetOpenApiJson extends AbstractCommand {
|
|
6
|
+
/**
|
|
7
|
+
* You able to add command arguments for parsing there.
|
|
8
|
+
*/
|
|
9
|
+
static get commandArguments(): {
|
|
10
|
+
output: {
|
|
11
|
+
type: string;
|
|
12
|
+
description: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<string>;
|
|
16
|
+
}
|
|
17
|
+
import AbstractCommand from '../modules/AbstractCommand.ts';
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import AbstractCommand from "../modules/AbstractCommand.js";
|
|
3
|
+
/**
|
|
4
|
+
* Command for generate documentation json file openApi
|
|
5
|
+
*/
|
|
6
|
+
class GetOpenApiJson extends AbstractCommand {
|
|
7
|
+
static get description() {
|
|
8
|
+
return 'Generate documentation (openApi) ';
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* You able to add command arguments for parsing there.
|
|
12
|
+
*/
|
|
13
|
+
static get commandArguments() {
|
|
14
|
+
return {
|
|
15
|
+
output: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
description: 'Output file path',
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async run() {
|
|
22
|
+
const { myDomain } = this.app.getConfig('http');
|
|
23
|
+
let jsonFile = process.env.npm_package_json;
|
|
24
|
+
if (!jsonFile) {
|
|
25
|
+
jsonFile = `${process.env.PWD}/package.json`;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
jsonFile = JSON.parse(await fs.readFile(jsonFile, 'utf8'));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
this.logger.error('No npm package detected. Please start this command via NPM as it depends on package.json');
|
|
32
|
+
}
|
|
33
|
+
if (!jsonFile) {
|
|
34
|
+
jsonFile = {
|
|
35
|
+
name: 'UNDETECTD PROJECT',
|
|
36
|
+
description: 'UNDETECTD PROJECT DECCRIPTION',
|
|
37
|
+
version: '0.0.0-undetrcted',
|
|
38
|
+
author: {
|
|
39
|
+
email: 'none@example.com',
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (!jsonFile.author) {
|
|
44
|
+
jsonFile.author = 'none@example.com';
|
|
45
|
+
}
|
|
46
|
+
const openApi = {
|
|
47
|
+
openapi: '3.0.0',
|
|
48
|
+
info: {
|
|
49
|
+
title: jsonFile.name,
|
|
50
|
+
description: jsonFile.description,
|
|
51
|
+
contact: {
|
|
52
|
+
email: jsonFile.author.email,
|
|
53
|
+
},
|
|
54
|
+
version: jsonFile.version,
|
|
55
|
+
},
|
|
56
|
+
servers: [
|
|
57
|
+
{
|
|
58
|
+
url: 'http://localhost:3300',
|
|
59
|
+
description: 'Localhost',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
url: myDomain,
|
|
63
|
+
description: 'Domain from config',
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
};
|
|
67
|
+
const baseDocumentation = await this.app.runCliCommand('documentation');
|
|
68
|
+
if (!baseDocumentation) {
|
|
69
|
+
throw new Error('Problems with basic documenation generation');
|
|
70
|
+
}
|
|
71
|
+
openApi.components = {};
|
|
72
|
+
openApi.components.securitySchemes = {};
|
|
73
|
+
openApi.tags = [];
|
|
74
|
+
for (const controller of baseDocumentation) {
|
|
75
|
+
const controllerName = controller.contollerName.split('/')[0];
|
|
76
|
+
if (!openApi.tags.find((tag) => tag.name === controllerName)) {
|
|
77
|
+
openApi.tags.push({
|
|
78
|
+
name: controllerName,
|
|
79
|
+
description: '',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
openApi.paths = {};
|
|
84
|
+
const permissionWithRoutes = {};
|
|
85
|
+
for (const controller of baseDocumentation) {
|
|
86
|
+
for (const route of controller.routesInfo) {
|
|
87
|
+
const routeInfo = route[Object.keys(route)?.[0]];
|
|
88
|
+
const middlewares = [
|
|
89
|
+
...routeInfo.controllerMiddlewares,
|
|
90
|
+
...routeInfo.routeMiddlewares,
|
|
91
|
+
];
|
|
92
|
+
const securitySchemaNames = [];
|
|
93
|
+
permissionWithRoutes[Object.keys(route)?.[0]] = [];
|
|
94
|
+
if (middlewares?.length) {
|
|
95
|
+
for (const middleware of middlewares) {
|
|
96
|
+
if (middleware?.authParams?.length) {
|
|
97
|
+
for (const authParam of middleware.authParams) {
|
|
98
|
+
const { permissions, ...mainFields } = authParam;
|
|
99
|
+
const fullName = authParam.name;
|
|
100
|
+
if (permissions) {
|
|
101
|
+
permissionWithRoutes[Object.keys(route)?.[0]].push(permissions);
|
|
102
|
+
}
|
|
103
|
+
if (!openApi.components.securitySchemes[fullName]) {
|
|
104
|
+
openApi.components.securitySchemes[fullName] = mainFields;
|
|
105
|
+
}
|
|
106
|
+
securitySchemaNames.push({
|
|
107
|
+
[fullName]: [],
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
let routeName = Object.keys(route)[0];
|
|
114
|
+
if (routeName === '/') {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (routeName.slice(-1) === '/') {
|
|
118
|
+
routeName = routeName.substring(0, routeName.length - 1);
|
|
119
|
+
}
|
|
120
|
+
const partsRoute = routeName.split('/');
|
|
121
|
+
const newRoute = [];
|
|
122
|
+
const routeParameters = [];
|
|
123
|
+
for (const routeDetail of partsRoute) {
|
|
124
|
+
let routeCopy = routeDetail;
|
|
125
|
+
if (routeDetail.startsWith(':')) {
|
|
126
|
+
const routeChange = routeCopy.split('');
|
|
127
|
+
routeChange[0] = '{';
|
|
128
|
+
routeChange.push('}');
|
|
129
|
+
routeCopy = routeChange.join('');
|
|
130
|
+
routeParameters.push(routeCopy.replace(/^.|.$/g, ''));
|
|
131
|
+
}
|
|
132
|
+
newRoute.push(routeCopy);
|
|
133
|
+
}
|
|
134
|
+
routeName = newRoute.join('/');
|
|
135
|
+
if (!openApi.paths[routeName]) {
|
|
136
|
+
openApi.paths[routeName] = {};
|
|
137
|
+
}
|
|
138
|
+
const routeDescription = route[Object.keys(route)[0]]?.description || 'empty description';
|
|
139
|
+
const permissions = permissionWithRoutes[Object.keys(route)[0]][permissionWithRoutes[Object.keys(route)[0]].length - 1];
|
|
140
|
+
const routeDescriptionWithPermissions = `${permissions || ''} ${routeDescription}`;
|
|
141
|
+
const methodName = route[Object.keys(route)[0]].method.toLowerCase();
|
|
142
|
+
const routeTitle = route[Object.keys(route)[0]].name;
|
|
143
|
+
const routeFields = route[Object.keys(route)[0]].fields;
|
|
144
|
+
const routeQueryFields = route[Object.keys(route)[0]].queryFields;
|
|
145
|
+
if (!openApi.paths[routeName][methodName]) {
|
|
146
|
+
openApi.paths[routeName][methodName] = {};
|
|
147
|
+
}
|
|
148
|
+
openApi.paths[routeName][methodName].tags = [];
|
|
149
|
+
openApi.paths[routeName][methodName].tags.push(controller.contollerName.split('/')[0]);
|
|
150
|
+
openApi.paths[routeName][methodName].summary = routeTitle;
|
|
151
|
+
openApi.paths[routeName][methodName].description =
|
|
152
|
+
routeDescriptionWithPermissions;
|
|
153
|
+
openApi.paths[routeName][methodName].parameters = [];
|
|
154
|
+
openApi.paths[routeName][methodName].security = securitySchemaNames;
|
|
155
|
+
openApi.paths[routeName][methodName].responses = {
|
|
156
|
+
200: {
|
|
157
|
+
description: 'Successfully',
|
|
158
|
+
},
|
|
159
|
+
201: {
|
|
160
|
+
description: 'The resource was created successfully',
|
|
161
|
+
},
|
|
162
|
+
400: {
|
|
163
|
+
description: 'There is a syntax error in the request',
|
|
164
|
+
},
|
|
165
|
+
401: {
|
|
166
|
+
description: 'Authentication is required to access the requested resource',
|
|
167
|
+
},
|
|
168
|
+
404: {
|
|
169
|
+
description: 'The server accepted the request, but did not find the corresponding resource at the specified URI',
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
for (const queryField of routeQueryFields) {
|
|
173
|
+
openApi.paths[routeName][methodName].parameters.push({
|
|
174
|
+
name: queryField.name,
|
|
175
|
+
in: 'query',
|
|
176
|
+
required: queryField?.required,
|
|
177
|
+
schema: {
|
|
178
|
+
type: queryField.type,
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
for (const routeField of routeParameters) {
|
|
183
|
+
openApi.paths[routeName][methodName].parameters.push({
|
|
184
|
+
name: routeField,
|
|
185
|
+
in: 'path',
|
|
186
|
+
required: true,
|
|
187
|
+
schema: {
|
|
188
|
+
type: 'string',
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
if (routeFields.length) {
|
|
193
|
+
const groupBodyFields = {};
|
|
194
|
+
const requiredFields = [];
|
|
195
|
+
let isMultipartFormaData = false;
|
|
196
|
+
for (const field of routeFields) {
|
|
197
|
+
if (field.required) {
|
|
198
|
+
requiredFields.push(field.name);
|
|
199
|
+
}
|
|
200
|
+
switch (field.type) {
|
|
201
|
+
case 'object':
|
|
202
|
+
groupBodyFields[field.name] = {
|
|
203
|
+
properties: {},
|
|
204
|
+
};
|
|
205
|
+
for (const objField of field.fields) {
|
|
206
|
+
groupBodyFields[field.name].properties[objField.name] = {
|
|
207
|
+
// fields file has mixed type but openApi doesnt have this type
|
|
208
|
+
type: objField.type === 'mixed' ? 'string' : objField.type,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
case 'array':
|
|
213
|
+
groupBodyFields[field.name] = {
|
|
214
|
+
items: {
|
|
215
|
+
type: field.innerType,
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
break;
|
|
219
|
+
case 'lazy':
|
|
220
|
+
groupBodyFields[field.name] = {
|
|
221
|
+
oneOf: [
|
|
222
|
+
{
|
|
223
|
+
type: 'object',
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
type: 'string',
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
break;
|
|
231
|
+
case 'file':
|
|
232
|
+
groupBodyFields[field.name] = {
|
|
233
|
+
type: 'string',
|
|
234
|
+
format: 'binary',
|
|
235
|
+
};
|
|
236
|
+
isMultipartFormaData = true;
|
|
237
|
+
break;
|
|
238
|
+
default:
|
|
239
|
+
groupBodyFields[field.name] = {
|
|
240
|
+
type: field.type,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const contentType = isMultipartFormaData
|
|
245
|
+
? 'multipart/form-data'
|
|
246
|
+
: 'application/json';
|
|
247
|
+
openApi.paths[routeName][methodName].requestBody = {
|
|
248
|
+
content: {
|
|
249
|
+
[contentType]: {
|
|
250
|
+
schema: {
|
|
251
|
+
type: 'object',
|
|
252
|
+
properties: groupBodyFields,
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
if (requiredFields.length) {
|
|
258
|
+
openApi.paths[routeName][methodName].requestBody.content[contentType].schema.required = requiredFields;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const result = JSON.stringify(openApi);
|
|
264
|
+
if (this.args.output) {
|
|
265
|
+
await fs.writeFile(this.args.output, result);
|
|
266
|
+
this.logger.info(`Output to: ${this.args.output}`);
|
|
267
|
+
}
|
|
268
|
+
return result;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
export default GetOpenApiJson;
|
|
272
|
+
//# sourceMappingURL=GetOpenApiJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GetOpenApiJson.js","sourceRoot":"","sources":["../../src/commands/GetOpenApiJson.js"],"names":[],"mappings":"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"}
|