@ddd-ts-kit/validation 0.13.0 → 0.14.0

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/README.md CHANGED
@@ -195,7 +195,10 @@ const money = Type.Object({ cents: Type.Integer(), currency: Type.String() }, {
195
195
  const amount = sharedSchema('Amount', standardSchema(amountSchema));
196
196
  ```
197
197
 
198
- `sharedNameOf(jsonSchema)` answers the name a JSON Schema is shared under, if any. A shared
198
+ `sharedNameOf(jsonSchema)` answers the name a JSON Schema is shared under, if any.
199
+ `schemaBehind.of(schema)` answers the schema `sharedSchema` was given, so that what another
200
+ package attached to it (the fields `withFieldAccess` of `@ddd-ts-kit/http` reserves) holds for
201
+ the shared one too. A shared
199
202
  schema of the presentation layer lives where `generate schema` writes it: under
200
203
  `presentation/http/schemas/` of its context, or under `presentation/` of the shared kernel when
201
204
  several contexts answer with it; never in the domain.
@@ -1,8 +1,10 @@
1
1
  import type { JsonSchema } from '../json-schema.js';
2
2
  import type { DtoClass } from './dto-class.js';
3
3
  /**
4
- * The JSON Schema of a class, carrying under `$defs` only the classes reachable from it. Shared,
5
- * the class itself is one of them and the schema is a reference to it.
4
+ * The JSON Schema of a class, carrying under `$defs` only the classes reachable from it. A class
5
+ * that extends another one holds the properties of its ancestors too, as validation does: a class
6
+ * that declares nothing itself (`class Body extends pickClass(...) {}`) is described by them.
7
+ * Shared, the class itself is one of them and the schema is a reference to it.
6
8
  */
7
9
  export declare function selfContainedSchema(dto: DtoClass<object>, shared: boolean): JsonSchema;
8
10
  //# sourceMappingURL=self-contained-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"self-contained-schema.d.ts","sourceRoot":"","sources":["../../src/class-validator/self-contained-schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,UAAU,CActF"}
1
+ {"version":3,"file":"self-contained-schema.d.ts","sourceRoot":"","sources":["../../src/class-validator/self-contained-schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,UAAU,CActF"}
@@ -2,8 +2,10 @@ import { defaultMetadataStorage } from 'class-transformer/cjs/storage.js';
2
2
  import { validationMetadatasToSchemas } from 'class-validator-jsonschema';
3
3
  import { DEFINITIONS_POINTER } from '../shared/definitions-pointer.js';
4
4
  /**
5
- * The JSON Schema of a class, carrying under `$defs` only the classes reachable from it. Shared,
6
- * the class itself is one of them and the schema is a reference to it.
5
+ * The JSON Schema of a class, carrying under `$defs` only the classes reachable from it. A class
6
+ * that extends another one holds the properties of its ancestors too, as validation does: a class
7
+ * that declares nothing itself (`class Body extends pickClass(...) {}`) is described by them.
8
+ * Shared, the class itself is one of them and the schema is a reference to it.
7
9
  */
8
10
  export function selfContainedSchema(dto, shared) {
9
11
  const all = generatedSchemas();
@@ -24,17 +26,34 @@ function generatedSchemas() {
24
26
  });
25
27
  return Object.fromEntries(Object.entries(generated).map(([name, schema]) => [name, { ...schema }]));
26
28
  }
27
- /** A class that declares nothing itself (`class Body extends pickClass(...) {}`) is described by its nearest described ancestor. */
29
+ /** The schemas of the class and of its ancestors as one. */
28
30
  function ownSchema(dto, all) {
29
- let ancestor = dto;
30
- while (typeof ancestor === 'function' && ancestor.name !== '') {
31
- const described = all[ancestor.name];
32
- if (described !== undefined) {
33
- return described;
34
- }
35
- ancestor = Object.getPrototypeOf(ancestor);
31
+ return inherited(lineageOf(dto)
32
+ .map((name) => all[name])
33
+ .filter((schema) => schema !== undefined));
34
+ }
35
+ /** The names of the class and of its ancestors, the farthest first. */
36
+ function lineageOf(dto) {
37
+ const names = [];
38
+ for (let current = dto; typeof current === 'function' && current.name !== ''; current = Object.getPrototypeOf(current)) {
39
+ names.unshift(current.name);
40
+ }
41
+ return names;
42
+ }
43
+ /** The schemas of a lineage as one: the properties of each, the nearest class last, and every required name. */
44
+ function inherited(schemas) {
45
+ if (schemas.length === 0) {
46
+ return { type: 'object' };
47
+ }
48
+ const merged = {};
49
+ const properties = {};
50
+ const required = new Set();
51
+ for (const schema of schemas) {
52
+ Object.assign(merged, schema);
53
+ Object.assign(properties, schema['properties']);
54
+ (Array.isArray(schema['required']) ? schema['required'] : []).forEach((name) => required.add(name));
36
55
  }
37
- return { type: 'object' };
56
+ return { ...merged, properties, ...(required.size === 0 ? {} : { required: [...required] }) };
38
57
  }
39
58
  function collectDefs(node, all, defs) {
40
59
  if (Array.isArray(node)) {
@@ -1 +1 @@
1
- {"version":3,"file":"self-contained-schema.js","sourceRoot":"","sources":["../../src/class-validator/self-contained-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"self-contained-schema.js","sourceRoot":"","sources":["../../src/class-validator/self-contained-schema.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export type { Infer } from './infer.js';
4
4
  export type { JsonSchema } from './json-schema.js';
5
5
  export { parseOrThrow } from './parse-or-throw.js';
6
6
  export type { Schema } from './schema.js';
7
+ export { schemaBehind } from './shared/schema-behind.js';
7
8
  export { sharedNameOf } from './shared/shared-name-of.js';
8
9
  export { sharedSchema } from './shared/shared-schema.js';
9
10
  export { ValidationError } from './validation-error.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export { customSchema } from './custom-schema.js';
2
2
  export { formatPath } from './format-path.js';
3
3
  export { parseOrThrow } from './parse-or-throw.js';
4
+ export { schemaBehind } from './shared/schema-behind.js';
4
5
  export { sharedNameOf } from './shared/shared-name-of.js';
5
6
  export { sharedSchema } from './shared/shared-schema.js';
6
7
  export { ValidationError } from './validation-error.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Schema } from '../schema.js';
2
+ /**
3
+ * The schema another one was built from and validates with unchanged, as `sharedSchema` documents
4
+ * a schema under a name: what a package attached to the first one (the fields `withFieldAccess`
5
+ * of `@ddd-ts-kit/http` reserves) still holds for the second.
6
+ */
7
+ export declare const schemaBehind: {
8
+ of(schema: Schema<unknown>): Schema<unknown> | undefined;
9
+ record(wrapper: Schema<unknown>, wrapped: Schema<unknown>): void;
10
+ };
11
+ //# sourceMappingURL=schema-behind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-behind.d.ts","sourceRoot":"","sources":["../../src/shared/schema-behind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAY3C;;;;GAIG;AACH,eAAO,MAAM,YAAY;IACvB,EAAE,SAAS,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS;IAIxD,MAAM,UAAU,MAAM,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI;CAGjE,CAAC"}
@@ -0,0 +1,31 @@
1
+ /*
2
+ * One registry per process, whatever the number of copies of this package it loaded: the global
3
+ * symbol registry is what they all share.
4
+ */
5
+ const REGISTRY = Symbol.for('@ddd-ts-kit/validation/schema-behind/v1');
6
+ /**
7
+ * The schema another one was built from and validates with unchanged, as `sharedSchema` documents
8
+ * a schema under a name: what a package attached to the first one (the fields `withFieldAccess`
9
+ * of `@ddd-ts-kit/http` reserves) still holds for the second.
10
+ */
11
+ export const schemaBehind = {
12
+ of(schema) {
13
+ return registry().wrapped.get(schema);
14
+ },
15
+ record(wrapper, wrapped) {
16
+ registry().wrapped.set(wrapper, wrapped);
17
+ },
18
+ };
19
+ function registry() {
20
+ const existing = Reflect.get(globalThis, REGISTRY);
21
+ if (isRegistry(existing)) {
22
+ return existing;
23
+ }
24
+ const created = { wrapped: new WeakMap() };
25
+ Reflect.set(globalThis, REGISTRY, created);
26
+ return created;
27
+ }
28
+ function isRegistry(value) {
29
+ return typeof value === 'object' && value !== null && 'wrapped' in value && value.wrapped instanceof WeakMap;
30
+ }
31
+ //# sourceMappingURL=schema-behind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-behind.js","sourceRoot":"","sources":["../../src/shared/schema-behind.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;AAEvE;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,EAAE,CAAC,MAAuB;QACxB,OAAO,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,OAAwB,EAAE,OAAwB;QACvD,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC;AAEF,SAAS,QAAQ;IACf,MAAM,QAAQ,GAAY,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE5D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,YAAY,OAAO,CAAC;AAC/G,CAAC"}
@@ -3,7 +3,8 @@ import type { Schema } from '../schema.js';
3
3
  * A schema documented once, under `name`: its JSON Schema becomes a reference to its own
4
4
  * definition, so the OpenAPI generator writes it in `components.schemas` and every route that
5
5
  * uses it, whole or inside another schema, points at it with `$ref` instead of a copy.
6
- * Validation is unchanged: `parse` is the one of the schema given.
6
+ * Validation is unchanged: `parse` is the one of the schema given, and what another package
7
+ * attached to that schema holds for the shared one too (`schemaBehind`).
7
8
  */
8
9
  export declare function sharedSchema<T>(name: string, schema: Schema<T>): Schema<T>;
9
10
  //# sourceMappingURL=shared-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared-schema.d.ts","sourceRoot":"","sources":["../../src/shared/shared-schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQ3C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAW1E"}
1
+ {"version":3,"file":"shared-schema.d.ts","sourceRoot":"","sources":["../../src/shared/shared-schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAS3C;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAe1E"}
@@ -1,6 +1,7 @@
1
1
  import { DeclarationError } from '@ddd-ts-kit/kernel/declarations';
2
2
  import { DEFINITIONS_POINTER } from './definitions-pointer.js';
3
3
  import { isRecord } from './is-record.js';
4
+ import { schemaBehind } from './schema-behind.js';
4
5
  import { sharedNameOf } from './shared-name-of.js';
5
6
  /** What OpenAPI accepts as the key of a component, starting with a letter. */
6
7
  const COMPONENT_NAME = /^[A-Za-z][A-Za-z0-9._-]*$/;
@@ -8,16 +9,19 @@ const COMPONENT_NAME = /^[A-Za-z][A-Za-z0-9._-]*$/;
8
9
  * A schema documented once, under `name`: its JSON Schema becomes a reference to its own
9
10
  * definition, so the OpenAPI generator writes it in `components.schemas` and every route that
10
11
  * uses it, whole or inside another schema, points at it with `$ref` instead of a copy.
11
- * Validation is unchanged: `parse` is the one of the schema given.
12
+ * Validation is unchanged: `parse` is the one of the schema given, and what another package
13
+ * attached to that schema holds for the shared one too (`schemaBehind`).
12
14
  */
13
15
  export function sharedSchema(name, schema) {
14
16
  if (!COMPONENT_NAME.test(name)) {
15
17
  throw new DeclarationError(`"${name}" cannot name a shared schema: a name starts with a letter and holds only letters, digits, ".", "-" and "_", as an OpenAPI component does.`);
16
18
  }
17
- return {
19
+ const shared = {
18
20
  parse: (input) => schema.parse(input),
19
21
  toJsonSchema: () => asShared(name, schema.toJsonSchema()),
20
22
  };
23
+ schemaBehind.record(shared, schema);
24
+ return shared;
21
25
  }
22
26
  function asShared(name, jsonSchema) {
23
27
  if (sharedNameOf(jsonSchema) === name) {
@@ -1 +1 @@
1
- {"version":3,"file":"shared-schema.js","sourceRoot":"","sources":["../../src/shared/shared-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,8EAA8E;AAC9E,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAI,IAAY,EAAE,MAAiB;IAC7D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,gBAAgB,CACxB,IAAI,IAAI,4IAA4I,CACrJ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QACrC,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,UAAsB;IACpD,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,EAAE,GAAG,UAAU,CAAC;IAEpE,OAAO;QACL,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACtD,IAAI,EAAE,GAAG,mBAAmB,GAAG,IAAI,EAAE;QACrC,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE;KACrE,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"shared-schema.js","sourceRoot":"","sources":["../../src/shared/shared-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,8EAA8E;AAC9E,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAI,IAAY,EAAE,MAAiB;IAC7D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,gBAAgB,CACxB,IAAI,IAAI,4IAA4I,CACrJ,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAc;QACxB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QACrC,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;KAC1D,CAAC;IAEF,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,UAAsB;IACpD,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,EAAE,GAAG,UAAU,CAAC;IAEpE,OAAO;QACL,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACtD,IAAI,EAAE,GAAG,mBAAmB,GAAG,IAAI,EAAE;QACrC,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE;KACrE,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACtC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ddd-ts-kit/validation",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "One Schema contract for input validation, with adapters for zod, class-validator, TypeBox and Standard Schema.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,7 +42,7 @@
42
42
  "dist"
43
43
  ],
44
44
  "dependencies": {
45
- "@ddd-ts-kit/kernel": "0.13.0"
45
+ "@ddd-ts-kit/kernel": "0.14.0"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "class-transformer": ">=0.5.0",