@koala-ts/framework 2.10.0 → 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/Application/Response.test.js +1 -4
  2. package/dist/Application/Response.test.js.map +1 -1
  3. package/dist/Routing/Router.test.js +1 -5
  4. package/dist/Routing/Router.test.js.map +1 -1
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/validator/constraints/basic/not-blank.d.ts +3 -0
  10. package/dist/validator/constraints/basic/not-blank.d.ts.map +1 -0
  11. package/dist/validator/constraints/basic/not-blank.js +21 -0
  12. package/dist/validator/constraints/basic/not-blank.js.map +1 -0
  13. package/dist/validator/constraints/basic/not-blank.test.d.ts +2 -0
  14. package/dist/validator/constraints/basic/not-blank.test.d.ts.map +1 -0
  15. package/dist/validator/constraints/basic/not-blank.test.js +79 -0
  16. package/dist/validator/constraints/basic/not-blank.test.js.map +1 -0
  17. package/dist/validator/constraints/index.d.ts +10 -0
  18. package/dist/validator/constraints/index.d.ts.map +1 -0
  19. package/dist/validator/constraints/index.js +12 -0
  20. package/dist/validator/constraints/index.js.map +1 -0
  21. package/dist/validator/constraints/other/compound.d.ts +3 -0
  22. package/dist/validator/constraints/other/compound.d.ts.map +1 -0
  23. package/dist/validator/constraints/other/compound.integration.test.d.ts +2 -0
  24. package/dist/validator/constraints/other/compound.integration.test.d.ts.map +1 -0
  25. package/dist/validator/constraints/other/compound.integration.test.js +76 -0
  26. package/dist/validator/constraints/other/compound.integration.test.js.map +1 -0
  27. package/dist/validator/constraints/other/compound.js +6 -0
  28. package/dist/validator/constraints/other/compound.js.map +1 -0
  29. package/dist/validator/constraints/other/compound.test.d.ts +2 -0
  30. package/dist/validator/constraints/other/compound.test.d.ts.map +1 -0
  31. package/dist/validator/constraints/other/compound.test.js +62 -0
  32. package/dist/validator/constraints/other/compound.test.js.map +1 -0
  33. package/dist/validator/constraints/string/email.d.ts +3 -0
  34. package/dist/validator/constraints/string/email.d.ts.map +1 -0
  35. package/dist/validator/constraints/string/email.js +29 -0
  36. package/dist/validator/constraints/string/email.js.map +1 -0
  37. package/dist/validator/constraints/string/email.test.d.ts +2 -0
  38. package/dist/validator/constraints/string/email.test.d.ts.map +1 -0
  39. package/dist/validator/constraints/string/email.test.js +119 -0
  40. package/dist/validator/constraints/string/email.test.js.map +1 -0
  41. package/dist/validator/errors.d.ts +4 -0
  42. package/dist/validator/errors.d.ts.map +1 -0
  43. package/dist/validator/errors.js +7 -0
  44. package/dist/validator/errors.js.map +1 -0
  45. package/dist/validator/index.d.ts +4 -0
  46. package/dist/validator/index.d.ts.map +1 -0
  47. package/dist/validator/index.js +4 -0
  48. package/dist/validator/index.js.map +1 -0
  49. package/dist/validator/types.d.ts +31 -0
  50. package/dist/validator/types.d.ts.map +1 -0
  51. package/dist/validator/types.js +1 -0
  52. package/dist/validator/types.js.map +1 -0
  53. package/dist/validator/validator.d.ts +3 -0
  54. package/dist/validator/validator.d.ts.map +1 -0
  55. package/dist/validator/validator.js +59 -0
  56. package/dist/validator/validator.js.map +1 -0
  57. package/dist/validator/validator.test.d.ts +2 -0
  58. package/dist/validator/validator.test.d.ts.map +1 -0
  59. package/dist/validator/validator.test.js +281 -0
  60. package/dist/validator/validator.test.js.map +1 -0
  61. package/package.json +6 -7
@@ -1,5 +1,5 @@
1
- import { beforeEach, describe, expect, test, vi } from 'vitest';
2
1
  import { extendResponse } from '../Application/Response.js';
2
+ import { beforeEach, describe, expect, test, vi } from 'vitest';
3
3
  describe('Response', () => {
4
4
  describe('Extend response', () => {
5
5
  let scope;
@@ -11,7 +11,6 @@ describe('Response', () => {
11
11
  test('it should extend response with setHeader method', async () => {
12
12
  await extendResponse(scope, next);
13
13
  scope.response.setHeader('Content-Type', 'application/json');
14
- // eslint-disable-next-line @typescript-eslint/unbound-method
15
14
  expect(scope.set).toHaveBeenCalledWith('Content-Type', 'application/json');
16
15
  });
17
16
  test('response.setHeader should be chainable', async () => {
@@ -25,9 +24,7 @@ describe('Response', () => {
25
24
  'Content-Type': 'application/json',
26
25
  'X-Custom-Header': 'value',
27
26
  });
28
- // eslint-disable-next-line @typescript-eslint/unbound-method
29
27
  expect(scope.set).toHaveBeenCalledWith('Content-Type', 'application/json');
30
- // eslint-disable-next-line @typescript-eslint/unbound-method
31
28
  expect(scope.set).toHaveBeenCalledWith('X-Custom-Header', 'value');
32
29
  });
33
30
  test('response.withHeaders is chainable', async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"Response.test.js","sourceRoot":"","sources":["../../src/Application/Response.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAI,KAAgB,CAAC;QACrB,IAAI,IAAU,CAAC;QAEf,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAA0B,CAAC;YAC/D,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAElC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAE7D,6DAA6D;YAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAElC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAE9E,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAElC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACzB,cAAc,EAAE,kBAAkB;gBAClC,iBAAiB,EAAE,OAAO;aAC3B,CAAC,CAAC;YAEH,6DAA6D;YAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAC3E,6DAA6D;YAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAElC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC1C,cAAc,EAAE,kBAAkB;gBAClC,iBAAiB,EAAE,OAAO;aAC3B,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"Response.test.js","sourceRoot":"","sources":["../../src/Application/Response.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEhE,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAI,KAAgB,CAAC;QACrB,IAAI,IAAU,CAAC;QAEf,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAA0B,CAAC;YAC/D,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAElC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAE7D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAElC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAE9E,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAElC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACzB,cAAc,EAAE,kBAAkB;gBAClC,iBAAiB,EAAE,OAAO;aAC3B,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAElC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC1C,cAAc,EAAE,kBAAkB;gBAClC,iBAAiB,EAAE,OAAO;aAC3B,CAAC,CAAC;YAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -7,8 +7,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import { describe, expect, test, vi } from 'vitest';
11
10
  import { getRoutes, Route } from '../Routing/Router.js';
11
+ import { describe, expect, test, vi } from 'vitest';
12
12
  describe('Route', () => {
13
13
  const exampleMiddleware = vi.fn();
14
14
  class Foo {
@@ -68,7 +68,6 @@ describe('Route', () => {
68
68
  expect(getRoutes()).toEqual([
69
69
  {
70
70
  methods: ['get'],
71
- // eslint-disable-next-line @typescript-eslint/unbound-method
72
71
  handler: Foo.prototype.bar,
73
72
  path: '/foo',
74
73
  parseBody: false,
@@ -77,7 +76,6 @@ describe('Route', () => {
77
76
  },
78
77
  {
79
78
  methods: ['get', 'post'],
80
- // eslint-disable-next-line @typescript-eslint/unbound-method
81
79
  handler: Foo.prototype.routeWithMultipleMethods,
82
80
  path: '/route-with-multiple-methods',
83
81
  parseBody: true,
@@ -86,7 +84,6 @@ describe('Route', () => {
86
84
  },
87
85
  {
88
86
  methods: ['all'],
89
- // eslint-disable-next-line @typescript-eslint/unbound-method
90
87
  handler: Foo.prototype.routeWithAnyMethod,
91
88
  path: '/route-with-any-method',
92
89
  parseBody: true,
@@ -95,7 +92,6 @@ describe('Route', () => {
95
92
  },
96
93
  {
97
94
  methods: ['all'],
98
- // eslint-disable-next-line @typescript-eslint/unbound-method
99
95
  handler: Foo.prototype.routeWithAllMethod,
100
96
  path: '/route-with-all-method',
101
97
  parseBody: true,
@@ -1 +1 @@
1
- {"version":3,"file":"Router.test.js","sourceRoot":"","sources":["../../src/Routing/Router.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Router.test.js","sourceRoot":"","sources":["../../src/Routing/Router.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,4 +6,6 @@ export * from './Routing/index.js';
6
6
  export * from './Security/index.js';
7
7
  export * from './Testing/index.js';
8
8
  export * from './serializer/index.js';
9
+ export * from './validator/index.js';
10
+ export * from './validator/constraints/index.js';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -6,4 +6,6 @@ export * from './Routing/index.js';
6
6
  export * from './Security/index.js';
7
7
  export * from './Testing/index.js';
8
8
  export * from './serializer/index.js';
9
+ export * from './validator/index.js';
10
+ export * from './validator/constraints/index.js';
9
11
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ConstraintContext, Violation } from '../../types.js';
2
+ export declare function notBlank(value: unknown, context: ConstraintContext): Violation[];
3
+ //# sourceMappingURL=not-blank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-blank.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/basic/not-blank.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAShE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,CAmBhF"}
@@ -0,0 +1,21 @@
1
+ const DEFAULT_MESSAGE = 'This value should not be blank.';
2
+ export function notBlank(value, context) {
3
+ const options = context.options;
4
+ const message = options.message ?? DEFAULT_MESSAGE;
5
+ const normalizedValue = typeof value === 'string' && typeof options.normalizer === 'function' ? options.normalizer(value) : value;
6
+ if (isBlank(normalizedValue)) {
7
+ return [
8
+ {
9
+ path: context.path,
10
+ constraint: context.constraint,
11
+ message,
12
+ value,
13
+ },
14
+ ];
15
+ }
16
+ return [];
17
+ }
18
+ function isBlank(value) {
19
+ return value === '' || value === null || value === undefined || (Array.isArray(value) && value.length === 0);
20
+ }
21
+ //# sourceMappingURL=not-blank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-blank.js","sourceRoot":"","sources":["../../../../src/validator/constraints/basic/not-blank.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,iCAAiC,CAAC;AAO1D,MAAM,UAAU,QAAQ,CAAC,KAAc,EAAE,OAA0B;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,OAA0B,CAAC;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IAEnD,MAAM,eAAe,GACnB,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE5G,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;gBACP,KAAK;aACN;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;AAC/G,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=not-blank.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-blank.test.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/basic/not-blank.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { notBlank } from './not-blank.js';
3
+ describe('notBlank', () => {
4
+ it.each([
5
+ { value: '', label: 'empty string' },
6
+ { value: null, label: 'null' },
7
+ { value: undefined, label: 'undefined' },
8
+ { value: [], label: 'empty array' },
9
+ ])('returns a violation when value is $label and no options are provided', ({ value }) => {
10
+ const context = {
11
+ path: 'name',
12
+ root: { name: value },
13
+ value,
14
+ constraint: 'notBlank',
15
+ options: {},
16
+ runNestedRules: () => [],
17
+ };
18
+ const violations = notBlank(value, context);
19
+ expect(violations).toHaveLength(1);
20
+ expect(violations[0]).toEqual({
21
+ path: 'name',
22
+ constraint: 'notBlank',
23
+ message: 'This value should not be blank.',
24
+ value,
25
+ });
26
+ });
27
+ it('uses a custom message when provided', () => {
28
+ const context = {
29
+ path: 'name',
30
+ root: { name: '' },
31
+ value: '',
32
+ constraint: 'notBlank',
33
+ options: { message: 'Required' },
34
+ runNestedRules: () => [],
35
+ };
36
+ const violations = notBlank('', context);
37
+ expect(violations).toHaveLength(1);
38
+ expect(violations[0]).toEqual({
39
+ path: 'name',
40
+ constraint: 'notBlank',
41
+ message: 'Required',
42
+ value: '',
43
+ });
44
+ });
45
+ it('normalizes string values before checking blankness', () => {
46
+ const context = {
47
+ path: 'name',
48
+ root: { name: ' ' },
49
+ value: ' ',
50
+ constraint: 'notBlank',
51
+ options: { normalizer: (value) => value.trim() },
52
+ runNestedRules: () => [],
53
+ };
54
+ const violations = notBlank(' ', context);
55
+ expect(violations).toHaveLength(1);
56
+ expect(violations[0]).toEqual({
57
+ path: 'name',
58
+ constraint: 'notBlank',
59
+ message: 'This value should not be blank.',
60
+ value: ' ',
61
+ });
62
+ });
63
+ it.each([
64
+ { value: 'valid', label: 'non-empty string' },
65
+ { value: ['value'], label: 'non-empty array' },
66
+ ])('returns no violations for $label', ({ value }) => {
67
+ const context = {
68
+ path: 'name',
69
+ root: { name: value },
70
+ value,
71
+ constraint: 'notBlank',
72
+ options: {},
73
+ runNestedRules: () => [],
74
+ };
75
+ const violations = notBlank(value, context);
76
+ expect(violations).toHaveLength(0);
77
+ });
78
+ });
79
+ //# sourceMappingURL=not-blank.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-blank.test.js","sourceRoot":"","sources":["../../../../src/validator/constraints/basic/not-blank.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { notBlank } from '../../validator/constraints/basic/not-blank.js';
2
+ import { email } from '../../validator/constraints/string/email.js';
3
+ export declare const builtInConstraints: {
4
+ notBlank: typeof notBlank;
5
+ email: typeof email;
6
+ };
7
+ export * from './string/email.js';
8
+ export * from './basic/not-blank.js';
9
+ export * from './other/compound.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/validator/constraints/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,sCAAsC,CAAC;AAE7D,eAAO,MAAM,kBAAkB;;;CAM9B,CAAC;AAEF,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { notBlank } from '../../validator/constraints/basic/not-blank.js';
2
+ import { email } from '../../validator/constraints/string/email.js';
3
+ export const builtInConstraints = {
4
+ // Basic
5
+ notBlank,
6
+ // String
7
+ email,
8
+ };
9
+ export * from './string/email.js';
10
+ export * from './basic/not-blank.js';
11
+ export * from './other/compound.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validator/constraints/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,sCAAsC,CAAC;AAE7D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ;IACR,QAAQ;IAER,SAAS;IACT,KAAK;CACN,CAAC;AAEF,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ConstraintContext, FieldRules, Violation } from '../../types.js';
2
+ export declare function compound(rules: FieldRules): (value: unknown, context: ConstraintContext) => Violation[];
3
+ //# sourceMappingURL=compound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compound.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/other/compound.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,IACL,OAAO,OAAO,EAAE,SAAS,iBAAiB,KAAG,SAAS,EAAE,CAG5F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compound.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compound.integration.test.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/other/compound.integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createValidator } from '../../validator.js';
3
+ import { notBlank } from '../basic/not-blank.js';
4
+ import { email } from '../string/email.js';
5
+ import { compound } from './compound.js';
6
+ describe('compound (integration)', () => {
7
+ it('applies nested constraints to the same value', () => {
8
+ const requiredEmail = compound(['notBlank', 'email']);
9
+ const validate = createValidator({
10
+ constraints: {
11
+ requiredEmail,
12
+ notBlank,
13
+ email,
14
+ },
15
+ });
16
+ const rules = {
17
+ userEmail: ['requiredEmail'],
18
+ };
19
+ const violations = validate({ userEmail: '' }, rules);
20
+ expect(violations).toHaveLength(2);
21
+ expect(violations[0]).toEqual({
22
+ path: 'userEmail',
23
+ constraint: 'notBlank',
24
+ message: 'This value should not be blank.',
25
+ value: '',
26
+ });
27
+ expect(violations[1]).toEqual({
28
+ path: 'userEmail',
29
+ constraint: 'email',
30
+ message: 'This value is not a valid email address.',
31
+ value: '',
32
+ });
33
+ });
34
+ it('accepts object rule definitions with options', () => {
35
+ const requiredEmail = compound(['notBlank', { email: { message: 'Invalid email' } }]);
36
+ const validate = createValidator({
37
+ constraints: {
38
+ requiredEmail,
39
+ notBlank,
40
+ email,
41
+ },
42
+ });
43
+ const rules = {
44
+ userEmail: ['requiredEmail'],
45
+ };
46
+ const violations = validate({ userEmail: '' }, rules);
47
+ expect(violations).toHaveLength(2);
48
+ expect(violations[0]).toEqual({
49
+ path: 'userEmail',
50
+ constraint: 'notBlank',
51
+ message: 'This value should not be blank.',
52
+ value: '',
53
+ });
54
+ expect(violations[1]).toEqual({
55
+ path: 'userEmail',
56
+ constraint: 'email',
57
+ message: 'Invalid email',
58
+ value: '',
59
+ });
60
+ });
61
+ it('uses the nested value passed via applyConstraints', () => {
62
+ const requiredEmail = compound([{ email: { normalizer: (value) => value.trim() } }]);
63
+ const validate = createValidator({
64
+ constraints: {
65
+ requiredEmail,
66
+ email,
67
+ },
68
+ });
69
+ const rules = {
70
+ userEmail: ['requiredEmail'],
71
+ };
72
+ const violations = validate({ userEmail: ' user@example.com ' }, rules);
73
+ expect(violations).toHaveLength(0);
74
+ });
75
+ });
76
+ //# sourceMappingURL=compound.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compound.integration.test.js","sourceRoot":"","sources":["../../../../src/validator/constraints/other/compound.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export function compound(rules) {
2
+ return function compoundConstraint(value, context) {
3
+ return context.runNestedRules(value, rules, context.path);
4
+ };
5
+ }
6
+ //# sourceMappingURL=compound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compound.js","sourceRoot":"","sources":["../../../../src/validator/constraints/other/compound.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,KAAiB;IACxC,OAAO,SAAS,kBAAkB,CAAC,KAAc,EAAE,OAA0B;QAC3E,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compound.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compound.test.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/other/compound.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { compound } from './compound.js';
3
+ describe('compound', () => {
4
+ it('creates a constraint that applies nested constraints from arrays', () => {
5
+ const applyConstraints = vi.fn(() => [
6
+ {
7
+ path: 'user',
8
+ constraint: 'notBlank',
9
+ message: 'Required',
10
+ value: '',
11
+ },
12
+ ]);
13
+ const nestedConstraints = ['notBlank'];
14
+ const context = {
15
+ path: 'user',
16
+ root: { user: '' },
17
+ value: '',
18
+ constraint: 'requiredEmail',
19
+ options: {},
20
+ runNestedRules: applyConstraints,
21
+ };
22
+ const requiredEmail = compound(nestedConstraints);
23
+ const violations = requiredEmail('', context);
24
+ expect(applyConstraints).toHaveBeenCalledWith('', ['notBlank'], 'user');
25
+ expect(violations).toHaveLength(1);
26
+ expect(violations[0]).toEqual({
27
+ path: 'user',
28
+ constraint: 'notBlank',
29
+ message: 'Required',
30
+ value: '',
31
+ });
32
+ });
33
+ it('creates a constraint that applies nested constraints from objects', () => {
34
+ const applyConstraints = vi.fn(() => [
35
+ {
36
+ path: 'user',
37
+ constraint: 'notNull',
38
+ message: 'Required',
39
+ value: null,
40
+ },
41
+ ]);
42
+ const context = {
43
+ path: 'user',
44
+ root: { user: null },
45
+ value: null,
46
+ constraint: 'requiredEmail',
47
+ options: {},
48
+ runNestedRules: applyConstraints,
49
+ };
50
+ const requiredEmail = compound({ notNull: {} });
51
+ const violations = requiredEmail(null, context);
52
+ expect(applyConstraints).toHaveBeenCalledWith(null, { notNull: {} }, 'user');
53
+ expect(violations).toHaveLength(1);
54
+ expect(violations[0]).toEqual({
55
+ path: 'user',
56
+ constraint: 'notNull',
57
+ message: 'Required',
58
+ value: null,
59
+ });
60
+ });
61
+ });
62
+ //# sourceMappingURL=compound.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compound.test.js","sourceRoot":"","sources":["../../../../src/validator/constraints/other/compound.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,CAAC,GAAgB,EAAE,CAAC;YAChD;gBACE,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,UAAU;gBACnB,KAAK,EAAE,EAAE;aACV;SACF,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,CAAC,UAAU,CAAC,CAAC;QAEvC,MAAM,OAAO,GAAsB;YACjC,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YAClB,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE,EAAE;YACX,cAAc,EAAE,gBAAgB;SACjC,CAAC;QAEF,MAAM,aAAa,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QACxE,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5B,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,UAAU;YACnB,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,CAAC,GAAgB,EAAE,CAAC;YAChD;gBACE,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,UAAU;gBACnB,KAAK,EAAE,IAAI;aACZ;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAsB;YACjC,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;YACpB,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE,EAAE;YACX,cAAc,EAAE,gBAAgB;SACjC,CAAC;QAEF,MAAM,aAAa,GAAG,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEhD,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7E,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5B,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,UAAU;YACnB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ConstraintContext, Violation } from '../../types.js';
2
+ export declare function email(value: unknown, context: ConstraintContext): Violation[];
3
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/string/email.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAWhE,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,CA6B7E"}
@@ -0,0 +1,29 @@
1
+ const DEFAULT_MESSAGE = 'This value is not a valid email address.';
2
+ const strictEmailRegex = /^[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+$/;
3
+ export function email(value, context) {
4
+ const options = context.options;
5
+ const message = options.message ?? DEFAULT_MESSAGE;
6
+ if (typeof value !== 'string') {
7
+ return [
8
+ {
9
+ path: context.path,
10
+ constraint: context.constraint,
11
+ message,
12
+ value,
13
+ },
14
+ ];
15
+ }
16
+ const normalized = options.normalizer ? options.normalizer(value) : value;
17
+ if (!strictEmailRegex.test(normalized)) {
18
+ return [
19
+ {
20
+ path: context.path,
21
+ constraint: context.constraint,
22
+ message,
23
+ value,
24
+ },
25
+ ];
26
+ }
27
+ return [];
28
+ }
29
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../../src/validator/constraints/string/email.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,0CAA0C,CAAC;AAOnE,MAAM,gBAAgB,GAAG,sEAAsE,CAAC;AAEhG,MAAM,UAAU,KAAK,CAAC,KAAc,EAAE,OAA0B;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAuB,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IAEnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;gBACP,KAAK;aACN;SACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE1E,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;gBACP,KAAK;aACN;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=email.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.test.d.ts","sourceRoot":"","sources":["../../../../src/validator/constraints/string/email.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,119 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { email } from './email.js';
3
+ describe('email', () => {
4
+ it('rejects invalid email by default', () => {
5
+ const context = {
6
+ path: 'email',
7
+ root: { email: 'invalid' },
8
+ value: 'invalid',
9
+ constraint: 'email',
10
+ options: {},
11
+ runNestedRules: () => [],
12
+ };
13
+ const violations = email('invalid', context);
14
+ expect(violations).toHaveLength(1);
15
+ expect(violations[0]).toEqual({
16
+ path: 'email',
17
+ constraint: 'email',
18
+ message: 'This value is not a valid email address.',
19
+ value: 'invalid',
20
+ });
21
+ });
22
+ it('accepts valid email by default', () => {
23
+ const context = {
24
+ path: 'email',
25
+ root: { email: 'user@example.com' },
26
+ value: 'user@example.com',
27
+ constraint: 'email',
28
+ options: {},
29
+ runNestedRules: () => [],
30
+ };
31
+ const violations = email('user@example.com', context);
32
+ expect(violations).toHaveLength(0);
33
+ });
34
+ it('rejects localhost domains by default', () => {
35
+ const context = {
36
+ path: 'email',
37
+ root: { email: 'user@localhost' },
38
+ value: 'user@localhost',
39
+ constraint: 'email',
40
+ options: {},
41
+ runNestedRules: () => [],
42
+ };
43
+ const violations = email('user@localhost', context);
44
+ expect(violations).toHaveLength(1);
45
+ expect(violations[0]).toEqual({
46
+ path: 'email',
47
+ constraint: 'email',
48
+ message: 'This value is not a valid email address.',
49
+ value: 'user@localhost',
50
+ });
51
+ });
52
+ it('normalizes values before validation', () => {
53
+ const context = {
54
+ path: 'email',
55
+ root: { email: ' USER@EXAMPLE.COM ' },
56
+ value: ' USER@EXAMPLE.COM ',
57
+ constraint: 'email',
58
+ options: { normalizer: (value) => value.trim().toLowerCase() },
59
+ runNestedRules: () => [],
60
+ };
61
+ const violations = email(' USER@EXAMPLE.COM ', context);
62
+ expect(violations).toHaveLength(0);
63
+ });
64
+ it('uses a custom message when provided', () => {
65
+ const context = {
66
+ path: 'email',
67
+ root: { email: 'invalid' },
68
+ value: 'invalid',
69
+ constraint: 'email',
70
+ options: { message: 'Invalid email' },
71
+ runNestedRules: () => [],
72
+ };
73
+ const violations = email('invalid', context);
74
+ expect(violations).toHaveLength(1);
75
+ expect(violations[0]).toEqual({
76
+ path: 'email',
77
+ constraint: 'email',
78
+ message: 'Invalid email',
79
+ value: 'invalid',
80
+ });
81
+ });
82
+ it('rejects non-string values with the default message', () => {
83
+ const context = {
84
+ path: 'email',
85
+ root: { email: 42 },
86
+ value: 42,
87
+ constraint: 'email',
88
+ options: {},
89
+ runNestedRules: () => [],
90
+ };
91
+ const violations = email(42, context);
92
+ expect(violations).toHaveLength(1);
93
+ expect(violations[0]).toEqual({
94
+ path: 'email',
95
+ constraint: 'email',
96
+ message: 'This value is not a valid email address.',
97
+ value: 42,
98
+ });
99
+ });
100
+ it('uses a custom message for non-string values', () => {
101
+ const context = {
102
+ path: 'email',
103
+ root: { email: 42 },
104
+ value: 42,
105
+ constraint: 'email',
106
+ options: { message: 'Invalid email' },
107
+ runNestedRules: () => [],
108
+ };
109
+ const violations = email(42, context);
110
+ expect(violations).toHaveLength(1);
111
+ expect(violations[0]).toEqual({
112
+ path: 'email',
113
+ constraint: 'email',
114
+ message: 'Invalid email',
115
+ value: 42,
116
+ });
117
+ });
118
+ });
119
+ //# sourceMappingURL=email.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.test.js","sourceRoot":"","sources":["../../../../src/validator/constraints/string/email.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare class UnknownConstraintError extends Error {
2
+ constructor(field: string, constraint: string);
3
+ }
4
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/validator/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAI9C"}
@@ -0,0 +1,7 @@
1
+ export class UnknownConstraintError extends Error {
2
+ constructor(field, constraint) {
3
+ super(`Field "${field}" references unregistered constraint "${constraint}".`);
4
+ this.name = 'UnknownConstraintError';
5
+ }
6
+ }
7
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/validator/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,KAAa,EAAE,UAAkB;QAC3C,KAAK,CAAC,UAAU,KAAK,yCAAyC,UAAU,IAAI,CAAC,CAAC;QAC9E,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export * from './validator.js';
2
+ export * from './types.js';
3
+ export * from './constraints/index.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './validator.js';
2
+ export * from './types.js';
3
+ export * from './constraints/index.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC"}
@@ -0,0 +1,31 @@
1
+ export type Violation = {
2
+ path: string;
3
+ message: string;
4
+ constraint: string;
5
+ value: unknown;
6
+ };
7
+ export type ConstraintOptions = {
8
+ groups?: string[];
9
+ } & Record<string, unknown>;
10
+ export type ConstraintContext = {
11
+ path: string;
12
+ root: unknown;
13
+ value: unknown;
14
+ constraint: string;
15
+ options: ConstraintOptions;
16
+ runNestedRules: (value: unknown, rules: FieldRules, path: string) => Violation[];
17
+ };
18
+ export type ConstraintValidator = (value: unknown, context: ConstraintContext) => Violation[];
19
+ export type ConstraintsMap = Record<string, ConstraintValidator>;
20
+ export type FieldRuleEntry = string | Record<string, ConstraintOptions>;
21
+ export type FieldRules = Record<string, ConstraintOptions> | FieldRuleEntry[];
22
+ export type ValidationRules = Record<string, FieldRules>;
23
+ export type ValidatorOptions = {
24
+ constraints: ConstraintsMap;
25
+ };
26
+ export type ValidateOptions = {
27
+ groups?: string[];
28
+ };
29
+ export type Payload = Record<string, unknown>;
30
+ export type Validator = (payload: Payload, rules: ValidationRules, options?: ValidateOptions) => Violation[];
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/validator/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAChF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;CAClF,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,KAAK,SAAS,EAAE,CAAC;AAE9F,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAEjE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAExE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,cAAc,EAAE,CAAC;AAE9E,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEzD,MAAM,MAAM,gBAAgB,GAAG;IAAE,WAAW,EAAE,cAAc,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,SAAS,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/validator/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { Validator, ValidatorOptions } from './types.js';
2
+ export declare const createValidator: (options: ValidatorOptions) => Validator;
3
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/validator/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAUL,SAAS,EACT,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,eAAe,GAAI,SAAS,gBAAgB,KAAG,SAc3D,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { UnknownConstraintError } from './errors.js';
2
+ export const createValidator = (options) => {
3
+ const { constraints } = options;
4
+ return function validate(payload, rules, options) {
5
+ const ruleEntries = Object.entries(rules);
6
+ // If no groups are provided, implicitly validate against "Default".
7
+ const activeGroups = options?.groups && options.groups.length > 0 ? options.groups : ['Default'];
8
+ // Apply all field rules and aggregate results.
9
+ return ruleEntries.flatMap(function (fieldEntry) {
10
+ return applyFieldRules(constraints, payload, fieldEntry, activeGroups);
11
+ });
12
+ };
13
+ };
14
+ function applyFieldRules(constraintsByName, payload, [field, rulesForField], activeGroups, currentValue) {
15
+ const isGroupActive = (groups) => groups.length === 0 || groups.some(group => activeGroups.includes(group));
16
+ const normalizedFieldRules = normalizeFieldRules(rulesForField);
17
+ return normalizedFieldRules.flatMap(([constraintName, options]) => {
18
+ // Check if the constraint should be applied based on groups.
19
+ const groups = options?.groups ?? [];
20
+ if (!isGroupActive(groups))
21
+ return [];
22
+ // Helper function to apply nested rules.
23
+ const applyNestedRules = (nextValue, rules, path) => applyFieldRules(constraintsByName, payload, [path, rules], activeGroups, nextValue);
24
+ // Find the constraint, build the context, and apply it.
25
+ const constraintValidator = resolveConstraint(constraintsByName, field, constraintName);
26
+ const value = currentValue ?? payload[field];
27
+ const context = {
28
+ path: field,
29
+ root: payload,
30
+ value,
31
+ constraint: constraintName,
32
+ options,
33
+ runNestedRules: applyNestedRules,
34
+ };
35
+ return constraintValidator(value, context);
36
+ });
37
+ }
38
+ function resolveConstraint(constraintValidatorMap, field, constraintName) {
39
+ const constraintValidator = constraintValidatorMap[constraintName];
40
+ if (!constraintValidator) {
41
+ throw new UnknownConstraintError(field, constraintName);
42
+ }
43
+ return constraintValidator;
44
+ }
45
+ function normalizeFieldRules(fieldRules) {
46
+ // Normalize rule shapes (array or map) into a consistent tuple list.
47
+ if (Array.isArray(fieldRules)) {
48
+ return fieldRules.flatMap(entry => normalizeFieldRuleEntry(entry));
49
+ }
50
+ return Object.entries(fieldRules).map(([constraintName, options]) => [constraintName, options]);
51
+ }
52
+ function normalizeFieldRuleEntry(entry) {
53
+ // Convert shorthand rule declarations into a full [name, options] tuple.
54
+ if (typeof entry === 'string') {
55
+ return [[entry, {}]];
56
+ }
57
+ return Object.entries(entry).map(([constraintName, options]) => [constraintName, options]);
58
+ }
59
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/validator/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAiBlD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAyB,EAAa,EAAE;IACtE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEhC,OAAO,SAAS,QAAQ,CAAC,OAAgB,EAAE,KAAsB,EAAE,OAAyB;QAC1F,MAAM,WAAW,GAAiB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAExD,oEAAoE;QACpE,MAAM,YAAY,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEjG,+CAA+C;QAC/C,OAAO,WAAW,CAAC,OAAO,CAAC,UAAU,UAAsB;YACzD,OAAO,eAAe,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,SAAS,eAAe,CACtB,iBAAiC,EACjC,OAAgB,EAChB,CAAC,KAAK,EAAE,aAAa,CAAa,EAClC,YAAsB,EACtB,YAAsB;IAEtB,MAAM,aAAa,GAAG,CAAC,MAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtH,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAEhE,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE;QAChE,6DAA6D;QAC7D,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,yCAAyC;QACzC,MAAM,gBAAgB,GAAG,CAAC,SAAkB,EAAE,KAAiB,EAAE,IAAY,EAAE,EAAE,CAC/E,eAAe,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAEtF,wDAAwD;QACxD,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,iBAAiB,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAsB;YACjC,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,OAAO;YACb,KAAK;YACL,UAAU,EAAE,cAAc;YAC1B,OAAO;YACP,cAAc,EAAE,gBAAgB;SACjC,CAAC;QAEF,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CACxB,sBAAsC,EACtC,KAAa,EACb,cAAsB;IAEtB,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAEnE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,IAAI,sBAAsB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,SAAS,mBAAmB,CAAC,UAAsB;IACjD,qEAAqE;IACrE,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAqB;IACpD,yEAAyE;IACzE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.test.d.ts","sourceRoot":"","sources":["../../src/validator/validator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,281 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { UnknownConstraintError } from './errors.js';
3
+ import { createValidator } from './validator.js';
4
+ describe('Validator', () => {
5
+ describe('Registry', () => {
6
+ it('should fail when a rule references an undefined constraint', () => {
7
+ const validate = createValidator({ constraints: {} });
8
+ const rules = {
9
+ name: ['required'],
10
+ };
11
+ expect(() => validate({ name: 'John' }, rules)).toThrowError(UnknownConstraintError);
12
+ expect(() => validate({ name: 'John' }, rules)).toThrowError('Field "name" references unregistered constraint "required".');
13
+ });
14
+ });
15
+ describe('Violations', () => {
16
+ it('should use provided constraints registry to validate rules', () => {
17
+ const validate = createValidator({
18
+ constraints: {
19
+ customConstraint,
20
+ },
21
+ });
22
+ const rules = {
23
+ name: ['customConstraint'],
24
+ };
25
+ const violations = validate({ name: '' }, rules);
26
+ expect(violations).toHaveLength(1);
27
+ expect(violations[0]).toEqual({
28
+ path: 'name',
29
+ constraint: 'customConstraint',
30
+ message: 'Custom constraint validation failed',
31
+ value: '',
32
+ });
33
+ });
34
+ it('should map each violation to the invalid field', () => {
35
+ const validate = createValidator({
36
+ constraints: {
37
+ customConstraint,
38
+ },
39
+ });
40
+ const rules = {
41
+ name: ['customConstraint'],
42
+ age: ['customConstraint'],
43
+ };
44
+ const violations = validate({ name: '', age: 30 }, rules);
45
+ expect(violations).toHaveLength(2);
46
+ expect(violations[0]).toEqual({
47
+ path: 'name',
48
+ constraint: 'customConstraint',
49
+ message: 'Custom constraint validation failed',
50
+ value: '',
51
+ });
52
+ expect(violations[1]).toEqual({
53
+ path: 'age',
54
+ constraint: 'customConstraint',
55
+ message: 'Custom constraint validation failed',
56
+ value: 30,
57
+ });
58
+ });
59
+ it('should not append empty violations', () => {
60
+ const validate = createValidator({
61
+ constraints: {
62
+ passedConstraint,
63
+ },
64
+ });
65
+ const rules = {
66
+ name: ['passedConstraint'],
67
+ };
68
+ const violations = validate({ name: 'John' }, rules);
69
+ expect(violations).toHaveLength(0);
70
+ });
71
+ it('should validate field with multiple constraints', () => {
72
+ const validate = createValidator({
73
+ constraints: {
74
+ customConstraint,
75
+ anotherCustomConstraint,
76
+ },
77
+ });
78
+ const rules = {
79
+ name: ['customConstraint', 'anotherCustomConstraint'],
80
+ };
81
+ const violations = validate({ name: '' }, rules);
82
+ expect(violations).toHaveLength(2);
83
+ expect(violations[0]).toEqual({
84
+ path: 'name',
85
+ constraint: 'customConstraint',
86
+ message: 'Custom constraint validation failed',
87
+ value: '',
88
+ });
89
+ expect(violations[1]).toEqual({
90
+ path: 'name',
91
+ constraint: 'anotherCustomConstraint',
92
+ message: 'Another custom constraint validation failed',
93
+ value: '',
94
+ });
95
+ });
96
+ it('should accept object rule definitions', () => {
97
+ const validate = createValidator({
98
+ constraints: {
99
+ customConstraint,
100
+ },
101
+ });
102
+ const rules = {
103
+ name: {
104
+ customConstraint: {},
105
+ },
106
+ };
107
+ const violations = validate({ name: '' }, rules);
108
+ expect(violations).toHaveLength(1);
109
+ expect(violations[0]).toEqual({
110
+ path: 'name',
111
+ constraint: 'customConstraint',
112
+ message: 'Custom constraint validation failed',
113
+ value: '',
114
+ });
115
+ });
116
+ it('should accept mixed rule definitions as arrays of strings and option objects', () => {
117
+ const validate = createValidator({
118
+ constraints: {
119
+ customConstraint,
120
+ minLengthConstraint,
121
+ },
122
+ });
123
+ const rules = {
124
+ name: ['customConstraint', { minLengthConstraint: { min: 3 } }],
125
+ };
126
+ const violations = validate({ name: 'ab' }, rules);
127
+ expect(violations).toHaveLength(2);
128
+ expect(violations[0]).toEqual({
129
+ path: 'name',
130
+ constraint: 'customConstraint',
131
+ message: 'Custom constraint validation failed',
132
+ value: 'ab',
133
+ });
134
+ expect(violations[1]).toEqual({
135
+ path: 'name',
136
+ constraint: 'minLengthConstraint',
137
+ message: 'Must be at least 3 characters',
138
+ value: 'ab',
139
+ });
140
+ });
141
+ });
142
+ describe('Constraint options', () => {
143
+ it('should pass rule options to constraints', () => {
144
+ const validate = createValidator({
145
+ constraints: {
146
+ minLengthConstraint,
147
+ },
148
+ });
149
+ const rules = {
150
+ name: [{ minLengthConstraint: { min: 3 } }],
151
+ };
152
+ const violations = validate({ name: 'ab' }, rules);
153
+ expect(violations).toHaveLength(1);
154
+ expect(violations[0]).toEqual({
155
+ path: 'name',
156
+ constraint: 'minLengthConstraint',
157
+ message: 'Must be at least 3 characters',
158
+ value: 'ab',
159
+ });
160
+ });
161
+ });
162
+ describe('Groups', () => {
163
+ it('should skip constraints when groups do not intersect', () => {
164
+ const validate = createValidator({
165
+ constraints: {
166
+ groupedConstraint,
167
+ },
168
+ });
169
+ const rules = {
170
+ email: [{ groupedConstraint: { groups: ['create'] } }],
171
+ };
172
+ const violations = validate({ email: '' }, rules, { groups: ['update'] });
173
+ expect(violations).toHaveLength(0);
174
+ });
175
+ it('should apply constraints when no groups are provided', () => {
176
+ const validate = createValidator({
177
+ constraints: {
178
+ groupedConstraint,
179
+ },
180
+ });
181
+ const rules = {
182
+ email: ['groupedConstraint'],
183
+ };
184
+ const violations = validate({ email: '' }, rules);
185
+ expect(violations).toHaveLength(1);
186
+ expect(violations[0]).toEqual({
187
+ path: 'email',
188
+ constraint: 'groupedConstraint',
189
+ message: 'Grouped constraint failed',
190
+ value: '',
191
+ });
192
+ });
193
+ it('should apply constraints for the Default group when no groups are provided', () => {
194
+ const validate = createValidator({
195
+ constraints: {
196
+ groupedConstraint,
197
+ },
198
+ });
199
+ const rules = {
200
+ email: [{ groupedConstraint: { groups: ['Default'] } }],
201
+ };
202
+ const violations = validate({ email: '' }, rules);
203
+ expect(violations).toHaveLength(1);
204
+ expect(violations[0]).toEqual({
205
+ path: 'email',
206
+ constraint: 'groupedConstraint',
207
+ message: 'Grouped constraint failed',
208
+ value: '',
209
+ });
210
+ });
211
+ it('should fall back to the Default group when groups are empty', () => {
212
+ const validate = createValidator({
213
+ constraints: {
214
+ groupedConstraint,
215
+ },
216
+ });
217
+ const rules = {
218
+ email: [{ groupedConstraint: { groups: ['Default'] } }],
219
+ };
220
+ const violations = validate({ email: '' }, rules, { groups: [] });
221
+ expect(violations).toHaveLength(1);
222
+ expect(violations[0]).toEqual({
223
+ path: 'email',
224
+ constraint: 'groupedConstraint',
225
+ message: 'Grouped constraint failed',
226
+ value: '',
227
+ });
228
+ });
229
+ });
230
+ });
231
+ function customConstraint(value, context) {
232
+ return [
233
+ {
234
+ path: context.path,
235
+ message: 'Custom constraint validation failed',
236
+ constraint: context.constraint,
237
+ value,
238
+ },
239
+ ];
240
+ }
241
+ function anotherCustomConstraint(value, context) {
242
+ return [
243
+ {
244
+ path: context.path,
245
+ message: 'Another custom constraint validation failed',
246
+ constraint: context.constraint,
247
+ value,
248
+ },
249
+ ];
250
+ }
251
+ function passedConstraint(_, __) {
252
+ return [];
253
+ }
254
+ function minLengthConstraint(value, context) {
255
+ const min = context.options.min;
256
+ if (typeof value === 'string' && typeof min === 'number' && value.length < min) {
257
+ return [
258
+ {
259
+ path: context.path,
260
+ message: `Must be at least ${min} characters`,
261
+ constraint: context.constraint,
262
+ value,
263
+ },
264
+ ];
265
+ }
266
+ return [];
267
+ }
268
+ function groupedConstraint(value, context) {
269
+ if (value === '' || value === null || value === undefined) {
270
+ return [
271
+ {
272
+ path: context.path,
273
+ message: 'Grouped constraint failed',
274
+ constraint: context.constraint,
275
+ value,
276
+ },
277
+ ];
278
+ }
279
+ return [];
280
+ }
281
+ //# sourceMappingURL=validator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.test.js","sourceRoot":"","sources":["../../src/validator/validator.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@koala-ts/framework",
3
3
  "main": "dist/index.js",
4
4
  "type": "module",
5
- "version": "2.10.0",
5
+ "version": "2.11.1",
6
6
  "description": "A NodeJS framework for lazy developers",
7
7
  "keywords": [
8
8
  "koala",
@@ -57,21 +57,20 @@
57
57
  },
58
58
  "devDependencies": {
59
59
  "@arethetypeswrong/cli": "^0.18.2",
60
- "@eslint/js": "^9.38.0",
61
- "@stylistic/eslint-plugin": "^5.5.0",
60
+ "@eslint/js": "^9.39.2",
62
61
  "@vitest/coverage-v8": "^4.0.12",
63
- "eslint": "^9.38.0",
62
+ "eslint": "^9.39.2",
64
63
  "eslint-config-prettier": "^10.1.8",
65
64
  "eslint-plugin-import": "^2.32.0",
66
- "eslint-plugin-n": "^17.23.1",
67
65
  "eslint-plugin-prettier": "^5.5.4",
68
66
  "eslint-plugin-promise": "^7.2.1",
69
- "globals": "^17.0.0",
67
+ "globals": "^17.3.0",
68
+ "jiti": "^2.6.1",
70
69
  "prettier": "^3.7.4",
71
70
  "tsc-alias": "^1.8.16",
72
71
  "tsx": "^4.20.6",
73
72
  "typescript": "^5.9.3",
74
- "typescript-eslint": "^8.46.2",
73
+ "typescript-eslint": "^8.54.0",
75
74
  "vitest": "^4.0.10"
76
75
  },
77
76
  "publishConfig": {