@inversifyjs/class-validation 2.0.0 → 2.0.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @inversifyjs/class-validation
2
2
 
3
+ ## 2.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated `ClassValidationPipe` to properly handle nullish and primitive values
8
+ - Updated dependencies
9
+ - @inversifyjs/validation-common@2.0.2
10
+
11
+ ## 2.0.1
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies
16
+ - @inversifyjs/reflect-metadata-utils@1.4.1
17
+ - @inversifyjs/framework-core@1.0.1
18
+ - @inversifyjs/validation-common@2.0.1
19
+
3
20
  ## 2.0.0
4
21
 
5
22
  ### Minor Changes
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Test coverage](https://codecov.io/gh/inversify/monorepo/branch/main/graph/badge.svg?flag=%40inversifyjs%2Fclass-validation)](https://codecov.io/gh/inversify/monorepo/branch/main/graph/badge.svg?flag=%40inversifyjs%2Fclass-validation) [![npm version](https://img.shields.io/github/package-json/v/inversify/monorepo?filename=packages%2Fframework%2Flibraries%2Fvalidation%2Fclass-validator%2Fpackage.json&style=plastic)](https://www.npmjs.com/package/@inversifyjs/class-validation)
1
+ [![Test coverage](https://codecov.io/gh/inversify/monorepo/branch/main/graph/badge.svg?flag=%40inversifyjs%2Fclass-validation)](https://codecov.io/gh/inversify/monorepo/branch/main/graph/badge.svg?flag=%40inversifyjs%2Fclass-validation) [![npm version](https://img.shields.io/github/package-json/v/inversify/monorepo?filename=packages%2Fframework%2Fvalidation%2Flibraries%2Fclass-validator%2Fpackage.json&style=plastic)](https://www.npmjs.com/package/@inversifyjs/class-validation)
2
2
 
3
3
  # @inversifyjs/class-validation
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"ClassValidationPipe.d.ts","sourceRoot":"","sources":["../../../src/pipes/ClassValidationPipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AASjE,qBAAa,mBAAoB,YAAW,IAAI;IACjC,OAAO,CAClB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC;CA0CpB"}
1
+ {"version":3,"file":"ClassValidationPipe.d.ts","sourceRoot":"","sources":["../../../src/pipes/ClassValidationPipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AA4BjE,qBAAa,mBAAoB,YAAW,IAAI;IACjC,OAAO,CAClB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC;CAyDpB"}
@@ -5,15 +5,41 @@ const reflect_metadata_utils_1 = require("@inversifyjs/reflect-metadata-utils");
5
5
  const validation_common_1 = require("@inversifyjs/validation-common");
6
6
  const class_transformer_1 = require("class-transformer");
7
7
  const class_validator_1 = require("class-validator");
8
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
9
+ const ALLOW_NULLISH_VALUE_TYPES_LIST = [
10
+ Object,
11
+ undefined,
12
+ ];
13
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
14
+ const NON_VALIDATED_TYPES_LIST = [
15
+ Array,
16
+ BigInt,
17
+ Boolean,
18
+ Buffer,
19
+ Function,
20
+ Number,
21
+ Object,
22
+ String,
23
+ Symbol,
24
+ ];
8
25
  class ClassValidationPipe {
9
26
  async execute(input, metadata) {
10
27
  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
11
28
  const inputType = (0, reflect_metadata_utils_1.getOwnReflectMetadata)(
12
29
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
13
30
  metadata.targetClass.prototype, 'design:paramtypes', metadata.methodName)?.[metadata.parameterIndex];
31
+ if (input == undefined) {
32
+ if (ALLOW_NULLISH_VALUE_TYPES_LIST.includes(inputType)) {
33
+ return input;
34
+ }
35
+ throw new validation_common_1.InversifyValidationError(validation_common_1.InversifyValidationErrorKind.validationFailed, `Validation failed. Found nullish value but expected type "${inputType?.name ?? 'undefined'}" at ${metadata.targetClass.name}.${metadata.methodName.toString()}[${metadata.parameterIndex.toString()}].`);
36
+ }
14
37
  if (inputType === undefined) {
15
38
  throw new validation_common_1.InversifyValidationError(validation_common_1.InversifyValidationErrorKind.invalidConfiguration, `Param type metadata for ${metadata.targetClass.name}.${metadata.methodName.toString()}[${metadata.parameterIndex.toString()}] is not defined. Are you enabling "emitDecoratorMetadata" and "experimentalDecorators" Typescript compiler options?`);
16
39
  }
40
+ if (NON_VALIDATED_TYPES_LIST.includes(inputType)) {
41
+ return input;
42
+ }
17
43
  const instance = (0, class_transformer_1.plainToInstance)(inputType, input);
18
44
  const validationResult = await (0, class_validator_1.validate)(instance, {
19
45
  forbidNonWhitelisted: true,
@@ -1 +1 @@
1
- {"version":3,"file":"ClassValidationPipe.js","sourceRoot":"","sources":["../../../src/pipes/ClassValidationPipe.ts"],"names":[],"mappings":";;;AACA,gFAA4E;AAC5E,sEAGwC;AACxC,yDAAsE;AACtE,qDAA4D;AAE5D,MAAa,mBAAmB;IACvB,KAAK,CAAC,OAAO,CAClB,KAAc,EACd,QAAsB;QAEtB,sEAAsE;QACtE,MAAM,SAAS,GAAyB,IAAA,8CAAqB;QAC3D,iEAAiE;QACjE,QAAQ,CAAC,WAAW,CAAC,SAAS,EAC9B,mBAAmB,EACnB,QAAQ,CAAC,UAAU,CACpB,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAE7B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,4CAAwB,CAChC,gDAA4B,CAAC,oBAAoB,EACjD,2BAA2B,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,sHAAsH,CACnP,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAW,IAAA,mCAAe,EACtC,SAAqC,EACrC,KAAK,CACN,CAAC;QAEF,MAAM,gBAAgB,GAAsB,MAAM,IAAA,0BAAQ,EAAC,QAAQ,EAAE;YACnE,oBAAoB,EAAE,IAAI;YAC1B,mBAAmB,EAAE,IAAI;YACzB,qBAAqB,EAAE,KAAK;YAC5B,kBAAkB,EAAE,KAAK;YACzB,uBAAuB,EAAE,KAAK;YAC9B,gBAAgB,EAAE,KAAK;YACvB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,4CAAwB,CAChC,gDAA4B,CAAC,gBAAgB,EAC7C,gBAAgB;iBACb,GAAG,CAAC,CAAC,KAAsB,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;iBAC7D,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA9CD,kDA8CC"}
1
+ {"version":3,"file":"ClassValidationPipe.js","sourceRoot":"","sources":["../../../src/pipes/ClassValidationPipe.ts"],"names":[],"mappings":";;;AACA,gFAA4E;AAC5E,sEAGwC;AACxC,yDAAsE;AACtE,qDAA4D;AAE5D,sEAAsE;AACtE,MAAM,8BAA8B,GAA6B;IAC/D,MAAM;IACN,SAAS;CACV,CAAC;AAEF,sEAAsE;AACtE,MAAM,wBAAwB,GAAe;IAC3C,KAAK;IACL,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC;AAEF,MAAa,mBAAmB;IACvB,KAAK,CAAC,OAAO,CAClB,KAAc,EACd,QAAsB;QAEtB,sEAAsE;QACtE,MAAM,SAAS,GAAyB,IAAA,8CAAqB;QAC3D,iEAAiE;QACjE,QAAQ,CAAC,WAAW,CAAC,SAAS,EAC9B,mBAAmB,EACnB,QAAQ,CAAC,UAAU,CACpB,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAE7B,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;YACvB,IAAI,8BAA8B,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,4CAAwB,CAChC,gDAA4B,CAAC,gBAAgB,EAC7C,6DAA6D,SAAS,EAAE,IAAI,IAAI,WAAW,QAAQ,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CACzM,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,4CAAwB,CAChC,gDAA4B,CAAC,oBAAoB,EACjD,2BAA2B,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,sHAAsH,CACnP,CAAC;QACJ,CAAC;QAED,IAAI,wBAAwB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,QAAQ,GAAW,IAAA,mCAAe,EACtC,SAAqC,EACrC,KAAK,CACN,CAAC;QAEF,MAAM,gBAAgB,GAAsB,MAAM,IAAA,0BAAQ,EAAC,QAAQ,EAAE;YACnE,oBAAoB,EAAE,IAAI;YAC1B,mBAAmB,EAAE,IAAI;YACzB,qBAAqB,EAAE,KAAK;YAC5B,kBAAkB,EAAE,KAAK;YACzB,uBAAuB,EAAE,KAAK;YAC9B,gBAAgB,EAAE,KAAK;YACvB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,4CAAwB,CAChC,gDAA4B,CAAC,gBAAgB,EAC7C,gBAAgB;iBACb,GAAG,CAAC,CAAC,KAAsB,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;iBAC7D,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA7DD,kDA6DC"}
package/lib/esm/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{getOwnReflectMetadata as t}from"@inversifyjs/reflect-metadata-utils";import{InversifyValidationError as e,InversifyValidationErrorKind as r}from"@inversifyjs/validation-common";import{plainToInstance as i}from"class-transformer";import{validate as o}from"class-validator";class a{async execute(a,n){const s=t(n.targetClass.prototype,"design:paramtypes",n.methodName)?.[n.parameterIndex];if(void 0===s)throw new e(r.invalidConfiguration,`Param type metadata for ${n.targetClass.name}.${n.methodName.toString()}[${n.parameterIndex.toString()}] is not defined. Are you enabling "emitDecoratorMetadata" and "experimentalDecorators" Typescript compiler options?`);const m=i(s,a),p=await o(m,{forbidNonWhitelisted:!0,forbidUnknownValues:!0,skipMissingProperties:!1,skipNullProperties:!1,skipUndefinedProperties:!1,stopAtFirstError:!1,whitelist:!0});if(p.length>0)throw new e(r.validationFailed,p.map(t=>t.toString(!1,!1)).join("\n"));return m}}export{a as ClassValidationPipe};
1
+ import{getOwnReflectMetadata as e}from"@inversifyjs/reflect-metadata-utils";import{InversifyValidationError as t,InversifyValidationErrorKind as i}from"@inversifyjs/validation-common";import{plainToInstance as r}from"class-transformer";import{validate as a}from"class-validator";const n=[Object,void 0],o=[Array,BigInt,Boolean,Buffer,Function,Number,Object,String,Symbol];class s{async execute(s,d){const l=e(d.targetClass.prototype,"design:paramtypes",d.methodName)?.[d.parameterIndex];if(null==s){if(n.includes(l))return s;throw new t(i.validationFailed,`Validation failed. Found nullish value but expected type "${l?.name??"undefined"}" at ${d.targetClass.name}.${d.methodName.toString()}[${d.parameterIndex.toString()}].`)}if(void 0===l)throw new t(i.invalidConfiguration,`Param type metadata for ${d.targetClass.name}.${d.methodName.toString()}[${d.parameterIndex.toString()}] is not defined. Are you enabling "emitDecoratorMetadata" and "experimentalDecorators" Typescript compiler options?`);if(o.includes(l))return s;const m=r(l,s),p=await a(m,{forbidNonWhitelisted:!0,forbidUnknownValues:!0,skipMissingProperties:!1,skipNullProperties:!1,skipUndefinedProperties:!1,stopAtFirstError:!1,whitelist:!0});if(p.length>0)throw new t(i.validationFailed,p.map(e=>e.toString(!1,!1)).join("\n"));return m}}export{s as ClassValidationPipe};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/pipes/ClassValidationPipe.ts"],"sourcesContent":[null],"names":["ClassValidationPipe","execute","input","metadata","inputType","getOwnReflectMetadata","targetClass","prototype","methodName","parameterIndex","undefined","InversifyValidationError","InversifyValidationErrorKind","invalidConfiguration","name","toString","instance","plainToInstance","validationResult","validate","forbidNonWhitelisted","forbidUnknownValues","skipMissingProperties","skipNullProperties","skipUndefinedProperties","stopAtFirstError","whitelist","length","validationFailed","map","error","join"],"mappings":"6RASaA,EACJ,aAAMC,CACXC,EACAC,GAGA,MAAMC,EAAkCC,EAEtCF,EAASG,YAAYC,UACrB,oBACAJ,EAASK,cACPL,EAASM,gBAEb,QAAkBC,IAAdN,EACF,MAAM,IAAIO,EACRC,EAA6BC,qBAC7B,2BAA2BV,EAASG,YAAYQ,QAAQX,EAASK,WAAWO,cAAcZ,EAASM,eAAeM,kIAItH,MAAMC,EAAmBC,EACvBb,EACAF,GAGIgB,QAA4CC,EAASH,EAAU,CACnEI,sBAAsB,EACtBC,qBAAqB,EACrBC,uBAAuB,EACvBC,oBAAoB,EACpBC,yBAAyB,EACzBC,kBAAkB,EAClBC,WAAW,IAGb,GAAIR,EAAiBS,OAAS,EAC5B,MAAM,IAAIhB,EACRC,EAA6BgB,iBAC7BV,EACGW,IAAKC,GAA2BA,EAAMf,UAAS,GAAO,IACtDgB,KAAK,OAIZ,OAAOf,CACT"}
1
+ {"version":3,"file":"index.js","sources":["../../src/pipes/ClassValidationPipe.ts"],"sourcesContent":[null],"names":["ALLOW_NULLISH_VALUE_TYPES_LIST","Object","undefined","NON_VALIDATED_TYPES_LIST","Array","BigInt","Boolean","Buffer","Function","Number","String","Symbol","ClassValidationPipe","execute","input","metadata","inputType","getOwnReflectMetadata","targetClass","prototype","methodName","parameterIndex","includes","InversifyValidationError","InversifyValidationErrorKind","validationFailed","name","toString","invalidConfiguration","instance","plainToInstance","validationResult","validate","forbidNonWhitelisted","forbidUnknownValues","skipMissingProperties","skipNullProperties","skipUndefinedProperties","stopAtFirstError","whitelist","length","map","error","join"],"mappings":"uRAUA,MAAMA,EAA2D,CAC/DC,YACAC,GAIIC,EAAuC,CAC3CC,MACAC,OACAC,QACAC,OACAC,SACAC,OACAR,OACAS,OACAC,cAGWC,EACJ,aAAMC,CACXC,EACAC,GAGA,MAAMC,EAAkCC,EAEtCF,EAASG,YAAYC,UACrB,oBACAJ,EAASK,cACPL,EAASM,gBAEb,GAAanB,MAATY,EAAoB,CACtB,GAAId,EAA+BsB,SAASN,GAC1C,OAAOF,EAGT,MAAM,IAAIS,EACRC,EAA6BC,iBAC7B,6DAA6DT,GAAWU,MAAQ,mBAAmBX,EAASG,YAAYQ,QAAQX,EAASK,WAAWO,cAAcZ,EAASM,eAAeM,eAE9L,CAEA,QAAkBzB,IAAdc,EACF,MAAM,IAAIO,EACRC,EAA6BI,qBAC7B,2BAA2Bb,EAASG,YAAYQ,QAAQX,EAASK,WAAWO,cAAcZ,EAASM,eAAeM,kIAItH,GAAIxB,EAAyBmB,SAASN,GACpC,OAAOF,EAGT,MAAMe,EAAmBC,EACvBd,EACAF,GAGIiB,QAA4CC,EAASH,EAAU,CACnEI,sBAAsB,EACtBC,qBAAqB,EACrBC,uBAAuB,EACvBC,oBAAoB,EACpBC,yBAAyB,EACzBC,kBAAkB,EAClBC,WAAW,IAGb,GAAIR,EAAiBS,OAAS,EAC5B,MAAM,IAAIjB,EACRC,EAA6BC,iBAC7BM,EACGU,IAAKC,GAA2BA,EAAMf,UAAS,GAAO,IACtDgB,KAAK,OAIZ,OAAOd,CACT"}
package/package.json CHANGED
@@ -5,31 +5,31 @@
5
5
  },
6
6
  "description": "InversifyJs class-validator validation package",
7
7
  "dependencies": {
8
- "@inversifyjs/framework-core": "1.0.0",
9
- "@inversifyjs/reflect-metadata-utils": "1.4.0",
10
- "@inversifyjs/validation-common": "2.0.0"
8
+ "@inversifyjs/framework-core": "1.0.1",
9
+ "@inversifyjs/reflect-metadata-utils": "1.4.1",
10
+ "@inversifyjs/validation-common": "2.0.2"
11
11
  },
12
12
  "devDependencies": {
13
- "@stryker-mutator/core": "9.1.1",
14
- "@stryker-mutator/typescript-checker": "9.1.1",
15
- "@stryker-mutator/vitest-runner": "9.1.1",
16
- "@types/express": "5.0.3",
17
- "@types/node": "22.18.6",
18
- "@vitest/coverage-v8": "3.2.4",
19
- "eslint": "9.36.0",
20
- "inversify": "^7.10.0",
21
- "prettier": "3.6.2",
22
- "rimraf": "6.0.1",
23
- "rollup": "4.52.0",
13
+ "@stryker-mutator/core": "9.4.0",
14
+ "@stryker-mutator/typescript-checker": "9.4.0",
15
+ "@stryker-mutator/vitest-runner": "9.4.0",
16
+ "@types/express": "5.0.6",
17
+ "@types/node": "24.10.9",
18
+ "@vitest/coverage-v8": "4.0.18",
19
+ "eslint": "9.39.2",
20
+ "inversify": "^7.11.0",
21
+ "prettier": "3.8.1",
22
+ "rimraf": "6.1.2",
23
+ "rollup": "4.56.0",
24
24
  "ts-loader": "9.5.4",
25
25
  "tslib": "2.8.1",
26
- "typescript": "5.9.2",
27
- "vitest": "3.2.4",
28
- "@inversifyjs/http-core": "2.0.0",
29
- "@inversifyjs/http-express": "2.0.0"
26
+ "typescript": "5.9.3",
27
+ "vitest": "4.0.18",
28
+ "@inversifyjs/http-core": "4.10.2",
29
+ "@inversifyjs/http-express": "4.10.2"
30
30
  },
31
31
  "devEngines": {
32
- "node": "^22.10.2",
32
+ "node": "^24.10.0",
33
33
  "pnpm": "^9.12.1"
34
34
  },
35
35
  "homepage": "https://inversify.io",
@@ -55,7 +55,7 @@
55
55
  "name": "@inversifyjs/class-validation",
56
56
  "peerDependencies": {
57
57
  "class-transformer": "~0.5.1",
58
- "class-validator": "~0.14.2"
58
+ "class-validator": "~0.14.3"
59
59
  },
60
60
  "publishConfig": {
61
61
  "access": "public"
@@ -64,7 +64,7 @@
64
64
  "type": "git",
65
65
  "url": "git+https://github.com/inversify/monorepo.git"
66
66
  },
67
- "version": "2.0.0",
67
+ "version": "2.0.2",
68
68
  "scripts": {
69
69
  "build": "pnpm run build:cjs && pnpm run build:esm",
70
70
  "build:cjs": "tsc --build tsconfig.cjs.json && pnpm exec foundation-ts-package-cjs ./lib/cjs",