@devbro/pashmak 0.1.43 → 0.1.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/console/generate/GenerateApiDocsCommand.d.mts +4 -1
- package/dist/app/console/generate/GenerateApiDocsCommand.mjs +56 -4
- package/dist/app/console/generate/GenerateApiDocsCommand.mjs.map +1 -1
- package/dist/app/console/project/CreateProjectCommand.mjs +27 -2
- package/dist/app/console/project/CreateProjectCommand.mjs.map +1 -1
- package/dist/app/console/project/base_project/package.json.tpl +7 -2
- package/dist/app/console/project/base_project/src/app/queues/index.ts.tpl +9 -0
- package/dist/app/console/project/base_project/src/config/caches.ts.tpl +2 -4
- package/dist/app/console/project/base_project/src/config/databases.ts.tpl +7 -9
- package/dist/app/console/project/base_project/src/config/default.mts.tpl +17 -3
- package/dist/app/console/project/base_project/src/config/loggers.ts.tpl +6 -8
- package/dist/app/console/project/base_project/src/config/mailer.ts.tpl +15 -16
- package/dist/app/console/project/base_project/src/config/queues.ts.tpl +2 -4
- package/dist/app/console/project/base_project/src/config/storages.ts.tpl +5 -4
- package/dist/app/console/project/base_project/src/helpers/QueryKit.ts.tpl +175 -0
- package/dist/app/console/project/base_project/src/helpers/index.ts.tpl +96 -0
- package/dist/app/console/project/base_project/src/helpers/validation.ts.tpl +26 -0
- package/dist/app/console/project/base_project/src/initialize.ts.tpl +64 -7
- package/dist/app/console/project/base_project/src/middlewares.ts.tpl +1 -1
- package/dist/bin/app/console/DefaultCommand.cjs +0 -19
- package/dist/bin/app/console/KeyGenerateCommand.cjs +0 -19
- package/dist/bin/app/console/StartCommand.cjs +0 -19
- package/dist/bin/app/console/generate/GenerateApiDocsCommand.cjs +62 -24
- package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +0 -19
- package/dist/bin/app/console/generate/index.cjs +62 -24
- package/dist/bin/app/console/index.cjs +89 -26
- package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +0 -19
- package/dist/bin/app/console/migrate/MigrateCommand.cjs +0 -19
- package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +0 -19
- package/dist/bin/app/console/migrate/index.cjs +0 -19
- package/dist/bin/app/console/project/CreateProjectCommand.cjs +27 -2
- package/dist/bin/app/console/queue/GenerateQueueMigrateCommand.cjs +0 -19
- package/dist/bin/bin/pashmak_cli.cjs +27 -2
- package/dist/bin/cache.cjs +0 -19
- package/dist/bin/facades.cjs +0 -19
- package/dist/bin/factories.cjs +0 -19
- package/dist/bin/index.cjs +96 -29
- package/dist/bin/middlewares.cjs +0 -19
- package/dist/bin/queue.cjs +0 -19
- package/dist/bin/router.cjs +0 -9
- package/dist/facades.mjs +0 -19
- package/dist/facades.mjs.map +1 -1
- package/dist/router.d.mts +1 -3
- package/dist/router.mjs +1 -9
- package/dist/router.mjs.map +1 -1
- package/package.json +12 -11
- package/dist/app/console/project/base_project/src/helpers.ts.tpl +0 -28
package/dist/bin/index.cjs
CHANGED
|
@@ -635,8 +635,8 @@ var init_queue = __esm({
|
|
|
635
635
|
}
|
|
636
636
|
});
|
|
637
637
|
}, "processMessage");
|
|
638
|
-
constructor(
|
|
639
|
-
this.config = { ...this.config, ...
|
|
638
|
+
constructor(config12 = {}) {
|
|
639
|
+
this.config = { ...this.config, ...config12 };
|
|
640
640
|
this.repeater = (0, import_neko_helper.createRepeater)(
|
|
641
641
|
this.processMessage,
|
|
642
642
|
this.config.listen_interval * 1e3
|
|
@@ -748,7 +748,7 @@ var init_factories = __esm({
|
|
|
748
748
|
});
|
|
749
749
|
|
|
750
750
|
// src/facades.mts
|
|
751
|
-
var import_neko_scheduler, import_neko_helper2, import_neko_context3, import_neko_storage2, import_neko_mailer2, import_neko_config2, import_clipanion,
|
|
751
|
+
var import_neko_scheduler, import_neko_helper2, import_neko_context3, import_neko_storage2, import_neko_mailer2, import_neko_config2, import_clipanion, import_neko_logger, import_neko_cache2, import_neko_queue2, router, scheduler, db, storage, cli, httpServer, logger, mailer, queue, cache;
|
|
752
752
|
var init_facades = __esm({
|
|
753
753
|
"src/facades.mts"() {
|
|
754
754
|
"use strict";
|
|
@@ -761,7 +761,6 @@ var init_facades = __esm({
|
|
|
761
761
|
import_neko_config2 = require("@devbro/neko-config");
|
|
762
762
|
import_clipanion = require("clipanion");
|
|
763
763
|
init_http();
|
|
764
|
-
yup = __toESM(require("yup"), 1);
|
|
765
764
|
import_neko_logger = require("@devbro/neko-logger");
|
|
766
765
|
init_factories();
|
|
767
766
|
import_neko_cache2 = require("@devbro/neko-cache");
|
|
@@ -803,24 +802,6 @@ var init_facades = __esm({
|
|
|
803
802
|
res.end(JSON.stringify({ message: err.message, error: err.code }));
|
|
804
803
|
logger().warn({ msg: "HttpError: " + err.message, err });
|
|
805
804
|
return;
|
|
806
|
-
} else if (err instanceof yup.ValidationError) {
|
|
807
|
-
res.writeHead(422, { "Content-Type": "application/json" });
|
|
808
|
-
const errs = {};
|
|
809
|
-
err.inner.forEach((e) => {
|
|
810
|
-
const sanitizedParams = { ...e.params };
|
|
811
|
-
if (/passw/i.test(e.path)) {
|
|
812
|
-
sanitizedParams.value = "******";
|
|
813
|
-
sanitizedParams.originalValue = "******";
|
|
814
|
-
}
|
|
815
|
-
errs[e.path] = {
|
|
816
|
-
type: e.type,
|
|
817
|
-
message: e.message,
|
|
818
|
-
params: sanitizedParams
|
|
819
|
-
};
|
|
820
|
-
});
|
|
821
|
-
res.end(JSON.stringify({ message: "validation error", errors: errs }));
|
|
822
|
-
logger().warn({ msg: "ValidationError: " + err.message, err });
|
|
823
|
-
return;
|
|
824
805
|
} else {
|
|
825
806
|
logger().error({ msg: "Error: " + err.message, err });
|
|
826
807
|
}
|
|
@@ -2501,8 +2482,17 @@ var init_GenerateControllerCommand = __esm({
|
|
|
2501
2482
|
}
|
|
2502
2483
|
});
|
|
2503
2484
|
|
|
2485
|
+
// src/config.mts
|
|
2486
|
+
var config_exports = {};
|
|
2487
|
+
var init_config = __esm({
|
|
2488
|
+
"src/config.mts"() {
|
|
2489
|
+
"use strict";
|
|
2490
|
+
__reExport(config_exports, require("@devbro/neko-config"));
|
|
2491
|
+
}
|
|
2492
|
+
});
|
|
2493
|
+
|
|
2504
2494
|
// src/app/console/generate/GenerateApiDocsCommand.mts
|
|
2505
|
-
var import_clipanion9, import_path7, fs6, GenerateApiDocsCommand;
|
|
2495
|
+
var import_clipanion9, import_path7, fs6, import_neko_helper3, GenerateApiDocsCommand;
|
|
2506
2496
|
var init_GenerateApiDocsCommand = __esm({
|
|
2507
2497
|
"src/app/console/generate/GenerateApiDocsCommand.mts"() {
|
|
2508
2498
|
"use strict";
|
|
@@ -2510,6 +2500,8 @@ var init_GenerateApiDocsCommand = __esm({
|
|
|
2510
2500
|
import_clipanion9 = require("clipanion");
|
|
2511
2501
|
import_path7 = __toESM(require("path"), 1);
|
|
2512
2502
|
fs6 = __toESM(require("fs/promises"), 1);
|
|
2503
|
+
init_config();
|
|
2504
|
+
import_neko_helper3 = require("@devbro/neko-helper");
|
|
2513
2505
|
GenerateApiDocsCommand = class extends import_clipanion9.Command {
|
|
2514
2506
|
static {
|
|
2515
2507
|
__name(this, "GenerateApiDocsCommand");
|
|
@@ -2518,7 +2510,44 @@ var init_GenerateApiDocsCommand = __esm({
|
|
|
2518
2510
|
[`make`, `apidocs`],
|
|
2519
2511
|
[`generate`, `apidocs`]
|
|
2520
2512
|
];
|
|
2513
|
+
static usage = import_clipanion9.Command.Usage({
|
|
2514
|
+
category: `Generate`,
|
|
2515
|
+
description: `Generate OpenAPI documentation from routes`,
|
|
2516
|
+
details: `
|
|
2517
|
+
This command generates OpenAPI 3.0 specification documentation by analyzing
|
|
2518
|
+
your application's routes and merging with example files.
|
|
2519
|
+
|
|
2520
|
+
The generated documentation includes:
|
|
2521
|
+
- All registered routes with their HTTP methods
|
|
2522
|
+
- Path parameters extracted from route definitions
|
|
2523
|
+
- Request body schemas for POST, PUT, and PATCH methods
|
|
2524
|
+
- Response schemas
|
|
2525
|
+
|
|
2526
|
+
The command will merge files specified in config.api_docs.merge_files
|
|
2527
|
+
and output the final documentation to config.api_docs.output.
|
|
2528
|
+
|
|
2529
|
+
This command depends on config data. make sure your default config contains the following:
|
|
2530
|
+
api_docs: {
|
|
2531
|
+
merge_files: [
|
|
2532
|
+
path.join(__dirname, '../..', 'private', 'openapi_examples.json'),
|
|
2533
|
+
path.join(__dirname, '../..', 'private', 'openapi_base.json'),
|
|
2534
|
+
path.join(__dirname, '../..', 'private', 'openapi_user_changes.json'),
|
|
2535
|
+
],
|
|
2536
|
+
output: path.join(__dirname, '../..', 'private', 'openapi.json'),
|
|
2537
|
+
}
|
|
2538
|
+
`,
|
|
2539
|
+
examples: [[`Generate API documentation`, `$0 generate apidocs`]]
|
|
2540
|
+
});
|
|
2541
|
+
help = import_clipanion9.Option.Boolean(`--help,-h`, false, {
|
|
2542
|
+
description: `Show help message for this command`
|
|
2543
|
+
});
|
|
2521
2544
|
async execute() {
|
|
2545
|
+
if (this.help) {
|
|
2546
|
+
this.context.stdout.write(
|
|
2547
|
+
this.constructor.usage?.toString() || "No help available\n"
|
|
2548
|
+
);
|
|
2549
|
+
return 0;
|
|
2550
|
+
}
|
|
2522
2551
|
const rootDir = process.cwd();
|
|
2523
2552
|
this.context.stdout.write(`Generating OpenAPI documentation...
|
|
2524
2553
|
`);
|
|
@@ -2583,9 +2612,8 @@ var init_GenerateApiDocsCommand = __esm({
|
|
|
2583
2612
|
}
|
|
2584
2613
|
}
|
|
2585
2614
|
}
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
const outputPath = import_path7.default.join(publicDir, "openapi.json");
|
|
2615
|
+
await fs6.mkdir(config_exports.config.get("private_path"), { recursive: true });
|
|
2616
|
+
const outputPath = import_path7.default.join(config_exports.config.get("private_path"), "openapi.json");
|
|
2589
2617
|
await fs6.writeFile(
|
|
2590
2618
|
outputPath,
|
|
2591
2619
|
JSON.stringify(openApiSpec, null, 2),
|
|
@@ -2597,6 +2625,20 @@ var init_GenerateApiDocsCommand = __esm({
|
|
|
2597
2625
|
);
|
|
2598
2626
|
this.context.stdout.write(`Total routes documented: ${routes.length}
|
|
2599
2627
|
`);
|
|
2628
|
+
let files_to_merge = config_exports.config.get("api_docs.merge_files");
|
|
2629
|
+
let final_api_docs = {};
|
|
2630
|
+
for (let file_path of files_to_merge) {
|
|
2631
|
+
let file_json = JSON.parse(await fs6.readFile(file_path, "utf8"));
|
|
2632
|
+
final_api_docs = import_neko_helper3.Arr.deepMerge(final_api_docs, file_json);
|
|
2633
|
+
}
|
|
2634
|
+
await fs6.writeFile(
|
|
2635
|
+
config_exports.config.get("api_docs.output"),
|
|
2636
|
+
JSON.stringify(final_api_docs, null, 2)
|
|
2637
|
+
);
|
|
2638
|
+
this.context.stdout.write(
|
|
2639
|
+
`wrote final open api document to : ${config_exports.config.get("api_docs.output")}
|
|
2640
|
+
`
|
|
2641
|
+
);
|
|
2600
2642
|
}
|
|
2601
2643
|
extractParameters(routePath) {
|
|
2602
2644
|
const paramRegex = /:([a-zA-Z0-9_]+)/g;
|
|
@@ -2630,7 +2672,7 @@ var init_generate = __esm({
|
|
|
2630
2672
|
});
|
|
2631
2673
|
|
|
2632
2674
|
// src/app/console/project/CreateProjectCommand.mts
|
|
2633
|
-
var import_clipanion10, import_change_case_all3, import_path8, fs7, import_url3, import_handlebars3, import_child_process, import_meta3, CreateProjectCommand;
|
|
2675
|
+
var import_clipanion10, import_change_case_all3, import_path8, fs7, import_url3, import_handlebars3, import_child_process, import_prompts, import_meta3, CreateProjectCommand;
|
|
2634
2676
|
var init_CreateProjectCommand = __esm({
|
|
2635
2677
|
"src/app/console/project/CreateProjectCommand.mts"() {
|
|
2636
2678
|
"use strict";
|
|
@@ -2641,6 +2683,7 @@ var init_CreateProjectCommand = __esm({
|
|
|
2641
2683
|
import_url3 = require("url");
|
|
2642
2684
|
import_handlebars3 = __toESM(require("handlebars"), 1);
|
|
2643
2685
|
import_child_process = require("child_process");
|
|
2686
|
+
import_prompts = require("@inquirer/prompts");
|
|
2644
2687
|
import_meta3 = {};
|
|
2645
2688
|
CreateProjectCommand = class extends import_clipanion10.Command {
|
|
2646
2689
|
static {
|
|
@@ -2688,6 +2731,27 @@ var init_CreateProjectCommand = __esm({
|
|
|
2688
2731
|
return 1;
|
|
2689
2732
|
} catch {
|
|
2690
2733
|
}
|
|
2734
|
+
const validation_library = await (0, import_prompts.select)({
|
|
2735
|
+
message: "Select a package you want for validation",
|
|
2736
|
+
choices: [
|
|
2737
|
+
{
|
|
2738
|
+
name: "Yup",
|
|
2739
|
+
value: "yup",
|
|
2740
|
+
description: "https://github.com/jquense/yup"
|
|
2741
|
+
},
|
|
2742
|
+
{
|
|
2743
|
+
name: "Zod",
|
|
2744
|
+
value: "zod",
|
|
2745
|
+
description: "https://zod.dev/"
|
|
2746
|
+
},
|
|
2747
|
+
new import_prompts.Separator(),
|
|
2748
|
+
{
|
|
2749
|
+
name: "None",
|
|
2750
|
+
value: "none",
|
|
2751
|
+
disabled: false
|
|
2752
|
+
}
|
|
2753
|
+
]
|
|
2754
|
+
});
|
|
2691
2755
|
await fs7.mkdir(projectPath, { recursive: true });
|
|
2692
2756
|
console.log(`Created project directory at: ${projectPath}`);
|
|
2693
2757
|
const dirname = typeof __dirname === "undefined" ? import_path8.default.dirname((0, import_url3.fileURLToPath)(import_meta3.url)) : __dirname;
|
|
@@ -2697,7 +2761,9 @@ var init_CreateProjectCommand = __esm({
|
|
|
2697
2761
|
}
|
|
2698
2762
|
console.log(`Using base project path: ${basePath}`);
|
|
2699
2763
|
const baseProjectPath = basePath;
|
|
2700
|
-
await this.processTplFolder(baseProjectPath, projectPath, {
|
|
2764
|
+
await this.processTplFolder(baseProjectPath, projectPath, {
|
|
2765
|
+
validation_library
|
|
2766
|
+
});
|
|
2701
2767
|
console.log(`Copied base project files to: ${projectPath}`);
|
|
2702
2768
|
const packageJsonPath = import_path8.default.join(projectPath, `package.json`);
|
|
2703
2769
|
const packageJson = JSON.parse(await fs7.readFile(packageJsonPath, `utf-8`));
|
|
@@ -2727,7 +2793,7 @@ var init_CreateProjectCommand = __esm({
|
|
|
2727
2793
|
await fs7.mkdir(destPath, { recursive: true });
|
|
2728
2794
|
await this.processTplFolder(srcPath, destPath, data);
|
|
2729
2795
|
} else if (file.name.endsWith(".tpl")) {
|
|
2730
|
-
await this.processTplFile(srcPath, destPath,
|
|
2796
|
+
await this.processTplFile(srcPath, destPath, data);
|
|
2731
2797
|
} else {
|
|
2732
2798
|
throw new Error(
|
|
2733
2799
|
"unexpected non tpl file: " + srcPath + " " + file.name
|
|
@@ -2736,6 +2802,7 @@ var init_CreateProjectCommand = __esm({
|
|
|
2736
2802
|
}
|
|
2737
2803
|
}
|
|
2738
2804
|
async processTplFile(src, dest, data = {}) {
|
|
2805
|
+
import_handlebars3.default.registerHelper("eq", (a, b) => a === b);
|
|
2739
2806
|
const compiledTemplate = import_handlebars3.default.compile(
|
|
2740
2807
|
(await fs7.readFile(src)).toString()
|
|
2741
2808
|
);
|
package/dist/bin/middlewares.cjs
CHANGED
|
@@ -472,7 +472,6 @@ var http_exports = {};
|
|
|
472
472
|
__reExport(http_exports, require("@devbro/neko-http"));
|
|
473
473
|
|
|
474
474
|
// src/facades.mts
|
|
475
|
-
var yup = __toESM(require("yup"), 1);
|
|
476
475
|
var import_neko_logger = require("@devbro/neko-logger");
|
|
477
476
|
|
|
478
477
|
// src/factories.mts
|
|
@@ -685,24 +684,6 @@ var httpServer = (0, import_neko_helper2.createSingleton)(() => {
|
|
|
685
684
|
res.end(JSON.stringify({ message: err.message, error: err.code }));
|
|
686
685
|
logger().warn({ msg: "HttpError: " + err.message, err });
|
|
687
686
|
return;
|
|
688
|
-
} else if (err instanceof yup.ValidationError) {
|
|
689
|
-
res.writeHead(422, { "Content-Type": "application/json" });
|
|
690
|
-
const errs = {};
|
|
691
|
-
err.inner.forEach((e) => {
|
|
692
|
-
const sanitizedParams = { ...e.params };
|
|
693
|
-
if (/passw/i.test(e.path)) {
|
|
694
|
-
sanitizedParams.value = "******";
|
|
695
|
-
sanitizedParams.originalValue = "******";
|
|
696
|
-
}
|
|
697
|
-
errs[e.path] = {
|
|
698
|
-
type: e.type,
|
|
699
|
-
message: e.message,
|
|
700
|
-
params: sanitizedParams
|
|
701
|
-
};
|
|
702
|
-
});
|
|
703
|
-
res.end(JSON.stringify({ message: "validation error", errors: errs }));
|
|
704
|
-
logger().warn({ msg: "ValidationError: " + err.message, err });
|
|
705
|
-
return;
|
|
706
687
|
} else {
|
|
707
688
|
logger().error({ msg: "Error: " + err.message, err });
|
|
708
689
|
}
|
package/dist/bin/queue.cjs
CHANGED
|
@@ -473,7 +473,6 @@ var http_exports = {};
|
|
|
473
473
|
__reExport(http_exports, require("@devbro/neko-http"));
|
|
474
474
|
|
|
475
475
|
// src/facades.mts
|
|
476
|
-
var yup = __toESM(require("yup"), 1);
|
|
477
476
|
var import_neko_logger = require("@devbro/neko-logger");
|
|
478
477
|
|
|
479
478
|
// src/factories.mts
|
|
@@ -583,24 +582,6 @@ var httpServer = (0, import_neko_helper.createSingleton)(() => {
|
|
|
583
582
|
res.end(JSON.stringify({ message: err.message, error: err.code }));
|
|
584
583
|
logger().warn({ msg: "HttpError: " + err.message, err });
|
|
585
584
|
return;
|
|
586
|
-
} else if (err instanceof yup.ValidationError) {
|
|
587
|
-
res.writeHead(422, { "Content-Type": "application/json" });
|
|
588
|
-
const errs = {};
|
|
589
|
-
err.inner.forEach((e) => {
|
|
590
|
-
const sanitizedParams = { ...e.params };
|
|
591
|
-
if (/passw/i.test(e.path)) {
|
|
592
|
-
sanitizedParams.value = "******";
|
|
593
|
-
sanitizedParams.originalValue = "******";
|
|
594
|
-
}
|
|
595
|
-
errs[e.path] = {
|
|
596
|
-
type: e.type,
|
|
597
|
-
message: e.message,
|
|
598
|
-
params: sanitizedParams
|
|
599
|
-
};
|
|
600
|
-
});
|
|
601
|
-
res.end(JSON.stringify({ message: "validation error", errors: errs }));
|
|
602
|
-
logger().warn({ msg: "ValidationError: " + err.message, err });
|
|
603
|
-
return;
|
|
604
585
|
} else {
|
|
605
586
|
logger().error({ msg: "Error: " + err.message, err });
|
|
606
587
|
}
|
package/dist/bin/router.cjs
CHANGED
|
@@ -47,7 +47,6 @@ __export(router_exports, {
|
|
|
47
47
|
Put: () => Put,
|
|
48
48
|
Route: () => Route,
|
|
49
49
|
Router: () => Router,
|
|
50
|
-
ValidatedRequest: () => ValidatedRequest,
|
|
51
50
|
createParamDecorator: () => createParamDecorator,
|
|
52
51
|
runNext: () => runNext
|
|
53
52
|
});
|
|
@@ -614,13 +613,6 @@ function Param(param_name) {
|
|
|
614
613
|
});
|
|
615
614
|
}
|
|
616
615
|
__name(Param, "Param");
|
|
617
|
-
function ValidatedRequest(validationRules) {
|
|
618
|
-
return createParamDecorator(async () => {
|
|
619
|
-
const rc = await (typeof validationRules === "function" ? validationRules() : validationRules).noUnknown().validate((0, import_neko_context.ctx)().get("request").body, { abortEarly: false });
|
|
620
|
-
return rc;
|
|
621
|
-
});
|
|
622
|
-
}
|
|
623
|
-
__name(ValidatedRequest, "ValidatedRequest");
|
|
624
616
|
function ApiDocumentation(req, res) {
|
|
625
617
|
let open_api_url = import_neko_config.config.get("api_doc_url");
|
|
626
618
|
let html = `<!DOCTYPE html>
|
|
@@ -669,7 +661,6 @@ __name(ApiDocumentation, "ApiDocumentation");
|
|
|
669
661
|
Put,
|
|
670
662
|
Route,
|
|
671
663
|
Router,
|
|
672
|
-
ValidatedRequest,
|
|
673
664
|
createParamDecorator,
|
|
674
665
|
runNext
|
|
675
666
|
});
|
package/dist/facades.mjs
CHANGED
|
@@ -12,7 +12,6 @@ import {
|
|
|
12
12
|
import { config } from "@devbro/neko-config";
|
|
13
13
|
import { Cli } from "clipanion";
|
|
14
14
|
import { HttpServer, HttpError } from "./http.mjs";
|
|
15
|
-
import * as yup from "yup";
|
|
16
15
|
import { Logger } from "@devbro/neko-logger";
|
|
17
16
|
import { CacheProviderFactory } from "./factories.mjs";
|
|
18
17
|
import { Cache } from "@devbro/neko-cache";
|
|
@@ -54,24 +53,6 @@ const httpServer = createSingleton(() => {
|
|
|
54
53
|
res.end(JSON.stringify({ message: err.message, error: err.code }));
|
|
55
54
|
logger().warn({ msg: "HttpError: " + err.message, err });
|
|
56
55
|
return;
|
|
57
|
-
} else if (err instanceof yup.ValidationError) {
|
|
58
|
-
res.writeHead(422, { "Content-Type": "application/json" });
|
|
59
|
-
const errs = {};
|
|
60
|
-
err.inner.forEach((e) => {
|
|
61
|
-
const sanitizedParams = { ...e.params };
|
|
62
|
-
if (/passw/i.test(e.path)) {
|
|
63
|
-
sanitizedParams.value = "******";
|
|
64
|
-
sanitizedParams.originalValue = "******";
|
|
65
|
-
}
|
|
66
|
-
errs[e.path] = {
|
|
67
|
-
type: e.type,
|
|
68
|
-
message: e.message,
|
|
69
|
-
params: sanitizedParams
|
|
70
|
-
};
|
|
71
|
-
});
|
|
72
|
-
res.end(JSON.stringify({ message: "validation error", errors: errs }));
|
|
73
|
-
logger().warn({ msg: "ValidationError: " + err.message, err });
|
|
74
|
-
return;
|
|
75
56
|
} else {
|
|
76
57
|
logger().error({ msg: "Error: " + err.message, err });
|
|
77
58
|
}
|
package/dist/facades.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/facades.mts"],"sourcesContent":["import { Router } from \"./router.mjs\";\nimport { Schedule, Scheduler } from \"@devbro/neko-scheduler\";\nimport { createSingleton } from \"@devbro/neko-helper\";\nimport { ctx, ctxSafe } from \"@devbro/neko-context\";\nimport { Connection } from \"@devbro/neko-sql\";\nimport { Storage, StorageProviderFactory } from \"@devbro/neko-storage\";\nimport {\n Mailer,\n MailerProvider,\n MailerProviderFactory,\n} from \"@devbro/neko-mailer\";\nimport { config } from \"@devbro/neko-config\";\nimport { Cli } from \"clipanion\";\nimport { HttpServer, HttpError } from \"./http.mjs\";\nimport * as yup from \"yup\";\nimport { Logger } from \"@devbro/neko-logger\";\nimport { CacheProviderFactory } from \"./factories.mjs\";\nimport { Cache } from \"@devbro/neko-cache\";\nimport { QueueConnection, QueueTransportFactory } from \"@devbro/neko-queue\";\n\nexport const router = createSingleton<Router>(() => new Router());\nexport const scheduler = createSingleton<Scheduler>(() => {\n const rc = new Scheduler();\n rc.setErrorHandler((err: any, job: Schedule) => {\n logger().error({\n msg: \"Scheduled job error\",\n err,\n job_name: job.getName(),\n });\n });\n return rc;\n});\nexport const db = (label = \"default\") =>\n ctx().getOrThrow<Connection>([\"database\", label]);\n\nexport const storage = createSingleton<Storage>((label: string = \"default\") => {\n let storage_config: any = config.get([\"storages\", label].join(\".\"));\n\n const provider = StorageProviderFactory.create(\n storage_config.provider,\n storage_config.config,\n );\n\n return new Storage(provider);\n});\n\nexport const cli = createSingleton<Cli>(() => {\n const [node, app, ...args] = process.argv;\n return new Cli({\n binaryLabel: `My Application`,\n binaryName: `${node} ${app}`,\n binaryVersion: `1.0.0`,\n });\n});\n\nexport const httpServer = createSingleton<HttpServer>(() => {\n const server = new HttpServer();\n\n server.setErrorHandler(async (err: Error, req: any, res: any) => {\n if (err instanceof HttpError) {\n res.writeHead(err.statusCode, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ message: err.message, error: err.code }));\n logger().warn({ msg: \"HttpError: \" + err.message, err });\n return;\n } else
|
|
1
|
+
{"version":3,"sources":["../src/facades.mts"],"sourcesContent":["import { Router } from \"./router.mjs\";\nimport { Schedule, Scheduler } from \"@devbro/neko-scheduler\";\nimport { createSingleton } from \"@devbro/neko-helper\";\nimport { ctx, ctxSafe } from \"@devbro/neko-context\";\nimport { Connection } from \"@devbro/neko-sql\";\nimport { Storage, StorageProviderFactory } from \"@devbro/neko-storage\";\nimport {\n Mailer,\n MailerProvider,\n MailerProviderFactory,\n} from \"@devbro/neko-mailer\";\nimport { config } from \"@devbro/neko-config\";\nimport { Cli } from \"clipanion\";\nimport { HttpServer, HttpError } from \"./http.mjs\";\nimport * as yup from \"yup\";\nimport { Logger } from \"@devbro/neko-logger\";\nimport { CacheProviderFactory } from \"./factories.mjs\";\nimport { Cache } from \"@devbro/neko-cache\";\nimport { QueueConnection, QueueTransportFactory } from \"@devbro/neko-queue\";\n\nexport const router = createSingleton<Router>(() => new Router());\nexport const scheduler = createSingleton<Scheduler>(() => {\n const rc = new Scheduler();\n rc.setErrorHandler((err: any, job: Schedule) => {\n logger().error({\n msg: \"Scheduled job error\",\n err,\n job_name: job.getName(),\n });\n });\n return rc;\n});\nexport const db = (label = \"default\") =>\n ctx().getOrThrow<Connection>([\"database\", label]);\n\nexport const storage = createSingleton<Storage>((label: string = \"default\") => {\n let storage_config: any = config.get([\"storages\", label].join(\".\"));\n\n const provider = StorageProviderFactory.create(\n storage_config.provider,\n storage_config.config,\n );\n\n return new Storage(provider);\n});\n\nexport const cli = createSingleton<Cli>(() => {\n const [node, app, ...args] = process.argv;\n return new Cli({\n binaryLabel: `My Application`,\n binaryName: `${node} ${app}`,\n binaryVersion: `1.0.0`,\n });\n});\n\nexport const httpServer = createSingleton<HttpServer>(() => {\n const server = new HttpServer();\n\n server.setErrorHandler(async (err: Error, req: any, res: any) => {\n if (err instanceof HttpError) {\n res.writeHead(err.statusCode, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ message: err.message, error: err.code }));\n logger().warn({ msg: \"HttpError: \" + err.message, err });\n return;\n } else {\n logger().error({ msg: \"Error: \" + err.message, err });\n }\n res.writeHead(500, { \"Content-Type\": \"\" });\n res.end(JSON.stringify({ error: \"Internal Server Error\" }));\n });\n server.setRouter(router());\n\n return server;\n});\n\nexport const logger = createSingleton<Logger>((label) => {\n const logger_config: any = config.get([\"loggers\", label].join(\".\"));\n const rc = new Logger(logger_config);\n rc.setExtrasFunction((message: any) => {\n message.requestId = ctxSafe()?.get(\"requestId\") || \"N/A\";\n return message;\n });\n\n return rc;\n});\n\nexport const mailer = createSingleton((label) => {\n const mailer_config: any = config.get([\"mailer\", label].join(\".\"));\n\n const provider: MailerProvider = MailerProviderFactory.create(\n mailer_config.provider,\n mailer_config.config,\n );\n\n const rc = new Mailer(provider);\n return rc;\n});\n\nexport const queue = createSingleton((label) => {\n const queue_config: any = config.get([\"queues\", label].join(\".\"));\n if (!queue_config) {\n throw new Error(`Queue configuration for '${label}' not found`);\n }\n const provider = QueueTransportFactory.create(\n queue_config.provider,\n queue_config.config,\n );\n const rc = new QueueConnection(provider);\n return rc;\n});\n\nexport const cache = createSingleton((label) => {\n const cache_config: any = config.get([\"caches\", label].join(\".\"));\n if (!cache_config) {\n throw new Error(`Cache configuration for '${label}' not found`);\n }\n const provider = CacheProviderFactory.create(\n cache_config.provider,\n cache_config.config,\n );\n\n return new Cache(provider);\n});\n"],"mappings":";;AAAA,SAAS,cAAc;AACvB,SAAmB,iBAAiB;AACpC,SAAS,uBAAuB;AAChC,SAAS,KAAK,eAAe;AAE7B,SAAS,SAAS,8BAA8B;AAChD;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,WAAW;AACpB,SAAS,YAAY,iBAAiB;AAEtC,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,aAAa;AACtB,SAAS,iBAAiB,6BAA6B;AAEhD,MAAM,SAAS,gBAAwB,MAAM,IAAI,OAAO,CAAC;AACzD,MAAM,YAAY,gBAA2B,MAAM;AACxD,QAAM,KAAK,IAAI,UAAU;AACzB,KAAG,gBAAgB,CAAC,KAAU,QAAkB;AAC9C,WAAO,EAAE,MAAM;AAAA,MACb,KAAK;AAAA,MACL;AAAA,MACA,UAAU,IAAI,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH,CAAC;AACD,SAAO;AACT,CAAC;AACM,MAAM,KAAK,wBAAC,QAAQ,cACzB,IAAI,EAAE,WAAuB,CAAC,YAAY,KAAK,CAAC,GADhC;AAGX,MAAM,UAAU,gBAAyB,CAAC,QAAgB,cAAc;AAC7E,MAAI,iBAAsB,OAAO,IAAI,CAAC,YAAY,KAAK,EAAE,KAAK,GAAG,CAAC;AAElE,QAAM,WAAW,uBAAuB;AAAA,IACtC,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AAEA,SAAO,IAAI,QAAQ,QAAQ;AAC7B,CAAC;AAEM,MAAM,MAAM,gBAAqB,MAAM;AAC5C,QAAM,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,QAAQ;AACrC,SAAO,IAAI,IAAI;AAAA,IACb,aAAa;AAAA,IACb,YAAY,GAAG,IAAI,IAAI,GAAG;AAAA,IAC1B,eAAe;AAAA,EACjB,CAAC;AACH,CAAC;AAEM,MAAM,aAAa,gBAA4B,MAAM;AAC1D,QAAM,SAAS,IAAI,WAAW;AAE9B,SAAO,gBAAgB,OAAO,KAAY,KAAU,QAAa;AAC/D,QAAI,eAAe,WAAW;AAC5B,UAAI,UAAU,IAAI,YAAY,EAAE,gBAAgB,mBAAmB,CAAC;AACpE,UAAI,IAAI,KAAK,UAAU,EAAE,SAAS,IAAI,SAAS,OAAO,IAAI,KAAK,CAAC,CAAC;AACjE,aAAO,EAAE,KAAK,EAAE,KAAK,gBAAgB,IAAI,SAAS,IAAI,CAAC;AACvD;AAAA,IACF,OAAO;AACL,aAAO,EAAE,MAAM,EAAE,KAAK,YAAY,IAAI,SAAS,IAAI,CAAC;AAAA,IACtD;AACA,QAAI,UAAU,KAAK,EAAE,gBAAgB,GAAG,CAAC;AACzC,QAAI,IAAI,KAAK,UAAU,EAAE,OAAO,wBAAwB,CAAC,CAAC;AAAA,EAC5D,CAAC;AACD,SAAO,UAAU,OAAO,CAAC;AAEzB,SAAO;AACT,CAAC;AAEM,MAAM,SAAS,gBAAwB,CAAC,UAAU;AACvD,QAAM,gBAAqB,OAAO,IAAI,CAAC,WAAW,KAAK,EAAE,KAAK,GAAG,CAAC;AAClE,QAAM,KAAK,IAAI,OAAO,aAAa;AACnC,KAAG,kBAAkB,CAAC,YAAiB;AACrC,YAAQ,YAAY,QAAQ,GAAG,IAAI,WAAW,KAAK;AACnD,WAAO;AAAA,EACT,CAAC;AAED,SAAO;AACT,CAAC;AAEM,MAAM,SAAS,gBAAgB,CAAC,UAAU;AAC/C,QAAM,gBAAqB,OAAO,IAAI,CAAC,UAAU,KAAK,EAAE,KAAK,GAAG,CAAC;AAEjE,QAAM,WAA2B,sBAAsB;AAAA,IACrD,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAEA,QAAM,KAAK,IAAI,OAAO,QAAQ;AAC9B,SAAO;AACT,CAAC;AAEM,MAAM,QAAQ,gBAAgB,CAAC,UAAU;AAC9C,QAAM,eAAoB,OAAO,IAAI,CAAC,UAAU,KAAK,EAAE,KAAK,GAAG,CAAC;AAChE,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,4BAA4B,KAAK,aAAa;AAAA,EAChE;AACA,QAAM,WAAW,sBAAsB;AAAA,IACrC,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AACA,QAAM,KAAK,IAAI,gBAAgB,QAAQ;AACvC,SAAO;AACT,CAAC;AAEM,MAAM,QAAQ,gBAAgB,CAAC,UAAU;AAC9C,QAAM,eAAoB,OAAO,IAAI,CAAC,UAAU,KAAK,EAAE,KAAK,GAAG,CAAC;AAChE,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,4BAA4B,KAAK,aAAa;AAAA,EAChE;AACA,QAAM,WAAW,qBAAqB;AAAA,IACpC,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAEA,SAAO,IAAI,MAAM,QAAQ;AAC3B,CAAC;","names":[]}
|
package/dist/router.d.mts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { BaseModel } from '@devbro/neko-orm';
|
|
2
2
|
import { Request, Response } from '@devbro/neko-router';
|
|
3
3
|
export * from '@devbro/neko-router';
|
|
4
|
-
import * as yup from 'yup';
|
|
5
4
|
|
|
6
5
|
declare function Model(model: typeof BaseModel, param_name?: string, model_field?: string): ParameterDecorator;
|
|
7
6
|
declare function Param(param_name: string): ParameterDecorator;
|
|
8
|
-
declare function ValidatedRequest(validationRules: yup.ObjectSchema<any> | (() => yup.ObjectSchema<any>)): ParameterDecorator;
|
|
9
7
|
declare function ApiDocumentation(req: Request, res: Response): string;
|
|
10
8
|
|
|
11
|
-
export { ApiDocumentation, Model, Param
|
|
9
|
+
export { ApiDocumentation, Model, Param };
|
package/dist/router.mjs
CHANGED
|
@@ -23,13 +23,6 @@ function Param(param_name) {
|
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
__name(Param, "Param");
|
|
26
|
-
function ValidatedRequest(validationRules) {
|
|
27
|
-
return createParamDecorator(async () => {
|
|
28
|
-
const rc = await (typeof validationRules === "function" ? validationRules() : validationRules).noUnknown().validate(ctx().get("request").body, { abortEarly: false });
|
|
29
|
-
return rc;
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
__name(ValidatedRequest, "ValidatedRequest");
|
|
33
26
|
function ApiDocumentation(req, res) {
|
|
34
27
|
let open_api_url = config.get("api_doc_url");
|
|
35
28
|
let html = `<!DOCTYPE html>
|
|
@@ -63,7 +56,6 @@ __name(ApiDocumentation, "ApiDocumentation");
|
|
|
63
56
|
export {
|
|
64
57
|
ApiDocumentation,
|
|
65
58
|
Model,
|
|
66
|
-
Param
|
|
67
|
-
ValidatedRequest
|
|
59
|
+
Param
|
|
68
60
|
};
|
|
69
61
|
//# sourceMappingURL=router.mjs.map
|
package/dist/router.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/router.mts"],"sourcesContent":["import { ctx } from \"@devbro/neko-context\";\nimport { BaseModel } from \"@devbro/neko-orm\";\nimport { Request, Response } from \"@devbro/neko-router\";\nimport { HttpNotFoundError } from \"@devbro/neko-http/errors\";\nimport { createParamDecorator } from \"@devbro/neko-router\";\nimport * as yup from \"yup\";\nimport { config } from \"@devbro/neko-config\";\nexport * from \"@devbro/neko-router\";\n\nexport function Model(\n model: typeof BaseModel,\n param_name: string = \"id\",\n model_field: string = \"id\",\n): ParameterDecorator {\n return createParamDecorator(async () => {\n let rc = await model.findOne({\n [model_field]: ctx().get<Request>(\"request\").params[param_name],\n });\n if (!rc) {\n throw new HttpNotFoundError(\"Object not found\", \"OBJECT_NOT_FOUND\");\n }\n\n return rc;\n });\n}\n\nexport function Param(param_name: string): ParameterDecorator {\n return createParamDecorator(() => {\n return ctx().get<Request>(\"request\").params[param_name] || undefined;\n });\n}\n\nexport function
|
|
1
|
+
{"version":3,"sources":["../src/router.mts"],"sourcesContent":["import { ctx } from \"@devbro/neko-context\";\nimport { BaseModel } from \"@devbro/neko-orm\";\nimport { Request, Response } from \"@devbro/neko-router\";\nimport { HttpNotFoundError } from \"@devbro/neko-http/errors\";\nimport { createParamDecorator } from \"@devbro/neko-router\";\nimport * as yup from \"yup\";\nimport { config } from \"@devbro/neko-config\";\nexport * from \"@devbro/neko-router\";\n\nexport function Model(\n model: typeof BaseModel,\n param_name: string = \"id\",\n model_field: string = \"id\",\n): ParameterDecorator {\n return createParamDecorator(async () => {\n let rc = await model.findOne({\n [model_field]: ctx().get<Request>(\"request\").params[param_name],\n });\n if (!rc) {\n throw new HttpNotFoundError(\"Object not found\", \"OBJECT_NOT_FOUND\");\n }\n\n return rc;\n });\n}\n\nexport function Param(param_name: string): ParameterDecorator {\n return createParamDecorator(() => {\n return ctx().get<Request>(\"request\").params[param_name] || undefined;\n });\n}\n\nexport function ApiDocumentation(req: Request, res: Response) {\n let open_api_url: string = config.get(\"api_doc_url\");\n let html = `<!DOCTYPE html>\n<html>\n <head>\n <title>Redoc</title>\n <!-- needed for adaptive design -->\n <meta charset=\"utf-8\"/>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <link href=\"https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700\" rel=\"stylesheet\">\n\n <!--\n Redoc doesn't change outer page styles\n -->\n <style>\n body {\n margin: 0;\n padding: 0;\n }\n </style>\n </head>\n <body>\n <redoc spec-url='${open_api_url}'></redoc>\n <script src=\"https://cdn.redoc.ly/redoc/latest/bundles/redoc.standalone.js\"> </script>\n </body>\n</html>`;\n\n res.setHeader(\"Content-Type\", \"text/html\");\n return html;\n}\n"],"mappings":";;AAAA,SAAS,WAAW;AAGpB,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AAErC,SAAS,cAAc;AACvB,cAAc;AAEP,SAAS,MACd,OACA,aAAqB,MACrB,cAAsB,MACF;AACpB,SAAO,qBAAqB,YAAY;AACtC,QAAI,KAAK,MAAM,MAAM,QAAQ;AAAA,MAC3B,CAAC,WAAW,GAAG,IAAI,EAAE,IAAa,SAAS,EAAE,OAAO,UAAU;AAAA,IAChE,CAAC;AACD,QAAI,CAAC,IAAI;AACP,YAAM,IAAI,kBAAkB,oBAAoB,kBAAkB;AAAA,IACpE;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAfgB;AAiBT,SAAS,MAAM,YAAwC;AAC5D,SAAO,qBAAqB,MAAM;AAChC,WAAO,IAAI,EAAE,IAAa,SAAS,EAAE,OAAO,UAAU,KAAK;AAAA,EAC7D,CAAC;AACH;AAJgB;AAMT,SAAS,iBAAiB,KAAc,KAAe;AAC5D,MAAI,eAAuB,OAAO,IAAI,aAAa;AACnD,MAAI,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAoBU,YAAY;AAAA;AAAA;AAAA;AAKjC,MAAI,UAAU,gBAAgB,WAAW;AACzC,SAAO;AACT;AA7BgB;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devbro/pashmak",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.45",
|
|
4
4
|
"description": "testing application for the entire repo",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -126,12 +126,6 @@
|
|
|
126
126
|
"typescript": "^5.8.3"
|
|
127
127
|
},
|
|
128
128
|
"dependencies": {
|
|
129
|
-
"bcryptjs": "^3.0.2",
|
|
130
|
-
"change-case-all": "^2.1.0",
|
|
131
|
-
"clipanion": "^4.0.0-rc.4",
|
|
132
|
-
"dotenv": "^16.5.0",
|
|
133
|
-
"handlebars": "^4.7.8",
|
|
134
|
-
"jsonwebtoken": "^9.0.2",
|
|
135
129
|
"@devbro/neko-cache": "0.1.*",
|
|
136
130
|
"@devbro/neko-config": "0.1.*",
|
|
137
131
|
"@devbro/neko-context": "0.1.*",
|
|
@@ -139,17 +133,24 @@
|
|
|
139
133
|
"@devbro/neko-http": "0.1.*",
|
|
140
134
|
"@devbro/neko-logger": "0.1.*",
|
|
141
135
|
"@devbro/neko-mailer": "0.1.*",
|
|
142
|
-
"@devbro/neko-queue": "0.1.*",
|
|
143
136
|
"@devbro/neko-orm": "0.1.*",
|
|
137
|
+
"@devbro/neko-queue": "0.1.*",
|
|
144
138
|
"@devbro/neko-scheduler": "0.1.*",
|
|
145
139
|
"@devbro/neko-sql": "0.1.*",
|
|
146
140
|
"@devbro/neko-storage": "0.1.*",
|
|
141
|
+
"@inquirer/prompts": "^7.10.0",
|
|
142
|
+
"@types/pluralize": "^0.0.33",
|
|
143
|
+
"bcryptjs": "^3.0.2",
|
|
144
|
+
"change-case-all": "^2.1.0",
|
|
145
|
+
"clipanion": "^4.0.0-rc.4",
|
|
146
|
+
"dotenv": "^16.5.0",
|
|
147
|
+
"handlebars": "^4.7.8",
|
|
148
|
+
"jsonwebtoken": "^9.0.2",
|
|
147
149
|
"pg-pool": "3.10.0",
|
|
150
|
+
"pluralize": "^8.0.0",
|
|
148
151
|
"ts-jest": "^29.3.4",
|
|
149
152
|
"tsconfig-paths": "^4.2.0",
|
|
150
|
-
"yup": "^1.6.1"
|
|
151
|
-
"@types/pluralize": "^0.0.33",
|
|
152
|
-
"pluralize": "^8.0.0"
|
|
153
|
+
"yup": "^1.6.1"
|
|
153
154
|
},
|
|
154
155
|
"directories": {
|
|
155
156
|
"doc": "docs",
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { HttpBadRequestError } from "@devbro/pashmak/http";
|
|
2
|
-
import jwt from "jsonwebtoken";
|
|
3
|
-
import { config } from "@devbro/pashmak/config";
|
|
4
|
-
|
|
5
|
-
export function createJwtToken(data: any, token_params: jwt.SignOptions = {}) {
|
|
6
|
-
const secret = config.get("jwt.secret") as string;
|
|
7
|
-
const token_params2 = config.get("jwt.options") as jwt.SignOptions;
|
|
8
|
-
const token = jwt.sign(data, secret, { ...token_params2, ...token_params });
|
|
9
|
-
|
|
10
|
-
if (!token) {
|
|
11
|
-
throw new Error("Unable to sign token !!");
|
|
12
|
-
}
|
|
13
|
-
return token;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export async function decodeJwtToken(token: string) {
|
|
17
|
-
if (await jwt.verify(token, config.get("jwt.public"))) {
|
|
18
|
-
return await jwt.decode(token);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (await jwt.verify(token, config.get("jwt.public_retired"))) {
|
|
22
|
-
return await jwt.decode(token);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
throw new HttpBadRequestError(
|
|
26
|
-
"bad token. invalid, expired, or signed with wrong key.",
|
|
27
|
-
);
|
|
28
|
-
}
|