nesties 1.1.23 → 1.1.25

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
@@ -35,6 +35,7 @@ __export(index_exports, {
35
35
  ApiError: () => ApiError,
36
36
  ApiErrorTyped: () => ApiErrorTyped,
37
37
  ApiFromResolver: () => ApiFromResolver,
38
+ ApiInject: () => ApiInject,
38
39
  ApiTypeResponse: () => ApiTypeResponse,
39
40
  As: () => As,
40
41
  BlankPaginatedReturnMessageDto: () => BlankPaginatedReturnMessageDto,
@@ -43,6 +44,7 @@ __export(index_exports, {
43
44
  DataBody: () => DataBody,
44
45
  DataPipe: () => DataPipe,
45
46
  DataQuery: () => DataQuery,
47
+ DefaultValueParamResolver: () => DefaultValueParamResolver,
46
48
  GenericPaginatedReturnMessageDto: () => GenericPaginatedReturnMessageDto,
47
49
  GenericReturnMessageDto: () => GenericReturnMessageDto,
48
50
  I18nInterceptor: () => I18nInterceptor,
@@ -62,6 +64,11 @@ __export(index_exports, {
62
64
  ParamResolver: () => ParamResolver,
63
65
  ParamResolverBase: () => ParamResolverBase,
64
66
  ParamResolverPipe: () => ParamResolverPipe,
67
+ ParseBase64ParamResolver: () => ParseBase64ParamResolver,
68
+ ParseBoolParamResolver: () => ParseBoolParamResolver,
69
+ ParseDateParamResolver: () => ParseDateParamResolver,
70
+ ParseFloatParamResolver: () => ParseFloatParamResolver,
71
+ ParseIntParamResolver: () => ParseIntParamResolver,
65
72
  PutLocale: () => PutLocale,
66
73
  RenameClass: () => RenameClass,
67
74
  RequireToken: () => RequireToken,
@@ -73,6 +80,7 @@ __export(index_exports, {
73
80
  createAbortableProvider: () => createAbortableProvider,
74
81
  createI18n: () => createI18n,
75
82
  createI18nDecorator: () => createI18nDecorator,
83
+ createLambdaParamResolver: () => createLambdaParamResolver,
76
84
  createMutateInject: () => createMutateInject,
77
85
  createProvider: () => createProvider,
78
86
  createResolver: () => createResolver,
@@ -80,6 +88,7 @@ __export(index_exports, {
80
88
  getApiProperty: () => getApiProperty,
81
89
  getClassFromClassOrArray: () => getClassFromClassOrArray,
82
90
  getParamResolver: () => getParamResolver,
91
+ parseBool: () => parseBool,
83
92
  takeUntilAbort: () => takeUntilAbort
84
93
  });
85
94
  module.exports = __toCommonJS(index_exports);
@@ -141,6 +150,18 @@ var createMutateInject = (tokenResolver) => (token) => (target, propertyKey, par
141
150
  );
142
151
  };
143
152
 
153
+ // src/utility/parse-bool.ts
154
+ var parseBool = (value) => {
155
+ const trueValues = ["true", "1", "yes", "on", true, 1];
156
+ const falseValues = ["false", "0", "no", "off", false, 0];
157
+ if (trueValues.indexOf(value) !== -1) return true;
158
+ if (falseValues.indexOf(value) !== -1) return false;
159
+ if (!!value) {
160
+ return true;
161
+ }
162
+ return void 0;
163
+ };
164
+
144
165
  // src/insert-field.ts
145
166
  function InsertField(cl, map, newName) {
146
167
  const extendedCl = class extends cl {
@@ -325,7 +346,7 @@ var import_common5 = require("@nestjs/common");
325
346
  var import_config = require("@nestjs/config");
326
347
  var import_swagger5 = require("@nestjs/swagger");
327
348
 
328
- // src/resolver.ts
349
+ // src/resolver/resolver.ts
329
350
  var import_common4 = require("@nestjs/common");
330
351
  var import_core = require("@nestjs/core");
331
352
  var import_swagger4 = require("@nestjs/swagger");
@@ -361,7 +382,42 @@ var uniqBy = (arr, fn) => {
361
382
  return result;
362
383
  };
363
384
 
364
- // src/resolver.ts
385
+ // src/metadata.ts
386
+ var import_typed_reflector = require("typed-reflector");
387
+ var reflector = new import_typed_reflector.Reflector();
388
+ var Metadata = new import_typed_reflector.MetadataSetter();
389
+
390
+ // src/utility/apply-decorator-unique.ts
391
+ var ApplyDecoratorUnique = (dec, identifier) => ((...args) => {
392
+ const isClassRelated = args.length === 1 || args[1] === void 0;
393
+ const target = args[0];
394
+ const cls = typeof target === "function" ? target : target.constructor;
395
+ if (isClassRelated) {
396
+ const used = reflector.getArray("usedUniqueDecoratorIdentifiers", cls);
397
+ if (used.includes(identifier)) {
398
+ return;
399
+ }
400
+ Metadata.appendUnique("usedUniqueDecoratorIdentifiers", identifier)(cls);
401
+ return dec(...args);
402
+ } else {
403
+ const keyName = args[1];
404
+ const used = reflector.getProperty(
405
+ "usedUniqueDecoratorIdentifiers",
406
+ cls,
407
+ keyName
408
+ );
409
+ if (used.includes(identifier)) {
410
+ return;
411
+ }
412
+ Metadata.appendUnique("usedUniqueDecoratorIdentifiers", identifier)(
413
+ cls,
414
+ keyName
415
+ );
416
+ return dec(...args);
417
+ }
418
+ });
419
+
420
+ // src/resolver/resolver.ts
365
421
  var ParamResolverCopiedFieldsFromSwagger = [
366
422
  "required",
367
423
  "description",
@@ -443,7 +499,12 @@ var ParamResolverBase = class {
443
499
  toApiPropertyDecorator(extras = {}) {
444
500
  const swaggerInfo = uniqBy(this.toSwaggerInfo(), (info) => info.token);
445
501
  return (extras2 = {}) => MergeClassOrMethodDecorators(
446
- swaggerInfo.map((info) => info.swagger({ ...extras, ...extras2 }))
502
+ swaggerInfo.map(
503
+ (info) => ApplyDecoratorUnique(
504
+ info.swagger({ ...extras, ...extras2 }),
505
+ info.token
506
+ )
507
+ )
447
508
  );
448
509
  }
449
510
  toResolverFunction() {
@@ -624,11 +685,133 @@ var ApiFromResolver = (_options, extras = {}) => {
624
685
  return getParamResolver(_options).toApiPropertyDecorator(extras)();
625
686
  };
626
687
 
688
+ // src/resolver/lambda.ts
689
+ var createLambdaParamResolver = (cb) => (resolver) => new TransformParamResolver(resolver, cb);
690
+ var ParseIntParamResolver = createLambdaParamResolver((s) => {
691
+ if (s == null) {
692
+ return s;
693
+ }
694
+ const res = parseInt(s, 10);
695
+ if (isNaN(res)) {
696
+ throw new BlankReturnMessageDto(
697
+ 400,
698
+ "Invalid integer parameter"
699
+ ).toException();
700
+ }
701
+ return res;
702
+ });
703
+ var ParseFloatParamResolver = createLambdaParamResolver(
704
+ (s) => {
705
+ if (s == null) {
706
+ return s;
707
+ }
708
+ const res = parseFloat(s);
709
+ if (isNaN(res)) {
710
+ throw new BlankReturnMessageDto(
711
+ 400,
712
+ "Invalid float parameter"
713
+ ).toException();
714
+ }
715
+ return res;
716
+ }
717
+ );
718
+ var ParseBoolParamResolver = createLambdaParamResolver(parseBool);
719
+ var ParseDateParamResolver = createLambdaParamResolver(
720
+ (s) => {
721
+ if (s == null) {
722
+ return s;
723
+ }
724
+ const res = new Date(s);
725
+ if (isNaN(res.getTime())) {
726
+ throw new BlankReturnMessageDto(
727
+ 400,
728
+ "Invalid date parameter"
729
+ ).toException();
730
+ }
731
+ return res;
732
+ }
733
+ );
734
+ var ParseBase64ParamResolver = createLambdaParamResolver(
735
+ (s) => {
736
+ if (s == null) {
737
+ return s;
738
+ }
739
+ const normalized = s.replace(/-/g, "+").replace(/_/g, "/");
740
+ const padded = normalized + "=".repeat((4 - normalized.length % 4) % 4);
741
+ if (!/^[A-Za-z0-9+/]*={0,2}$/.test(padded)) {
742
+ throw new BlankReturnMessageDto(
743
+ 400,
744
+ "Invalid base64 parameter"
745
+ ).toException();
746
+ }
747
+ const buf = Buffer.from(padded, "base64");
748
+ const re = buf.toString("base64").replace(/=+$/g, "");
749
+ const in0 = padded.replace(/=+$/g, "");
750
+ if (re !== in0) {
751
+ throw new BlankReturnMessageDto(
752
+ 400,
753
+ "Invalid base64 parameter"
754
+ ).toException();
755
+ }
756
+ return buf;
757
+ }
758
+ );
759
+ var DefaultValueParamResolver = (r, defaultValue) => createLambdaParamResolver(
760
+ (value) => value === void 0 || value === null ? defaultValue : value
761
+ )(r);
762
+
763
+ // src/utility/collect-info-from-injection-token.ts
764
+ var import_constants2 = require("@nestjs/common/constants");
765
+ function asArray(v) {
766
+ if (v == null) return [];
767
+ return Array.isArray(v) ? v : [v];
768
+ }
769
+ function getCtorDepsFromClass(cls) {
770
+ const paramTypes = Reflect.getMetadata(import_constants2.PARAMTYPES_METADATA, cls) ?? [];
771
+ const selfDeclared = Reflect.getMetadata(import_constants2.SELF_DECLARED_DEPS_METADATA, cls) ?? [];
772
+ const overrides = new Map(
773
+ selfDeclared.map((d) => [d.index, d.param])
774
+ );
775
+ return paramTypes.map((t, i) => overrides.get(i) ?? t).filter((t) => t != null && t !== Object);
776
+ }
777
+ var collectInfoFromInjectionToken = (map, token) => {
778
+ const visited = /* @__PURE__ */ new Set();
779
+ const out = /* @__PURE__ */ new Set();
780
+ const dfs = (t) => {
781
+ if (t == null) return;
782
+ if (visited.has(t)) return;
783
+ visited.add(t);
784
+ for (const v of asArray(map.get(t))) {
785
+ out.add(v);
786
+ }
787
+ const deps = InjectionTokenMap.get(t);
788
+ if (deps?.length) {
789
+ for (const d of deps) dfs(d);
790
+ }
791
+ if (typeof t === "function") {
792
+ const ctorDeps = getCtorDepsFromClass(t);
793
+ for (const d of ctorDeps) dfs(d);
794
+ }
795
+ };
796
+ dfs(token);
797
+ return Array.from(out);
798
+ };
799
+ var createCollectorFromInjectionToken = (map) => (token) => collectInfoFromInjectionToken(map, token);
800
+
801
+ // src/utility/swagger-injection-collector.ts
802
+ var swaggerInjectionCollector = createCollectorFromInjectionToken(ResolverSwaggerMap);
803
+
804
+ // src/resolver/api-inject.ts
805
+ var ApiInject = createMutateInject((token, cls) => {
806
+ const swaggers = swaggerInjectionCollector(token);
807
+ for (const swagger of swaggers) {
808
+ ApplyDecoratorUnique(swagger.swagger(), swagger.token)(cls);
809
+ }
810
+ return token;
811
+ });
812
+
627
813
  // src/token.guard.ts
628
- var import_typed_reflector = require("typed-reflector");
629
814
  var import_core2 = require("@nestjs/core");
630
- var reflector = new import_typed_reflector.Reflector();
631
- var Metadata = new import_typed_reflector.MetadataSetter();
632
815
  var defaultHeaderName = "x-server-token";
633
816
  var defaultConfigName = "SERVER_TOKEN";
634
817
  var defaultErrorCode = 401;
@@ -857,14 +1040,20 @@ var I18nModuleOptionsToken = MODULE_OPTIONS_TOKEN;
857
1040
  // src/i18n-module/i18n.service.ts
858
1041
  var import_core5 = require("@nestjs/core");
859
1042
  var import_nfkit2 = require("nfkit");
1043
+
1044
+ // src/i18n-module/i18n-param-resolver.token.ts
1045
+ var I18nParamResolverToken = "I18N_PARAM_RESOLVER";
1046
+ var I18nParamResolverProviderToken = "I18N_PARAM_RESOLVER_PROVIDER";
1047
+
1048
+ // src/i18n-module/i18n.service.ts
860
1049
  var I18nService = class extends import_nfkit2.I18n {
861
- constructor(i18nServiceOptions, moduleRef) {
1050
+ constructor(i18nServiceOptions, moduleRef, resolver) {
862
1051
  super(i18nServiceOptions);
863
1052
  this.i18nServiceOptions = i18nServiceOptions;
864
1053
  this.moduleRef = moduleRef;
1054
+ this.resolver = resolver;
865
1055
  this._shadowMiddlewareMap = /* @__PURE__ */ new Map();
866
1056
  this.logger = new import_common11.ConsoleLogger("I18nService");
867
- this.resolver = createResolver(this.i18nServiceOptions.resolver);
868
1057
  }
869
1058
  middleware(mw, prior = false) {
870
1059
  const wrappedMw = async (locale, text, next, ctx) => {
@@ -891,19 +1080,20 @@ var I18nService = class extends import_nfkit2.I18n {
891
1080
  }
892
1081
  async getExactLocaleFromRequest(ctx) {
893
1082
  const req = ctx.switchToHttp().getRequest();
894
- const locale = await this.resolver(req, this.moduleRef);
1083
+ const locale = await this.resolver.resolve(req, this.moduleRef);
895
1084
  return this.getExactLocale(locale);
896
1085
  }
897
1086
  async translateRequest(ctx, obj) {
898
1087
  const req = ctx.switchToHttp().getRequest();
899
- const locale = await this.resolver(req, this.moduleRef);
1088
+ const locale = await this.resolver.resolve(req, this.moduleRef);
900
1089
  return this.translate(locale, obj, ctx);
901
1090
  }
902
1091
  };
903
1092
  I18nService = __decorateClass([
904
1093
  (0, import_common11.Injectable)(),
905
1094
  __decorateParam(0, (0, import_common11.Inject)(I18nModuleOptionsToken)),
906
- __decorateParam(1, (0, import_common11.Inject)(import_core5.ModuleRef))
1095
+ __decorateParam(1, (0, import_common11.Inject)(import_core5.ModuleRef)),
1096
+ __decorateParam(2, (0, import_common11.Inject)(I18nParamResolverToken))
907
1097
  ], I18nService);
908
1098
 
909
1099
  // src/i18n-module/i18n.module.ts
@@ -942,12 +1132,26 @@ var _dec = (0, import_common12.createParamDecorator)(
942
1132
  var PutLocale = (resolver) => _dec(resolver, LocalePipe);
943
1133
 
944
1134
  // src/i18n-module/i18n.module.ts
1135
+ var providerFromOptions = createProvider(
1136
+ {
1137
+ provide: I18nParamResolverToken,
1138
+ inject: [I18nModuleOptionsToken]
1139
+ },
1140
+ (options) => getParamResolver(
1141
+ options.resolver || {
1142
+ paramType: "header",
1143
+ paramName: "x-client-language"
1144
+ }
1145
+ )
1146
+ );
945
1147
  var I18nModule = class extends ConfigurableModuleClass {
1148
+ static forRoot(options) {
1149
+ }
946
1150
  };
947
1151
  I18nModule = __decorateClass([
948
1152
  (0, import_common13.Global)(),
949
1153
  (0, import_common13.Module)({
950
- providers: [I18nService, LocalePipe],
1154
+ providers: [I18nService, LocalePipe, providerFromOptions],
951
1155
  exports: [I18nService, LocalePipe]
952
1156
  })
953
1157
  ], I18nModule);
@@ -1003,6 +1207,24 @@ var createI18nDecorator = (options) => {
1003
1207
  ]);
1004
1208
  };
1005
1209
 
1210
+ // src/i18n-module/locale.context.ts
1211
+ var import_common16 = require("@nestjs/common");
1212
+ var LocaleContext = class {
1213
+ constructor(localeInput, i18nService) {
1214
+ this.localeInput = localeInput;
1215
+ this.i18nService = i18nService;
1216
+ this.locale = this.i18nService.getExactLocale(this.localeInput);
1217
+ }
1218
+ translate(v) {
1219
+ return this.i18nService.translate(this.locale, v);
1220
+ }
1221
+ };
1222
+ LocaleContext = __decorateClass([
1223
+ (0, import_common16.Injectable)({ scope: import_common16.Scope.REQUEST }),
1224
+ __decorateParam(0, (0, import_common16.Inject)(I18nParamResolverProviderToken)),
1225
+ __decorateParam(1, (0, import_common16.Inject)(I18nService))
1226
+ ], LocaleContext);
1227
+
1006
1228
  // src/i18n-module/i18n-factory.ts
1007
1229
  var createI18n = (options) => {
1008
1230
  if (!options.resolver) {
@@ -1011,9 +1233,29 @@ var createI18n = (options) => {
1011
1233
  paramName: "x-client-language"
1012
1234
  };
1013
1235
  }
1236
+ const resolver = getParamResolver(options.resolver);
1237
+ const paramProvider = resolver.toRequestScopedProvider();
1238
+ const module2 = I18nModule.register(options);
1239
+ module2.providers ??= [];
1240
+ module2.exports ??= [];
1241
+ module2.providers.push(
1242
+ paramProvider.provider,
1243
+ LocaleContext,
1244
+ // re-exports the resolved param value for LocaleContext injection
1245
+ createProvider(
1246
+ {
1247
+ provide: I18nParamResolverProviderToken,
1248
+ inject: [paramProvider.token]
1249
+ },
1250
+ (s) => s
1251
+ )
1252
+ );
1253
+ module2.exports.push(paramProvider.provider, LocaleContext);
1014
1254
  return {
1015
1255
  UseI18n: createI18nDecorator(options),
1016
- I18nModule: I18nModule.register(options)
1256
+ I18nModule: module2,
1257
+ I18nParamResolver: resolver,
1258
+ I18nParamResolverProvider: paramProvider
1017
1259
  };
1018
1260
  };
1019
1261
 
@@ -1029,6 +1271,7 @@ var I18nLookupMiddleware = (0, import_nfkit3.createI18nLookupMiddleware)();
1029
1271
  ApiError,
1030
1272
  ApiErrorTyped,
1031
1273
  ApiFromResolver,
1274
+ ApiInject,
1032
1275
  ApiTypeResponse,
1033
1276
  As,
1034
1277
  BlankPaginatedReturnMessageDto,
@@ -1037,6 +1280,7 @@ var I18nLookupMiddleware = (0, import_nfkit3.createI18nLookupMiddleware)();
1037
1280
  DataBody,
1038
1281
  DataPipe,
1039
1282
  DataQuery,
1283
+ DefaultValueParamResolver,
1040
1284
  GenericPaginatedReturnMessageDto,
1041
1285
  GenericReturnMessageDto,
1042
1286
  I18nInterceptor,
@@ -1056,6 +1300,11 @@ var I18nLookupMiddleware = (0, import_nfkit3.createI18nLookupMiddleware)();
1056
1300
  ParamResolver,
1057
1301
  ParamResolverBase,
1058
1302
  ParamResolverPipe,
1303
+ ParseBase64ParamResolver,
1304
+ ParseBoolParamResolver,
1305
+ ParseDateParamResolver,
1306
+ ParseFloatParamResolver,
1307
+ ParseIntParamResolver,
1059
1308
  PutLocale,
1060
1309
  RenameClass,
1061
1310
  RequireToken,
@@ -1067,6 +1316,7 @@ var I18nLookupMiddleware = (0, import_nfkit3.createI18nLookupMiddleware)();
1067
1316
  createAbortableProvider,
1068
1317
  createI18n,
1069
1318
  createI18nDecorator,
1319
+ createLambdaParamResolver,
1070
1320
  createMutateInject,
1071
1321
  createProvider,
1072
1322
  createResolver,
@@ -1074,6 +1324,7 @@ var I18nLookupMiddleware = (0, import_nfkit3.createI18nLookupMiddleware)();
1074
1324
  getApiProperty,
1075
1325
  getClassFromClassOrArray,
1076
1326
  getParamResolver,
1327
+ parseBool,
1077
1328
  takeUntilAbort
1078
1329
  });
1079
1330
  //# sourceMappingURL=index.cjs.map