@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.
Files changed (47) hide show
  1. package/dist/app/console/generate/GenerateApiDocsCommand.d.mts +4 -1
  2. package/dist/app/console/generate/GenerateApiDocsCommand.mjs +56 -4
  3. package/dist/app/console/generate/GenerateApiDocsCommand.mjs.map +1 -1
  4. package/dist/app/console/project/CreateProjectCommand.mjs +27 -2
  5. package/dist/app/console/project/CreateProjectCommand.mjs.map +1 -1
  6. package/dist/app/console/project/base_project/package.json.tpl +7 -2
  7. package/dist/app/console/project/base_project/src/app/queues/index.ts.tpl +9 -0
  8. package/dist/app/console/project/base_project/src/config/caches.ts.tpl +2 -4
  9. package/dist/app/console/project/base_project/src/config/databases.ts.tpl +7 -9
  10. package/dist/app/console/project/base_project/src/config/default.mts.tpl +17 -3
  11. package/dist/app/console/project/base_project/src/config/loggers.ts.tpl +6 -8
  12. package/dist/app/console/project/base_project/src/config/mailer.ts.tpl +15 -16
  13. package/dist/app/console/project/base_project/src/config/queues.ts.tpl +2 -4
  14. package/dist/app/console/project/base_project/src/config/storages.ts.tpl +5 -4
  15. package/dist/app/console/project/base_project/src/helpers/QueryKit.ts.tpl +175 -0
  16. package/dist/app/console/project/base_project/src/helpers/index.ts.tpl +96 -0
  17. package/dist/app/console/project/base_project/src/helpers/validation.ts.tpl +26 -0
  18. package/dist/app/console/project/base_project/src/initialize.ts.tpl +64 -7
  19. package/dist/app/console/project/base_project/src/middlewares.ts.tpl +1 -1
  20. package/dist/bin/app/console/DefaultCommand.cjs +0 -19
  21. package/dist/bin/app/console/KeyGenerateCommand.cjs +0 -19
  22. package/dist/bin/app/console/StartCommand.cjs +0 -19
  23. package/dist/bin/app/console/generate/GenerateApiDocsCommand.cjs +62 -24
  24. package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +0 -19
  25. package/dist/bin/app/console/generate/index.cjs +62 -24
  26. package/dist/bin/app/console/index.cjs +89 -26
  27. package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +0 -19
  28. package/dist/bin/app/console/migrate/MigrateCommand.cjs +0 -19
  29. package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +0 -19
  30. package/dist/bin/app/console/migrate/index.cjs +0 -19
  31. package/dist/bin/app/console/project/CreateProjectCommand.cjs +27 -2
  32. package/dist/bin/app/console/queue/GenerateQueueMigrateCommand.cjs +0 -19
  33. package/dist/bin/bin/pashmak_cli.cjs +27 -2
  34. package/dist/bin/cache.cjs +0 -19
  35. package/dist/bin/facades.cjs +0 -19
  36. package/dist/bin/factories.cjs +0 -19
  37. package/dist/bin/index.cjs +96 -29
  38. package/dist/bin/middlewares.cjs +0 -19
  39. package/dist/bin/queue.cjs +0 -19
  40. package/dist/bin/router.cjs +0 -9
  41. package/dist/facades.mjs +0 -19
  42. package/dist/facades.mjs.map +1 -1
  43. package/dist/router.d.mts +1 -3
  44. package/dist/router.mjs +1 -9
  45. package/dist/router.mjs.map +1 -1
  46. package/package.json +12 -11
  47. package/dist/app/console/project/base_project/src/helpers.ts.tpl +0 -28
@@ -635,8 +635,8 @@ var init_queue = __esm({
635
635
  }
636
636
  });
637
637
  }, "processMessage");
638
- constructor(config11 = {}) {
639
- this.config = { ...this.config, ...config11 };
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, yup, import_neko_logger, import_neko_cache2, import_neko_queue2, router, scheduler, db, storage, cli, httpServer, logger, mailer, queue, cache;
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
- const publicDir = import_path7.default.join(rootDir, "public");
2587
- await fs6.mkdir(publicDir, { recursive: true });
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
  );
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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 if (err instanceof yup.ValidationError) {\n res.writeHead(422, { \"Content-Type\": \"application/json\" });\n const errs: any = {};\n err.inner.forEach((e: yup.ValidationError) => {\n // Sanitize sensitive fields\n const sanitizedParams = { ...e.params };\n if (/passw/i.test(e.path!)) {\n sanitizedParams.value = \"******\";\n sanitizedParams.originalValue = \"******\";\n }\n\n errs[e.path!] = {\n type: e.type,\n message: e.message,\n params: sanitizedParams,\n };\n });\n\n res.end(JSON.stringify({ message: \"validation error\", errors: errs }));\n logger().warn({ msg: \"ValidationError: \" + 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":"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","names":[]}
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":"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","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, ValidatedRequest };
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
@@ -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 ValidatedRequest(\n validationRules: yup.ObjectSchema<any> | (() => yup.ObjectSchema<any>),\n): ParameterDecorator {\n return createParamDecorator(async () => {\n const rc = await (\n typeof validationRules === \"function\"\n ? validationRules()\n : validationRules\n )\n .noUnknown()\n .validate(ctx().get<Request>(\"request\").body, { abortEarly: false });\n\n return rc;\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,iBACd,iBACoB;AACpB,SAAO,qBAAqB,YAAY;AACtC,UAAM,KAAK,OACT,OAAO,oBAAoB,aACvB,gBAAgB,IAChB,iBAEH,UAAU,EACV,SAAS,IAAI,EAAE,IAAa,SAAS,EAAE,MAAM,EAAE,YAAY,MAAM,CAAC;AAErE,WAAO;AAAA,EACT,CAAC;AACH;AAdgB;AAgBT,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":[]}
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.43",
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
- }