@tahminator/sapling 2.0.0 → 2.0.2-beta.131088cd

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/index.cjs CHANGED
@@ -237,6 +237,30 @@ var ResponseStatusError = class ResponseStatusError extends Error {
237
237
  }
238
238
  };
239
239
  //#endregion
240
+ //#region src/helper/error/parse.ts
241
+ /**
242
+ * This error should be thrown when some data cannot be parsed by a given schema.
243
+ */
244
+ var ParserError = class ParserError extends ResponseStatusError {
245
+ constructor(location, issues, vendor) {
246
+ super(400, ParserError.formatMessage(location, issues, vendor));
247
+ Object.setPrototypeOf(this, new.target.prototype);
248
+ }
249
+ static formatMessage(location, issues, vendor) {
250
+ const formatted = issues.map((i) => {
251
+ const path = Array.isArray(i.path) ? i.path.map((seg) => typeof seg === "object" && seg ? String(seg.key) : String(seg)).join(".") : "";
252
+ return path ? `${path}: ${i.message}` : i.message;
253
+ }).join("; ");
254
+ return `${vendor} failed to parse ${(() => {
255
+ switch (location) {
256
+ case "reqbody": return "request body";
257
+ case "reqparams": return "request params";
258
+ case "reqquery": return "request query";
259
+ }
260
+ })()}: ${formatted}`;
261
+ }
262
+ };
263
+ //#endregion
240
264
  //#region src/helper/sapling.ts
241
265
  const settings = {
242
266
  serialize: JSON.stringify,
@@ -479,30 +503,6 @@ function _resolve(ctor) {
479
503
  return _InjectableRegistry.get(ctor);
480
504
  }
481
505
  //#endregion
482
- //#region src/helper/error/exception.ts
483
- /**
484
- * This error should be thrown when some data cannot be parsed by a given schema.
485
- */
486
- var ParserError = class ParserError extends ResponseStatusError {
487
- constructor(location, issues, vendor) {
488
- super(400, ParserError.formatMessage(location, issues, vendor));
489
- Object.setPrototypeOf(this, new.target.prototype);
490
- }
491
- static formatMessage(location, issues, vendor) {
492
- const formatted = issues.map((i) => {
493
- const path = Array.isArray(i.path) ? i.path.map((seg) => typeof seg === "object" && seg ? String(seg.key) : String(seg)).join(".") : "";
494
- return path ? `${path}: ${i.message}` : i.message;
495
- }).join("; ");
496
- return `${vendor} failed to parse ${(() => {
497
- switch (location) {
498
- case "reqbody": return "request body";
499
- case "reqparams": return "request params";
500
- case "reqquery": return "request query";
501
- }
502
- })()}: ${formatted}`;
503
- }
504
- };
505
- //#endregion
506
506
  //#region src/annotation/request.ts
507
507
  const _requestSchemaStore = /* @__PURE__ */ new WeakMap();
508
508
  function _getOrCreateRequestSchemaDefinition(ctor, fnName) {
@@ -549,7 +549,10 @@ function _getRequestSchemas(ctor, fnName) {
549
549
  }
550
550
  async function _parseOrThrow(schema, input, kind) {
551
551
  const result = await schema["~standard"].validate(input);
552
- if (result.issues) throw new ParserError(kind, result.issues, schema["~standard"].vendor);
552
+ if (result.issues) {
553
+ console.debug(`Failed to parse a schema`);
554
+ throw new ParserError(kind, result.issues, schema["~standard"].vendor);
555
+ }
553
556
  return result.value;
554
557
  }
555
558
  //#endregion
@@ -691,7 +694,15 @@ Split these into separate @MiddlewareClass classes, or merge the logic into a si
691
694
  if (schemas) {
692
695
  if (schemas.body) request.body = await _parseOrThrow(schemas.body, request.body, "reqbody");
693
696
  if (schemas.param) request.params = await _parseOrThrow(schemas.param, request.params, "reqparams");
694
- if (schemas.query) request.query = await _parseOrThrow(schemas.query, request.query, "reqquery");
697
+ if (schemas.query) {
698
+ const parsedQuery = await _parseOrThrow(schemas.query, request.query, "reqquery");
699
+ if (request.query && typeof request.query === "object") {
700
+ Object.keys(request.query).forEach((key) => {
701
+ delete request.query[key];
702
+ });
703
+ Object.assign(request.query, parsedQuery);
704
+ }
705
+ }
695
706
  }
696
707
  const result = await fn.bind(controllerInstance)(request, response, next);
697
708
  if (result instanceof ResponseEntity) {
@@ -721,8 +732,48 @@ function MiddlewareClass(...args) {
721
732
  return Controller(...args);
722
733
  }
723
734
  //#endregion
735
+ //#region \0@oxc-project+runtime@0.127.0/helpers/decorate.js
736
+ function __decorate(decorators, target, key, desc) {
737
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
738
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
739
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
740
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
741
+ }
742
+ //#endregion
743
+ //#region src/middleware/default/base.ts
744
+ let DefaultBaseErrorMiddleware = class DefaultBaseErrorMiddleware {
745
+ handle(err, _request, _response, _next) {
746
+ console.error("[Error]", err);
747
+ return ResponseEntity.status(500).body({ message: "Internal Server Error" });
748
+ }
749
+ };
750
+ __decorate([Middleware()], DefaultBaseErrorMiddleware.prototype, "handle", null);
751
+ DefaultBaseErrorMiddleware = __decorate([MiddlewareClass()], DefaultBaseErrorMiddleware);
752
+ //#endregion
753
+ //#region src/middleware/default/responsestatus.ts
754
+ let DefaultResponseStatusErrorMiddleware = class DefaultResponseStatusErrorMiddleware {
755
+ handle(err, _request, _response, next) {
756
+ if (err instanceof ResponseStatusError) return ResponseEntity.status(err.status).body({ message: err.message });
757
+ next(err);
758
+ }
759
+ };
760
+ __decorate([Middleware()], DefaultResponseStatusErrorMiddleware.prototype, "handle", null);
761
+ DefaultResponseStatusErrorMiddleware = __decorate([MiddlewareClass()], DefaultResponseStatusErrorMiddleware);
762
+ //#endregion
724
763
  exports.Controller = Controller;
725
764
  exports.DELETE = DELETE;
765
+ Object.defineProperty(exports, "DefaultBaseErrorMiddleware", {
766
+ enumerable: true,
767
+ get: function() {
768
+ return DefaultBaseErrorMiddleware;
769
+ }
770
+ });
771
+ Object.defineProperty(exports, "DefaultResponseStatusErrorMiddleware", {
772
+ enumerable: true,
773
+ get: function() {
774
+ return DefaultResponseStatusErrorMiddleware;
775
+ }
776
+ });
726
777
  exports.GET = GET;
727
778
  exports.HEAD = HEAD;
728
779
  exports.Html404ErrorPage = Html404ErrorPage;
package/dist/index.d.cts CHANGED
@@ -397,6 +397,16 @@ declare class ResponseStatusError extends Error {
397
397
  constructor(status: HttpStatus, message?: string);
398
398
  }
399
399
  //#endregion
400
+ //#region src/helper/error/parse.d.ts
401
+ type ParserErrorLocation = "reqbody" | "reqparams" | "reqquery";
402
+ /**
403
+ * This error should be thrown when some data cannot be parsed by a given schema.
404
+ */
405
+ declare class ParserError extends ResponseStatusError {
406
+ constructor(location: ParserErrorLocation, issues: readonly StandardSchemaV1.Issue[], vendor: string);
407
+ private static formatMessage;
408
+ }
409
+ //#endregion
400
410
  //#region src/helper/sapling.d.ts
401
411
  /**
402
412
  * Collection of utility functions which are essential for Sapling to function.
@@ -473,16 +483,6 @@ declare class Sapling {
473
483
  static setDeserializeFn(this: void, fn: (value: string) => any): void;
474
484
  }
475
485
  //#endregion
476
- //#region src/helper/error/exception.d.ts
477
- type ParserErrorLocation = "reqbody" | "reqparams" | "reqquery";
478
- /**
479
- * This error should be thrown when some data cannot be parsed by a given schema.
480
- */
481
- declare class ParserError extends ResponseStatusError {
482
- constructor(location: ParserErrorLocation, issues: readonly StandardSchemaV1.Issue[], vendor: string);
483
- private static formatMessage;
484
- }
485
- //#endregion
486
486
  //#region src/annotation/request.d.ts
487
487
  type RequestSchemaDefinition = {
488
488
  body?: StandardSchemaV1;
@@ -495,4 +495,23 @@ declare function RequestQuery(schema: StandardSchemaV1): MethodDecorator;
495
495
  declare function _getRequestSchemas(ctor: Function, fnName: string): RequestSchemaDefinition | undefined;
496
496
  declare function _parseOrThrow<TSchema extends StandardSchemaV1>(schema: TSchema, input: unknown, kind: ParserErrorLocation): Promise<StandardSchemaV1.InferOutput<TSchema>>;
497
497
  //#endregion
498
- export { Class, Controller, DELETE, ExpressMiddlewareFn, ExpressRouterMethodKey, ExpressRouterMethods, GET, HEAD, Html404ErrorPage, HttpHeaders, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, PATCH, POST, PUT, ParserError, ParserErrorLocation, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseEntity, ResponseEntityBuilder, ResponseStatusError, RouteDefinition, Sapling, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _getRequestSchemas, _getRoutes, _parseOrThrow, _resolve, methodResolve };
498
+ //#region src/middleware/default/base.d.ts
499
+ /**
500
+ * This should be registered last in the middleware chain.
501
+ *
502
+ * All exception messages are hidden from the request by default.
503
+ */
504
+ declare class DefaultBaseErrorMiddleware {
505
+ handle(err: unknown, _request: Request, _response: Response, _next: NextFunction): ResponseEntity<{
506
+ message: string;
507
+ }>;
508
+ }
509
+ //#endregion
510
+ //#region src/middleware/default/responsestatus.d.ts
511
+ declare class DefaultResponseStatusErrorMiddleware {
512
+ handle(err: unknown, _request: Request, _response: Response, next: NextFunction): ResponseEntity<{
513
+ message: string;
514
+ }> | undefined;
515
+ }
516
+ //#endregion
517
+ export { Class, Controller, DELETE, DefaultBaseErrorMiddleware, DefaultResponseStatusErrorMiddleware, ExpressMiddlewareFn, ExpressRouterMethodKey, ExpressRouterMethods, GET, HEAD, Html404ErrorPage, HttpHeaders, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, PATCH, POST, PUT, ParserError, ParserErrorLocation, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseEntity, ResponseEntityBuilder, ResponseStatusError, RouteDefinition, Sapling, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _getRequestSchemas, _getRoutes, _parseOrThrow, _resolve, methodResolve };
package/dist/index.d.mts CHANGED
@@ -397,6 +397,16 @@ declare class ResponseStatusError extends Error {
397
397
  constructor(status: HttpStatus, message?: string);
398
398
  }
399
399
  //#endregion
400
+ //#region src/helper/error/parse.d.ts
401
+ type ParserErrorLocation = "reqbody" | "reqparams" | "reqquery";
402
+ /**
403
+ * This error should be thrown when some data cannot be parsed by a given schema.
404
+ */
405
+ declare class ParserError extends ResponseStatusError {
406
+ constructor(location: ParserErrorLocation, issues: readonly StandardSchemaV1.Issue[], vendor: string);
407
+ private static formatMessage;
408
+ }
409
+ //#endregion
400
410
  //#region src/helper/sapling.d.ts
401
411
  /**
402
412
  * Collection of utility functions which are essential for Sapling to function.
@@ -473,16 +483,6 @@ declare class Sapling {
473
483
  static setDeserializeFn(this: void, fn: (value: string) => any): void;
474
484
  }
475
485
  //#endregion
476
- //#region src/helper/error/exception.d.ts
477
- type ParserErrorLocation = "reqbody" | "reqparams" | "reqquery";
478
- /**
479
- * This error should be thrown when some data cannot be parsed by a given schema.
480
- */
481
- declare class ParserError extends ResponseStatusError {
482
- constructor(location: ParserErrorLocation, issues: readonly StandardSchemaV1.Issue[], vendor: string);
483
- private static formatMessage;
484
- }
485
- //#endregion
486
486
  //#region src/annotation/request.d.ts
487
487
  type RequestSchemaDefinition = {
488
488
  body?: StandardSchemaV1;
@@ -495,4 +495,23 @@ declare function RequestQuery(schema: StandardSchemaV1): MethodDecorator;
495
495
  declare function _getRequestSchemas(ctor: Function, fnName: string): RequestSchemaDefinition | undefined;
496
496
  declare function _parseOrThrow<TSchema extends StandardSchemaV1>(schema: TSchema, input: unknown, kind: ParserErrorLocation): Promise<StandardSchemaV1.InferOutput<TSchema>>;
497
497
  //#endregion
498
- export { Class, Controller, DELETE, ExpressMiddlewareFn, ExpressRouterMethodKey, ExpressRouterMethods, GET, HEAD, Html404ErrorPage, HttpHeaders, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, PATCH, POST, PUT, ParserError, ParserErrorLocation, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseEntity, ResponseEntityBuilder, ResponseStatusError, RouteDefinition, Sapling, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _getRequestSchemas, _getRoutes, _parseOrThrow, _resolve, methodResolve };
498
+ //#region src/middleware/default/base.d.ts
499
+ /**
500
+ * This should be registered last in the middleware chain.
501
+ *
502
+ * All exception messages are hidden from the request by default.
503
+ */
504
+ declare class DefaultBaseErrorMiddleware {
505
+ handle(err: unknown, _request: Request, _response: Response, _next: NextFunction): ResponseEntity<{
506
+ message: string;
507
+ }>;
508
+ }
509
+ //#endregion
510
+ //#region src/middleware/default/responsestatus.d.ts
511
+ declare class DefaultResponseStatusErrorMiddleware {
512
+ handle(err: unknown, _request: Request, _response: Response, next: NextFunction): ResponseEntity<{
513
+ message: string;
514
+ }> | undefined;
515
+ }
516
+ //#endregion
517
+ export { Class, Controller, DELETE, DefaultBaseErrorMiddleware, DefaultResponseStatusErrorMiddleware, ExpressMiddlewareFn, ExpressRouterMethodKey, ExpressRouterMethods, GET, HEAD, Html404ErrorPage, HttpHeaders, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, PATCH, POST, PUT, ParserError, ParserErrorLocation, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseEntity, ResponseEntityBuilder, ResponseStatusError, RouteDefinition, Sapling, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _getRequestSchemas, _getRoutes, _parseOrThrow, _resolve, methodResolve };
package/dist/index.mjs CHANGED
@@ -213,6 +213,30 @@ var ResponseStatusError = class ResponseStatusError extends Error {
213
213
  }
214
214
  };
215
215
  //#endregion
216
+ //#region src/helper/error/parse.ts
217
+ /**
218
+ * This error should be thrown when some data cannot be parsed by a given schema.
219
+ */
220
+ var ParserError = class ParserError extends ResponseStatusError {
221
+ constructor(location, issues, vendor) {
222
+ super(400, ParserError.formatMessage(location, issues, vendor));
223
+ Object.setPrototypeOf(this, new.target.prototype);
224
+ }
225
+ static formatMessage(location, issues, vendor) {
226
+ const formatted = issues.map((i) => {
227
+ const path = Array.isArray(i.path) ? i.path.map((seg) => typeof seg === "object" && seg ? String(seg.key) : String(seg)).join(".") : "";
228
+ return path ? `${path}: ${i.message}` : i.message;
229
+ }).join("; ");
230
+ return `${vendor} failed to parse ${(() => {
231
+ switch (location) {
232
+ case "reqbody": return "request body";
233
+ case "reqparams": return "request params";
234
+ case "reqquery": return "request query";
235
+ }
236
+ })()}: ${formatted}`;
237
+ }
238
+ };
239
+ //#endregion
216
240
  //#region src/helper/sapling.ts
217
241
  const settings = {
218
242
  serialize: JSON.stringify,
@@ -455,30 +479,6 @@ function _resolve(ctor) {
455
479
  return _InjectableRegistry.get(ctor);
456
480
  }
457
481
  //#endregion
458
- //#region src/helper/error/exception.ts
459
- /**
460
- * This error should be thrown when some data cannot be parsed by a given schema.
461
- */
462
- var ParserError = class ParserError extends ResponseStatusError {
463
- constructor(location, issues, vendor) {
464
- super(400, ParserError.formatMessage(location, issues, vendor));
465
- Object.setPrototypeOf(this, new.target.prototype);
466
- }
467
- static formatMessage(location, issues, vendor) {
468
- const formatted = issues.map((i) => {
469
- const path = Array.isArray(i.path) ? i.path.map((seg) => typeof seg === "object" && seg ? String(seg.key) : String(seg)).join(".") : "";
470
- return path ? `${path}: ${i.message}` : i.message;
471
- }).join("; ");
472
- return `${vendor} failed to parse ${(() => {
473
- switch (location) {
474
- case "reqbody": return "request body";
475
- case "reqparams": return "request params";
476
- case "reqquery": return "request query";
477
- }
478
- })()}: ${formatted}`;
479
- }
480
- };
481
- //#endregion
482
482
  //#region src/annotation/request.ts
483
483
  const _requestSchemaStore = /* @__PURE__ */ new WeakMap();
484
484
  function _getOrCreateRequestSchemaDefinition(ctor, fnName) {
@@ -525,7 +525,10 @@ function _getRequestSchemas(ctor, fnName) {
525
525
  }
526
526
  async function _parseOrThrow(schema, input, kind) {
527
527
  const result = await schema["~standard"].validate(input);
528
- if (result.issues) throw new ParserError(kind, result.issues, schema["~standard"].vendor);
528
+ if (result.issues) {
529
+ console.debug(`Failed to parse a schema`);
530
+ throw new ParserError(kind, result.issues, schema["~standard"].vendor);
531
+ }
529
532
  return result.value;
530
533
  }
531
534
  //#endregion
@@ -667,7 +670,15 @@ Split these into separate @MiddlewareClass classes, or merge the logic into a si
667
670
  if (schemas) {
668
671
  if (schemas.body) request.body = await _parseOrThrow(schemas.body, request.body, "reqbody");
669
672
  if (schemas.param) request.params = await _parseOrThrow(schemas.param, request.params, "reqparams");
670
- if (schemas.query) request.query = await _parseOrThrow(schemas.query, request.query, "reqquery");
673
+ if (schemas.query) {
674
+ const parsedQuery = await _parseOrThrow(schemas.query, request.query, "reqquery");
675
+ if (request.query && typeof request.query === "object") {
676
+ Object.keys(request.query).forEach((key) => {
677
+ delete request.query[key];
678
+ });
679
+ Object.assign(request.query, parsedQuery);
680
+ }
681
+ }
671
682
  }
672
683
  const result = await fn.bind(controllerInstance)(request, response, next);
673
684
  if (result instanceof ResponseEntity) {
@@ -697,4 +708,32 @@ function MiddlewareClass(...args) {
697
708
  return Controller(...args);
698
709
  }
699
710
  //#endregion
700
- export { Controller, DELETE, GET, HEAD, Html404ErrorPage, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, PATCH, POST, PUT, ParserError, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseEntity, ResponseEntityBuilder, ResponseStatusError, Sapling, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _getRequestSchemas, _getRoutes, _parseOrThrow, _resolve, methodResolve };
711
+ //#region \0@oxc-project+runtime@0.127.0/helpers/decorate.js
712
+ function __decorate(decorators, target, key, desc) {
713
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
714
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
715
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
716
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
717
+ }
718
+ //#endregion
719
+ //#region src/middleware/default/base.ts
720
+ let DefaultBaseErrorMiddleware = class DefaultBaseErrorMiddleware {
721
+ handle(err, _request, _response, _next) {
722
+ console.error("[Error]", err);
723
+ return ResponseEntity.status(500).body({ message: "Internal Server Error" });
724
+ }
725
+ };
726
+ __decorate([Middleware()], DefaultBaseErrorMiddleware.prototype, "handle", null);
727
+ DefaultBaseErrorMiddleware = __decorate([MiddlewareClass()], DefaultBaseErrorMiddleware);
728
+ //#endregion
729
+ //#region src/middleware/default/responsestatus.ts
730
+ let DefaultResponseStatusErrorMiddleware = class DefaultResponseStatusErrorMiddleware {
731
+ handle(err, _request, _response, next) {
732
+ if (err instanceof ResponseStatusError) return ResponseEntity.status(err.status).body({ message: err.message });
733
+ next(err);
734
+ }
735
+ };
736
+ __decorate([Middleware()], DefaultResponseStatusErrorMiddleware.prototype, "handle", null);
737
+ DefaultResponseStatusErrorMiddleware = __decorate([MiddlewareClass()], DefaultResponseStatusErrorMiddleware);
738
+ //#endregion
739
+ export { Controller, DELETE, DefaultBaseErrorMiddleware, DefaultResponseStatusErrorMiddleware, GET, HEAD, Html404ErrorPage, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, PATCH, POST, PUT, ParserError, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseEntity, ResponseEntityBuilder, ResponseStatusError, Sapling, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _getRequestSchemas, _getRoutes, _parseOrThrow, _resolve, methodResolve };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tahminator/sapling",
3
- "version": "2.0.0",
3
+ "version": "2.0.2-beta.131088cd",
4
4
  "author": "Tahmid Ahmed",
5
5
  "description": "A library to help you write cleaner Express.js code",
6
6
  "repository": {