@devbro/pashmak 0.1.46 → 0.1.48

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.
@@ -180,20 +180,18 @@ var init_CompiledRoute = __esm({
180
180
  const header_content_type = res.getHeader("Content-Type");
181
181
  if (controller_rc instanceof import_stream.Stream || Buffer.isBuffer(controller_rc)) {
182
182
  await this.writeAsync(res, controller_rc);
183
- res.end();
184
183
  } else if (!header_content_type && typeof controller_rc === "object") {
185
184
  res.setHeader("Content-Type", "application/json");
186
- res.end(this.convertToString(controller_rc));
185
+ res.write(this.convertToString(controller_rc));
187
186
  } else if (!header_content_type) {
188
187
  res.setHeader("Content-Type", "text/plain");
189
- res.end(this.convertToString(controller_rc));
188
+ res.write(this.convertToString(controller_rc));
190
189
  } else {
191
- res.end(this.convertToString(controller_rc));
190
+ res.write(this.convertToString(controller_rc));
192
191
  }
193
192
  return;
194
193
  } else {
195
194
  res.statusCode = [200].includes(res.statusCode) ? 204 : res.statusCode;
196
- res.end();
197
195
  }
198
196
  }
199
197
  async writeAsync(res, chunk) {
@@ -557,10 +555,29 @@ var init_router = __esm({
557
555
 
558
556
  // src/http.mts
559
557
  var http_exports = {};
558
+ __export(http_exports, {
559
+ handleHttpErrors: () => handleHttpErrors
560
+ });
561
+ async function handleHttpErrors(err, req, res) {
562
+ if (err instanceof import_neko_http.HttpError) {
563
+ res.writeHead(err.statusCode, { "Content-Type": "application/json" });
564
+ res.write(JSON.stringify({ message: err.message, error: err.code }));
565
+ logger().warn({ msg: "HttpError: " + err.message, err });
566
+ return;
567
+ } else {
568
+ logger().error({ msg: "Error: " + err.message, err });
569
+ }
570
+ res.writeHead(500, { "Content-Type": "application/json" });
571
+ res.write(JSON.stringify({ error: "Internal Server Error" }));
572
+ }
573
+ var import_neko_http;
560
574
  var init_http = __esm({
561
575
  "src/http.mts"() {
562
576
  "use strict";
577
+ import_neko_http = require("@devbro/neko-http");
578
+ init_facades();
563
579
  __reExport(http_exports, require("@devbro/neko-http"));
580
+ __name(handleHttpErrors, "handleHttpErrors");
564
581
  }
565
582
  });
566
583
 
@@ -795,18 +812,7 @@ var init_facades = __esm({
795
812
  });
796
813
  httpServer = (0, import_neko_helper2.createSingleton)(() => {
797
814
  const server = new http_exports.HttpServer();
798
- server.setErrorHandler(async (err, req, res) => {
799
- if (err instanceof http_exports.HttpError) {
800
- res.writeHead(err.statusCode, { "Content-Type": "application/json" });
801
- res.end(JSON.stringify({ message: err.message, error: err.code }));
802
- logger().warn({ msg: "HttpError: " + err.message, err });
803
- return;
804
- } else {
805
- logger().error({ msg: "Error: " + err.message, err });
806
- }
807
- res.writeHead(500, { "Content-Type": "" });
808
- res.end(JSON.stringify({ error: "Internal Server Error" }));
809
- });
815
+ server.setErrorHandler(handleHttpErrors);
810
816
  server.setRouter(router());
811
817
  return server;
812
818
  });
@@ -837,8 +843,7 @@ var init_facades = __esm({
837
843
  queue_config.provider,
838
844
  queue_config.config
839
845
  );
840
- const rc = new import_neko_queue2.QueueConnection(provider);
841
- return rc;
846
+ return new import_neko_queue2.QueueConnection(provider);
842
847
  });
843
848
  cache = (0, import_neko_helper2.createSingleton)((label) => {
844
849
  const cache_config = import_neko_config.config.get(["caches", label].join("."));
@@ -159,20 +159,18 @@ var CompiledRoute = class {
159
159
  const header_content_type = res.getHeader("Content-Type");
160
160
  if (controller_rc instanceof import_stream.Stream || Buffer.isBuffer(controller_rc)) {
161
161
  await this.writeAsync(res, controller_rc);
162
- res.end();
163
162
  } else if (!header_content_type && typeof controller_rc === "object") {
164
163
  res.setHeader("Content-Type", "application/json");
165
- res.end(this.convertToString(controller_rc));
164
+ res.write(this.convertToString(controller_rc));
166
165
  } else if (!header_content_type) {
167
166
  res.setHeader("Content-Type", "text/plain");
168
- res.end(this.convertToString(controller_rc));
167
+ res.write(this.convertToString(controller_rc));
169
168
  } else {
170
- res.end(this.convertToString(controller_rc));
169
+ res.write(this.convertToString(controller_rc));
171
170
  }
172
171
  return;
173
172
  } else {
174
173
  res.statusCode = [200].includes(res.statusCode) ? 204 : res.statusCode;
175
- res.end();
176
174
  }
177
175
  }
178
176
  async writeAsync(res, chunk) {
@@ -468,7 +466,24 @@ var import_clipanion = require("clipanion");
468
466
 
469
467
  // src/http.mts
470
468
  var http_exports = {};
469
+ __export(http_exports, {
470
+ handleHttpErrors: () => handleHttpErrors
471
+ });
472
+ var import_neko_http = require("@devbro/neko-http");
471
473
  __reExport(http_exports, require("@devbro/neko-http"));
474
+ async function handleHttpErrors(err, req, res) {
475
+ if (err instanceof import_neko_http.HttpError) {
476
+ res.writeHead(err.statusCode, { "Content-Type": "application/json" });
477
+ res.write(JSON.stringify({ message: err.message, error: err.code }));
478
+ logger().warn({ msg: "HttpError: " + err.message, err });
479
+ return;
480
+ } else {
481
+ logger().error({ msg: "Error: " + err.message, err });
482
+ }
483
+ res.writeHead(500, { "Content-Type": "application/json" });
484
+ res.write(JSON.stringify({ error: "Internal Server Error" }));
485
+ }
486
+ __name(handleHttpErrors, "handleHttpErrors");
472
487
 
473
488
  // src/facades.mts
474
489
  var import_neko_logger = require("@devbro/neko-logger");
@@ -677,18 +692,7 @@ var cli = (0, import_neko_helper2.createSingleton)(() => {
677
692
  });
678
693
  var httpServer = (0, import_neko_helper2.createSingleton)(() => {
679
694
  const server = new http_exports.HttpServer();
680
- server.setErrorHandler(async (err, req, res) => {
681
- if (err instanceof http_exports.HttpError) {
682
- res.writeHead(err.statusCode, { "Content-Type": "application/json" });
683
- res.end(JSON.stringify({ message: err.message, error: err.code }));
684
- logger().warn({ msg: "HttpError: " + err.message, err });
685
- return;
686
- } else {
687
- logger().error({ msg: "Error: " + err.message, err });
688
- }
689
- res.writeHead(500, { "Content-Type": "" });
690
- res.end(JSON.stringify({ error: "Internal Server Error" }));
691
- });
695
+ server.setErrorHandler(handleHttpErrors);
692
696
  server.setRouter(router());
693
697
  return server;
694
698
  });
@@ -719,8 +723,7 @@ var queue = (0, import_neko_helper2.createSingleton)((label) => {
719
723
  queue_config.provider,
720
724
  queue_config.config
721
725
  );
722
- const rc = new import_neko_queue2.QueueConnection(provider);
723
- return rc;
726
+ return new import_neko_queue2.QueueConnection(provider);
724
727
  });
725
728
  var cache = (0, import_neko_helper2.createSingleton)((label) => {
726
729
  const cache_config = import_neko_config.config.get(["caches", label].join("."));
@@ -735,7 +738,7 @@ var cache = (0, import_neko_helper2.createSingleton)((label) => {
735
738
  });
736
739
 
737
740
  // src/middlewares.mts
738
- var import_neko_http = require("@devbro/neko-http");
741
+ var import_neko_http2 = require("@devbro/neko-http");
739
742
  function cors(options = {}) {
740
743
  return async (req, res, next) => {
741
744
  const allowedOrigins = options.allowedOrigins || ["*"];
@@ -816,7 +819,7 @@ var RateLimiterMiddleware = class _RateLimiterMiddleware extends Middleware {
816
819
  );
817
820
  }
818
821
  if (count > this.params.maxRequests) {
819
- throw new import_neko_http.HttpTooManyRequestsError(
822
+ throw new import_neko_http2.HttpTooManyRequestsError(
820
823
  "Too many requests. Please try again later."
821
824
  );
822
825
  }
@@ -162,20 +162,18 @@ var CompiledRoute = class {
162
162
  const header_content_type = res.getHeader("Content-Type");
163
163
  if (controller_rc instanceof import_stream.Stream || Buffer.isBuffer(controller_rc)) {
164
164
  await this.writeAsync(res, controller_rc);
165
- res.end();
166
165
  } else if (!header_content_type && typeof controller_rc === "object") {
167
166
  res.setHeader("Content-Type", "application/json");
168
- res.end(this.convertToString(controller_rc));
167
+ res.write(this.convertToString(controller_rc));
169
168
  } else if (!header_content_type) {
170
169
  res.setHeader("Content-Type", "text/plain");
171
- res.end(this.convertToString(controller_rc));
170
+ res.write(this.convertToString(controller_rc));
172
171
  } else {
173
- res.end(this.convertToString(controller_rc));
172
+ res.write(this.convertToString(controller_rc));
174
173
  }
175
174
  return;
176
175
  } else {
177
176
  res.statusCode = [200].includes(res.statusCode) ? 204 : res.statusCode;
178
- res.end();
179
177
  }
180
178
  }
181
179
  async writeAsync(res, chunk) {
@@ -467,7 +465,24 @@ var import_clipanion = require("clipanion");
467
465
 
468
466
  // src/http.mts
469
467
  var http_exports = {};
468
+ __export(http_exports, {
469
+ handleHttpErrors: () => handleHttpErrors
470
+ });
471
+ var import_neko_http = require("@devbro/neko-http");
470
472
  __reExport(http_exports, require("@devbro/neko-http"));
473
+ async function handleHttpErrors(err, req, res) {
474
+ if (err instanceof import_neko_http.HttpError) {
475
+ res.writeHead(err.statusCode, { "Content-Type": "application/json" });
476
+ res.write(JSON.stringify({ message: err.message, error: err.code }));
477
+ logger().warn({ msg: "HttpError: " + err.message, err });
478
+ return;
479
+ } else {
480
+ logger().error({ msg: "Error: " + err.message, err });
481
+ }
482
+ res.writeHead(500, { "Content-Type": "application/json" });
483
+ res.write(JSON.stringify({ error: "Internal Server Error" }));
484
+ }
485
+ __name(handleHttpErrors, "handleHttpErrors");
471
486
 
472
487
  // src/facades.mts
473
488
  var import_neko_logger = require("@devbro/neko-logger");
@@ -573,18 +588,7 @@ var cli = (0, import_neko_helper.createSingleton)(() => {
573
588
  });
574
589
  var httpServer = (0, import_neko_helper.createSingleton)(() => {
575
590
  const server = new http_exports.HttpServer();
576
- server.setErrorHandler(async (err, req, res) => {
577
- if (err instanceof http_exports.HttpError) {
578
- res.writeHead(err.statusCode, { "Content-Type": "application/json" });
579
- res.end(JSON.stringify({ message: err.message, error: err.code }));
580
- logger().warn({ msg: "HttpError: " + err.message, err });
581
- return;
582
- } else {
583
- logger().error({ msg: "Error: " + err.message, err });
584
- }
585
- res.writeHead(500, { "Content-Type": "" });
586
- res.end(JSON.stringify({ error: "Internal Server Error" }));
587
- });
591
+ server.setErrorHandler(handleHttpErrors);
588
592
  server.setRouter(router());
589
593
  return server;
590
594
  });
@@ -615,8 +619,7 @@ var queue = (0, import_neko_helper.createSingleton)((label) => {
615
619
  queue_config.provider,
616
620
  queue_config.config
617
621
  );
618
- const rc = new import_neko_queue2.QueueConnection(provider);
619
- return rc;
622
+ return new import_neko_queue2.QueueConnection(provider);
620
623
  });
621
624
  var cache = (0, import_neko_helper.createSingleton)((label) => {
622
625
  const cache_config = import_neko_config.config.get(["caches", label].join("."));
@@ -175,20 +175,18 @@ var CompiledRoute = class {
175
175
  const header_content_type = res.getHeader("Content-Type");
176
176
  if (controller_rc instanceof import_stream.Stream || Buffer.isBuffer(controller_rc)) {
177
177
  await this.writeAsync(res, controller_rc);
178
- res.end();
179
178
  } else if (!header_content_type && typeof controller_rc === "object") {
180
179
  res.setHeader("Content-Type", "application/json");
181
- res.end(this.convertToString(controller_rc));
180
+ res.write(this.convertToString(controller_rc));
182
181
  } else if (!header_content_type) {
183
182
  res.setHeader("Content-Type", "text/plain");
184
- res.end(this.convertToString(controller_rc));
183
+ res.write(this.convertToString(controller_rc));
185
184
  } else {
186
- res.end(this.convertToString(controller_rc));
185
+ res.write(this.convertToString(controller_rc));
187
186
  }
188
187
  return;
189
188
  } else {
190
189
  res.statusCode = [200].includes(res.statusCode) ? 204 : res.statusCode;
191
- res.end();
192
190
  }
193
191
  }
194
192
  async writeAsync(res, chunk) {
@@ -612,9 +610,10 @@ function Param(param_name) {
612
610
  });
613
611
  }
614
612
  __name(Param, "Param");
615
- function ApiDocumentation(open_api_url) {
616
- return (req, res) => {
617
- let html = `<!DOCTYPE html>
613
+ function ApiDocumentation(open_api_url, renderer = "redoc") {
614
+ if (renderer === "redoc") {
615
+ return (req, res) => {
616
+ let html = `<!DOCTYPE html>
618
617
  <html>
619
618
  <head>
620
619
  <title>Redoc</title>
@@ -638,9 +637,42 @@ function ApiDocumentation(open_api_url) {
638
637
  <script src="https://cdn.redoc.ly/redoc/latest/bundles/redoc.standalone.js"> </script>
639
638
  </body>
640
639
  </html>`;
641
- res.setHeader("Content-Type", "text/html");
642
- return html;
643
- };
640
+ res.setHeader("Content-Type", "text/html");
641
+ return html;
642
+ };
643
+ }
644
+ if (renderer === "rapidoc") {
645
+ return (req, res) => {
646
+ let html = `<!DOCTYPE html>
647
+ <html>
648
+ <head>
649
+ <title>Redoc</title>
650
+ <!-- needed for adaptive design -->
651
+ <meta charset="utf-8"/>
652
+ <meta name="viewport" content="width=device-width, initial-scale=1">
653
+ <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
654
+
655
+ <!--
656
+ Redoc doesn't change outer page styles
657
+ -->
658
+ <style>
659
+ body {
660
+ margin: 0;
661
+ padding: 0;
662
+ }
663
+ </style>
664
+ </head>
665
+ <body>
666
+ <script type="module" src="https://unpkg.com/rapidoc/dist/rapidoc-min.js"></script>
667
+ <rapi-doc spec-url="${open_api_url}" theme="dark" render-style="read" show-header="false"
668
+ show-method-in-nav-bar="as-colored-text" allow-server-selection="true"
669
+ ></rapi-doc>
670
+ </body>
671
+ </html>`;
672
+ res.setHeader("Content-Type", "text/html");
673
+ return html;
674
+ };
675
+ }
644
676
  }
645
677
  __name(ApiDocumentation, "ApiDocumentation");
646
678
  // Annotate the CommonJS export names for ESM import in node:
package/dist/config.d.mts CHANGED
@@ -1,6 +1,5 @@
1
1
  export * from '@devbro/neko-config';
2
2
  import '@devbro/neko-context';
3
- import '@devbro/neko-http';
4
3
  import '@devbro/neko-helper';
5
4
  import '@devbro/neko-logger';
6
5
  import '@devbro/neko-mailer';
package/dist/facades.mjs CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  } from "@devbro/neko-mailer";
12
12
  import { config } from "@devbro/neko-config";
13
13
  import { Cli } from "clipanion";
14
- import { HttpServer, HttpError } from "./http.mjs";
14
+ import { HttpServer, handleHttpErrors } from "./http.mjs";
15
15
  import { Logger } from "@devbro/neko-logger";
16
16
  import { CacheProviderFactory } from "./factories.mjs";
17
17
  import { Cache } from "@devbro/neko-cache";
@@ -47,18 +47,7 @@ const cli = createSingleton(() => {
47
47
  });
48
48
  const httpServer = createSingleton(() => {
49
49
  const server = new HttpServer();
50
- server.setErrorHandler(async (err, req, res) => {
51
- if (err instanceof HttpError) {
52
- res.writeHead(err.statusCode, { "Content-Type": "application/json" });
53
- res.end(JSON.stringify({ message: err.message, error: err.code }));
54
- logger().warn({ msg: "HttpError: " + err.message, err });
55
- return;
56
- } else {
57
- logger().error({ msg: "Error: " + err.message, err });
58
- }
59
- res.writeHead(500, { "Content-Type": "" });
60
- res.end(JSON.stringify({ error: "Internal Server Error" }));
61
- });
50
+ server.setErrorHandler(handleHttpErrors);
62
51
  server.setRouter(router());
63
52
  return server;
64
53
  });
@@ -89,8 +78,7 @@ const queue = createSingleton((label) => {
89
78
  queue_config.provider,
90
79
  queue_config.config
91
80
  );
92
- const rc = new QueueConnection(provider);
93
- return rc;
81
+ return new QueueConnection(provider);
94
82
  });
95
83
  const cache = createSingleton((label) => {
96
84
  const cache_config = config.get(["caches", label].join("."));
@@ -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 {\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, handleHttpErrors } 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(handleHttpErrors);\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 return new QueueConnection(provider);\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 +1 @@
1
- {"version":3,"sources":["../src/factories.mts"],"sourcesContent":["import {\n Mailer,\n Mailable,\n MailerProvider,\n FunctionProvider,\n SESProvider,\n SMTPProvider,\n MemoryProvider,\n MailerProviderFactory,\n} from \"@devbro/neko-mailer\";\nimport { logger } from \"./facades.mjs\";\nimport { QueueConnection, QueueTransportInterface } from \"@devbro/neko-queue\";\nimport { MemoryTransport, QueueTransportFactory } from \"@devbro/neko-queue\";\nimport { DatabaseTransport } from \"./queue.mjs\";\nimport {\n CacheProviderInterface,\n MemoryCacheProvider,\n RedisCacheProvider,\n FileCacheProvider,\n DisabledCacheProvider,\n} from \"@devbro/neko-cache\";\nimport {\n AWSS3StorageProvider,\n LocalStorageProvider,\n StorageProviderFactory,\n} from \"@devbro/neko-storage\";\n\nexport class FlexibleFactory<T> {\n registry: Map<string, any> = new Map();\n\n register<T>(key: string, ctor: (...args: any[]) => T) {\n this.registry.set(key, ctor);\n }\n\n create<T>(key: string, ...args: any[]): T {\n const ctor = this.registry.get(key);\n if (!ctor) {\n throw new Error(`No factory registered for key: ${key}`);\n }\n return ctor(...args);\n }\n}\n\nMailerProviderFactory.register(\"ses\", (opt) => {\n return new SESProvider(opt);\n});\n\nMailerProviderFactory.register(\"smtp\", (opt) => {\n return new SMTPProvider(opt);\n});\n\nMailerProviderFactory.register(\"memory\", (opt) => {\n return new MemoryProvider();\n});\n\nQueueTransportFactory.register(\"database\", (opt) => {\n return new DatabaseTransport(opt);\n});\n\nQueueTransportFactory.register(\"memory\", (opt) => {\n return new MemoryTransport(opt);\n});\n\n// CACHE\nexport class CacheProviderFactory {\n static instance: FlexibleFactory<CacheProviderInterface> =\n new FlexibleFactory<CacheProviderInterface>();\n\n static register(\n key: string,\n factory: (...args: any[]) => CacheProviderInterface,\n ): void {\n CacheProviderFactory.instance.register(key, factory);\n }\n\n static create<T>(key: string, ...args: any[]): CacheProviderInterface {\n return CacheProviderFactory.instance.create(key, ...args);\n }\n}\n\nCacheProviderFactory.register(\"memory\", (opt) => {\n return new MemoryCacheProvider(opt);\n});\n\nCacheProviderFactory.register(\"redis\", (opt) => {\n return new RedisCacheProvider(opt);\n});\n\nCacheProviderFactory.register(\"file\", (opt) => {\n return new FileCacheProvider(opt);\n});\n\nCacheProviderFactory.register(\"disabled\", (opt) => {\n return new DisabledCacheProvider();\n});\n\nStorageProviderFactory.register(\"local\", (opt) => {\n return new LocalStorageProvider(opt);\n});\n\nStorageProviderFactory.register(\"s3\", (opt) => {\n return new AWSS3StorageProvider(opt);\n});\n"],"mappings":";;AAAA;AAAA,EAKE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,iBAAiB,6BAA6B;AACvD,SAAS,yBAAyB;AAClC;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,gBAAmB;AAAA,EA3BhC,OA2BgC;AAAA;AAAA;AAAA,EAC9B,WAA6B,oBAAI,IAAI;AAAA,EAErC,SAAY,KAAa,MAA6B;AACpD,SAAK,SAAS,IAAI,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,OAAU,QAAgB,MAAgB;AACxC,UAAM,OAAO,KAAK,SAAS,IAAI,GAAG;AAClC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,kCAAkC,GAAG,EAAE;AAAA,IACzD;AACA,WAAO,KAAK,GAAG,IAAI;AAAA,EACrB;AACF;AAEA,sBAAsB,SAAS,OAAO,CAAC,QAAQ;AAC7C,SAAO,IAAI,YAAY,GAAG;AAC5B,CAAC;AAED,sBAAsB,SAAS,QAAQ,CAAC,QAAQ;AAC9C,SAAO,IAAI,aAAa,GAAG;AAC7B,CAAC;AAED,sBAAsB,SAAS,UAAU,CAAC,QAAQ;AAChD,SAAO,IAAI,eAAe;AAC5B,CAAC;AAED,sBAAsB,SAAS,YAAY,CAAC,QAAQ;AAClD,SAAO,IAAI,kBAAkB,GAAG;AAClC,CAAC;AAED,sBAAsB,SAAS,UAAU,CAAC,QAAQ;AAChD,SAAO,IAAI,gBAAgB,GAAG;AAChC,CAAC;AAGM,MAAM,qBAAqB;AAAA,EAhElC,OAgEkC;AAAA;AAAA;AAAA,EAChC,OAAO,WACL,IAAI,gBAAwC;AAAA,EAE9C,OAAO,SACL,KACA,SACM;AACN,yBAAqB,SAAS,SAAS,KAAK,OAAO;AAAA,EACrD;AAAA,EAEA,OAAO,OAAU,QAAgB,MAAqC;AACpE,WAAO,qBAAqB,SAAS,OAAO,KAAK,GAAG,IAAI;AAAA,EAC1D;AACF;AAEA,qBAAqB,SAAS,UAAU,CAAC,QAAQ;AAC/C,SAAO,IAAI,oBAAoB,GAAG;AACpC,CAAC;AAED,qBAAqB,SAAS,SAAS,CAAC,QAAQ;AAC9C,SAAO,IAAI,mBAAmB,GAAG;AACnC,CAAC;AAED,qBAAqB,SAAS,QAAQ,CAAC,QAAQ;AAC7C,SAAO,IAAI,kBAAkB,GAAG;AAClC,CAAC;AAED,qBAAqB,SAAS,YAAY,CAAC,QAAQ;AACjD,SAAO,IAAI,sBAAsB;AACnC,CAAC;AAED,uBAAuB,SAAS,SAAS,CAAC,QAAQ;AAChD,SAAO,IAAI,qBAAqB,GAAG;AACrC,CAAC;AAED,uBAAuB,SAAS,MAAM,CAAC,QAAQ;AAC7C,SAAO,IAAI,qBAAqB,GAAG;AACrC,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/factories.mts"],"sourcesContent":["import {\n SESProvider,\n SMTPProvider,\n MemoryProvider,\n MailerProviderFactory,\n} from \"@devbro/neko-mailer\";\nimport { MemoryTransport, QueueTransportFactory } from \"@devbro/neko-queue\";\nimport { DatabaseTransport } from \"./queue.mjs\";\nimport {\n CacheProviderInterface,\n MemoryCacheProvider,\n RedisCacheProvider,\n FileCacheProvider,\n DisabledCacheProvider,\n} from \"@devbro/neko-cache\";\nimport {\n AWSS3StorageProvider,\n LocalStorageProvider,\n StorageProviderFactory,\n} from \"@devbro/neko-storage\";\n\nexport class FlexibleFactory<T> {\n registry: Map<string, any> = new Map();\n\n register<T>(key: string, ctor: (...args: any[]) => T) {\n this.registry.set(key, ctor);\n }\n\n create<T>(key: string, ...args: any[]): T {\n const ctor = this.registry.get(key);\n if (!ctor) {\n throw new Error(`No factory registered for key: ${key}`);\n }\n return ctor(...args);\n }\n}\n\nMailerProviderFactory.register(\"ses\", (opt) => {\n return new SESProvider(opt);\n});\n\nMailerProviderFactory.register(\"smtp\", (opt) => {\n return new SMTPProvider(opt);\n});\n\nMailerProviderFactory.register(\"memory\", (opt) => {\n return new MemoryProvider();\n});\n\nQueueTransportFactory.register(\"database\", (opt) => {\n return new DatabaseTransport(opt);\n});\n\nQueueTransportFactory.register(\"memory\", (opt) => {\n return new MemoryTransport(opt);\n});\n\n// CACHE\nexport class CacheProviderFactory {\n static instance: FlexibleFactory<CacheProviderInterface> =\n new FlexibleFactory<CacheProviderInterface>();\n\n static register(\n key: string,\n factory: (...args: any[]) => CacheProviderInterface,\n ): void {\n CacheProviderFactory.instance.register(key, factory);\n }\n\n static create<T>(key: string, ...args: any[]): CacheProviderInterface {\n return CacheProviderFactory.instance.create(key, ...args);\n }\n}\n\nCacheProviderFactory.register(\"memory\", (opt) => {\n return new MemoryCacheProvider(opt);\n});\n\nCacheProviderFactory.register(\"redis\", (opt) => {\n return new RedisCacheProvider(opt);\n});\n\nCacheProviderFactory.register(\"file\", (opt) => {\n return new FileCacheProvider(opt);\n});\n\nCacheProviderFactory.register(\"disabled\", (opt) => {\n return new DisabledCacheProvider();\n});\n\nStorageProviderFactory.register(\"local\", (opt) => {\n return new LocalStorageProvider(opt);\n});\n\nStorageProviderFactory.register(\"s3\", (opt) => {\n return new AWSS3StorageProvider(opt);\n});\n"],"mappings":";;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,6BAA6B;AACvD,SAAS,yBAAyB;AAClC;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,gBAAmB;AAAA,EArBhC,OAqBgC;AAAA;AAAA;AAAA,EAC9B,WAA6B,oBAAI,IAAI;AAAA,EAErC,SAAY,KAAa,MAA6B;AACpD,SAAK,SAAS,IAAI,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,OAAU,QAAgB,MAAgB;AACxC,UAAM,OAAO,KAAK,SAAS,IAAI,GAAG;AAClC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,kCAAkC,GAAG,EAAE;AAAA,IACzD;AACA,WAAO,KAAK,GAAG,IAAI;AAAA,EACrB;AACF;AAEA,sBAAsB,SAAS,OAAO,CAAC,QAAQ;AAC7C,SAAO,IAAI,YAAY,GAAG;AAC5B,CAAC;AAED,sBAAsB,SAAS,QAAQ,CAAC,QAAQ;AAC9C,SAAO,IAAI,aAAa,GAAG;AAC7B,CAAC;AAED,sBAAsB,SAAS,UAAU,CAAC,QAAQ;AAChD,SAAO,IAAI,eAAe;AAC5B,CAAC;AAED,sBAAsB,SAAS,YAAY,CAAC,QAAQ;AAClD,SAAO,IAAI,kBAAkB,GAAG;AAClC,CAAC;AAED,sBAAsB,SAAS,UAAU,CAAC,QAAQ;AAChD,SAAO,IAAI,gBAAgB,GAAG;AAChC,CAAC;AAGM,MAAM,qBAAqB;AAAA,EA1DlC,OA0DkC;AAAA;AAAA;AAAA,EAChC,OAAO,WACL,IAAI,gBAAwC;AAAA,EAE9C,OAAO,SACL,KACA,SACM;AACN,yBAAqB,SAAS,SAAS,KAAK,OAAO;AAAA,EACrD;AAAA,EAEA,OAAO,OAAU,QAAgB,MAAqC;AACpE,WAAO,qBAAqB,SAAS,OAAO,KAAK,GAAG,IAAI;AAAA,EAC1D;AACF;AAEA,qBAAqB,SAAS,UAAU,CAAC,QAAQ;AAC/C,SAAO,IAAI,oBAAoB,GAAG;AACpC,CAAC;AAED,qBAAqB,SAAS,SAAS,CAAC,QAAQ;AAC9C,SAAO,IAAI,mBAAmB,GAAG;AACnC,CAAC;AAED,qBAAqB,SAAS,QAAQ,CAAC,QAAQ;AAC7C,SAAO,IAAI,kBAAkB,GAAG;AAClC,CAAC;AAED,qBAAqB,SAAS,YAAY,CAAC,QAAQ;AACjD,SAAO,IAAI,sBAAsB;AACnC,CAAC;AAED,uBAAuB,SAAS,SAAS,CAAC,QAAQ;AAChD,SAAO,IAAI,qBAAqB,GAAG;AACrC,CAAC;AAED,uBAAuB,SAAS,MAAM,CAAC,QAAQ;AAC7C,SAAO,IAAI,qBAAqB,GAAG;AACrC,CAAC;","names":[]}
package/dist/http.d.mts CHANGED
@@ -1 +1,5 @@
1
1
  export * from '@devbro/neko-http';
2
+
3
+ declare function handleHttpErrors(err: Error, req: any, res: any): Promise<void>;
4
+
5
+ export { handleHttpErrors };
package/dist/http.mjs CHANGED
@@ -1,2 +1,22 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { HttpError } from "@devbro/neko-http";
4
+ import { logger } from "./facades.mts";
1
5
  export * from "@devbro/neko-http";
6
+ async function handleHttpErrors(err, req, res) {
7
+ if (err instanceof HttpError) {
8
+ res.writeHead(err.statusCode, { "Content-Type": "application/json" });
9
+ res.write(JSON.stringify({ message: err.message, error: err.code }));
10
+ logger().warn({ msg: "HttpError: " + err.message, err });
11
+ return;
12
+ } else {
13
+ logger().error({ msg: "Error: " + err.message, err });
14
+ }
15
+ res.writeHead(500, { "Content-Type": "application/json" });
16
+ res.write(JSON.stringify({ error: "Internal Server Error" }));
17
+ }
18
+ __name(handleHttpErrors, "handleHttpErrors");
19
+ export {
20
+ handleHttpErrors
21
+ };
2
22
  //# sourceMappingURL=http.mjs.map
package/dist/http.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/http.mts"],"sourcesContent":["export * from \"@devbro/neko-http\";\n"],"mappings":"AAAA,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/http.mts"],"sourcesContent":["import { HttpError } from \"@devbro/neko-http\";\nimport { logger } from \"./facades.mts\";\n\nexport * from \"@devbro/neko-http\";\n\nexport async function handleHttpErrors(\n err: Error,\n req: any,\n res: any,\n): Promise<void> {\n if (err instanceof HttpError) {\n res.writeHead(err.statusCode, { \"Content-Type\": \"application/json\" });\n res.write(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\": \"application/json\" });\n res.write(JSON.stringify({ error: \"Internal Server Error\" }));\n}\n"],"mappings":";;AAAA,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AAEvB,cAAc;AAEd,eAAsB,iBACpB,KACA,KACA,KACe;AACf,MAAI,eAAe,WAAW;AAC5B,QAAI,UAAU,IAAI,YAAY,EAAE,gBAAgB,mBAAmB,CAAC;AACpE,QAAI,MAAM,KAAK,UAAU,EAAE,SAAS,IAAI,SAAS,OAAO,IAAI,KAAK,CAAC,CAAC;AACnE,WAAO,EAAE,KAAK,EAAE,KAAK,gBAAgB,IAAI,SAAS,IAAI,CAAC;AACvD;AAAA,EACF,OAAO;AACL,WAAO,EAAE,MAAM,EAAE,KAAK,YAAY,IAAI,SAAS,IAAI,CAAC;AAAA,EACtD;AACA,MAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,MAAI,MAAM,KAAK,UAAU,EAAE,OAAO,wBAAwB,CAAC,CAAC;AAC9D;AAfsB;","names":[]}
package/dist/router.d.mts CHANGED
@@ -4,6 +4,6 @@ export * from '@devbro/neko-router';
4
4
 
5
5
  declare function Model(model: typeof BaseModel, param_name?: string, model_field?: string): ParameterDecorator;
6
6
  declare function Param(param_name: string): ParameterDecorator;
7
- declare function ApiDocumentation(open_api_url: string): (req: Request, res: Response) => string;
7
+ declare function ApiDocumentation(open_api_url: string, renderer?: "redoc" | "rapidoc"): ((req: Request, res: Response) => string) | undefined;
8
8
 
9
9
  export { ApiDocumentation, Model, Param };
package/dist/router.mjs CHANGED
@@ -22,9 +22,10 @@ function Param(param_name) {
22
22
  });
23
23
  }
24
24
  __name(Param, "Param");
25
- function ApiDocumentation(open_api_url) {
26
- return (req, res) => {
27
- let html = `<!DOCTYPE html>
25
+ function ApiDocumentation(open_api_url, renderer = "redoc") {
26
+ if (renderer === "redoc") {
27
+ return (req, res) => {
28
+ let html = `<!DOCTYPE html>
28
29
  <html>
29
30
  <head>
30
31
  <title>Redoc</title>
@@ -48,9 +49,42 @@ function ApiDocumentation(open_api_url) {
48
49
  <script src="https://cdn.redoc.ly/redoc/latest/bundles/redoc.standalone.js"> </script>
49
50
  </body>
50
51
  </html>`;
51
- res.setHeader("Content-Type", "text/html");
52
- return html;
53
- };
52
+ res.setHeader("Content-Type", "text/html");
53
+ return html;
54
+ };
55
+ }
56
+ if (renderer === "rapidoc") {
57
+ return (req, res) => {
58
+ let html = `<!DOCTYPE html>
59
+ <html>
60
+ <head>
61
+ <title>Redoc</title>
62
+ <!-- needed for adaptive design -->
63
+ <meta charset="utf-8"/>
64
+ <meta name="viewport" content="width=device-width, initial-scale=1">
65
+ <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
66
+
67
+ <!--
68
+ Redoc doesn't change outer page styles
69
+ -->
70
+ <style>
71
+ body {
72
+ margin: 0;
73
+ padding: 0;
74
+ }
75
+ </style>
76
+ </head>
77
+ <body>
78
+ <script type="module" src="https://unpkg.com/rapidoc/dist/rapidoc-min.js"></script>
79
+ <rapi-doc spec-url="${open_api_url}" theme="dark" render-style="read" show-header="false"
80
+ show-method-in-nav-bar="as-colored-text" allow-server-selection="true"
81
+ ></rapi-doc>
82
+ </body>
83
+ </html>`;
84
+ res.setHeader("Content-Type", "text/html");
85
+ return html;
86
+ };
87
+ }
54
88
  }
55
89
  __name(ApiDocumentation, "ApiDocumentation");
56
90
  export {
@@ -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 ApiDocumentation(open_api_url: string) {\n return (req: Request, res: Response) => {\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}\n"],"mappings":";;AAAA,SAAS,WAAW;AAGpB,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AAGrC,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,cAAsB;AACrD,SAAO,CAAC,KAAc,QAAkB;AACtC,QAAI,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAoBQ,YAAY;AAAA;AAAA;AAAA;AAK/B,QAAI,UAAU,gBAAgB,WAAW;AACzC,WAAO;AAAA,EACT;AACF;AA9BgB;","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\";\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(\n open_api_url: string,\n renderer: \"redoc\" | \"rapidoc\" = \"redoc\",\n) {\n if (renderer === \"redoc\") {\n return (req: Request, res: Response) => {\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 }\n\n if (renderer === \"rapidoc\") {\n return (req: Request, res: Response) => {\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 <script type=\"module\" src=\"https://unpkg.com/rapidoc/dist/rapidoc-min.js\"></script>\n <rapi-doc spec-url=\"${open_api_url}\" theme=\"dark\" render-style=\"read\" show-header=\"false\"\n show-method-in-nav-bar=\"as-colored-text\" allow-server-selection=\"true\"\n ></rapi-doc>\n </body>\n</html>`;\n\n res.setHeader(\"Content-Type\", \"text/html\");\n return html;\n };\n }\n}\n"],"mappings":";;AAAA,SAAS,WAAW;AAGpB,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AACrC,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,cACA,WAAgC,SAChC;AACA,MAAI,aAAa,SAAS;AACxB,WAAO,CAAC,KAAc,QAAkB;AACtC,UAAI,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAoBM,YAAY;AAAA;AAAA;AAAA;AAK7B,UAAI,UAAU,gBAAgB,WAAW;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,aAAa,WAAW;AAC1B,WAAO,CAAC,KAAc,QAAkB;AACtC,UAAI,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAqBS,YAAY;AAAA;AAAA;AAAA;AAAA;AAMhC,UAAI,UAAU,gBAAgB,WAAW;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AACF;AArEgB;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devbro/pashmak",
3
- "version": "0.1.46",
3
+ "version": "0.1.48",
4
4
  "description": "testing application for the entire repo",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -118,11 +118,8 @@
118
118
  "license": "MIT",
119
119
  "devDependencies": {
120
120
  "@swc/core": "^1.12.9",
121
- "@types/config": "^3.3.5",
122
- "@types/jsonwebtoken": "^9.0.9",
123
121
  "@types/yup": "^0.32.0",
124
122
  "globby": "^14.1.0",
125
- "pino-pretty": "^13.0.0",
126
123
  "typescript": "^5.8.3"
127
124
  },
128
125
  "dependencies": {
@@ -140,16 +137,10 @@
140
137
  "@devbro/neko-storage": "0.1.*",
141
138
  "@inquirer/prompts": "^7.10.0",
142
139
  "@types/pluralize": "^0.0.33",
143
- "bcryptjs": "^3.0.2",
144
140
  "change-case-all": "^2.1.0",
145
141
  "clipanion": "^4.0.0-rc.4",
146
- "dotenv": "^16.5.0",
147
142
  "handlebars": "^4.7.8",
148
- "jsonwebtoken": "^9.0.2",
149
- "pg-pool": "3.10.0",
150
143
  "pluralize": "^8.0.0",
151
- "ts-jest": "^29.3.4",
152
- "tsconfig-paths": "^4.2.0",
153
144
  "yup": "^1.6.1"
154
145
  },
155
146
  "directories": {