typebox 1.0.80 → 1.1.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.
@@ -1,8 +1,9 @@
1
1
  // deno-fmt-ignore-file
2
+ import { Settings } from '../system/settings/index.mjs';
2
3
  import { Arguments } from '../system/arguments/index.mjs';
3
4
  import { Environment } from '../system/environment/index.mjs';
4
5
  import { Base } from '../type/index.mjs';
5
- import { Errors, Clean, Convert, Create, Default, Decode, Encode, HasCodec, Parser } from '../value/index.mjs';
6
+ import { Errors, Clean, Convert, Create, Default, Decode, Encode, HasCodec, Parser, ParseError } from '../value/index.mjs';
6
7
  import { Build } from '../schema/index.mjs';
7
8
  // ------------------------------------------------------------------
8
9
  // Validator<...>
@@ -93,13 +94,14 @@ export class Validator extends Base {
93
94
  Clone() {
94
95
  return new Validator(this.context, this.type, this.isEvaluated, this.hasCodec, this.code, this.check);
95
96
  }
96
- // ----------------------------------------------------------------
97
- // Parse | Decode | Encode
98
- // ----------------------------------------------------------------
99
97
  /** Parses a value */
100
98
  Parse(value) {
101
- const result = this.Check(value) ? value : Parser(this.context, this.type, value);
102
- return result;
99
+ const checked = this.Check(value);
100
+ if (checked)
101
+ return value;
102
+ if (Settings.Get().correctiveParse)
103
+ return Parser(this.context, this.type, value);
104
+ throw new ParseError(value, this.Errors(value));
103
105
  }
104
106
  /** Decodes a value */
105
107
  Decode(value) {
@@ -38,6 +38,15 @@ export interface TSettings {
38
38
  * @default false
39
39
  */
40
40
  enumerableKind: boolean;
41
+ /**
42
+ * Controls whether TypeBox uses corrective Parse. When enabled, TypeBox will attempt to recover invalid
43
+ * values during Parse by running a sequence of `Value.*` operations to `Convert`, `Default`, and `Clean`
44
+ * the value, followed by a subsequent `Assert`. Enabling this option may incur significant performance
45
+ * overhead for invalid values. It is recommended to keep this disabled in performance-sensitive
46
+ * applications.
47
+ * @default false
48
+ */
49
+ correctiveParse: boolean;
41
50
  }
42
51
  /** Resets system settings to defaults */
43
52
  export declare function Reset(): void;
@@ -5,7 +5,8 @@ const settings = {
5
5
  maxErrors: 8,
6
6
  useEval: true,
7
7
  exactOptionalPropertyTypes: false,
8
- enumerableKind: false
8
+ enumerableKind: false,
9
+ correctiveParse: false
9
10
  };
10
11
  /** Resets system settings to defaults */
11
12
  export function Reset() {
@@ -14,6 +15,7 @@ export function Reset() {
14
15
  settings.useEval = true;
15
16
  settings.exactOptionalPropertyTypes = false;
16
17
  settings.enumerableKind = false;
18
+ settings.correctiveParse = false;
17
19
  }
18
20
  /** Sets system settings */
19
21
  export function Set(options) {
@@ -1,16 +1,17 @@
1
1
  // deno-fmt-ignore-file
2
- import { Evaluate, IsObject, Options } from '../../type/index.mjs';
2
+ import { Evaluate, Instantiate, IsObject, Options } from '../../type/index.mjs';
3
3
  import { Guard } from '../../guard/index.mjs';
4
4
  import { FromType } from './from-type.mjs';
5
5
  // ------------------------------------------------------------------
6
6
  // EvaluateIntersection
7
7
  // ------------------------------------------------------------------
8
- function EvaluateIntersection(type) {
8
+ function EvaluateIntersection(context, type) {
9
9
  // Note: reinterpret unevaluatedProperties as additionalProperties
10
10
  const additionalProperties = Guard.HasPropertyKey(type, 'unevaluatedProperties')
11
11
  ? { additionalProperties: type.unevaluatedProperties }
12
12
  : {};
13
- const evaluated = Evaluate(type);
13
+ const instantiated = Instantiate(context, type);
14
+ const evaluated = Evaluate(instantiated);
14
15
  return IsObject(evaluated)
15
16
  ? Options(evaluated, additionalProperties)
16
17
  : evaluated;
@@ -20,6 +21,6 @@ function EvaluateIntersection(type) {
20
21
  // ------------------------------------------------------------------
21
22
  export function FromIntersect(context, type, value) {
22
23
  // Note: Evaluate and route back to FromType in evaluated form (likely an Object)
23
- const evaluated = EvaluateIntersection(type);
24
+ const evaluated = EvaluateIntersection(context, type);
24
25
  return FromType(context, evaluated, value);
25
26
  }
@@ -1,7 +1,8 @@
1
1
  // deno-fmt-ignore-file
2
- import { Evaluate } from '../../type/index.mjs';
2
+ import { Evaluate, Instantiate } from '../../type/index.mjs';
3
3
  import { FromType } from './from-type.mjs';
4
4
  export function FromIntersect(context, type, value) {
5
- const evaluatedType = Evaluate(type);
6
- return FromType(context, evaluatedType, value);
5
+ const instantiated = Instantiate(context, type);
6
+ const evaluated = Evaluate(instantiated);
7
+ return FromType(context, evaluated, value);
7
8
  }
@@ -1,6 +1,8 @@
1
1
  // deno-fmt-ignore-file
2
- import { Evaluate } from '../../type/index.mjs';
2
+ import { Evaluate, Instantiate } from '../../type/index.mjs';
3
3
  import { FromType } from './from-type.mjs';
4
4
  export function FromIntersect(context, type) {
5
- return FromType(context, Evaluate(type));
5
+ const instantiated = Instantiate(context, type);
6
+ const evaluated = Evaluate(instantiated);
7
+ return FromType(context, evaluated);
6
8
  }
@@ -1,8 +1,9 @@
1
1
  // deno-fmt-ignore-file
2
2
  // deno-lint-ignore-file
3
- import { Evaluate } from '../../type/index.mjs';
3
+ import { Evaluate, Instantiate } from '../../type/index.mjs';
4
4
  import { FromType } from './from-type.mjs';
5
5
  export function FromIntersect(context, type, value) {
6
- const evaluted = Evaluate(type);
7
- return FromType(context, evaluted, value);
6
+ const instantiated = Instantiate(context, type);
7
+ const evaluated = Evaluate(instantiated);
8
+ return FromType(context, evaluated, value);
8
9
  }
@@ -5,17 +5,7 @@ export declare class ParseError extends AssertError {
5
5
  constructor(value: unknown, errors: TLocalizedValidationError[]);
6
6
  }
7
7
  export declare const Parser: import("../pipeline/pipeline.mjs").PipelineInterface;
8
- /**
9
- * Parses a value with the given type. The function will Check the value and return
10
- * early if it matches the provided type. If the value does not match, it is processed
11
- * through a sequence of Clone, Default, Convert, and Clean operations and checked again.
12
- * A `ParseError` is thrown if the value fails to match after the processing sequence.
13
- */
8
+ /** Parses a value with the given type. */
14
9
  export declare function Parse<const Type extends TSchema, Result extends unknown = StaticParse<Type>>(type: Type, value: unknown): Result;
15
- /**
16
- * Parses a value with the given type. The function will Check the value and return
17
- * early if it matches the provided type. If the value does not match, it is processed
18
- * through a sequence of Clone, Default, Convert, and Clean operations and checked again.
19
- * A `ParseError` is thrown if the value fails to match after the processing sequence.
20
- */
10
+ /** Parses a value with the given type. */
21
11
  export declare function Parse<Context extends TProperties, const Type extends TSchema, Result extends unknown = StaticParse<Type, Context>>(context: Context, type: Type, value: unknown): Result;
@@ -1,4 +1,5 @@
1
1
  // deno-fmt-ignore-file
2
+ import { Settings } from '../../system/system.mjs';
2
3
  import { Arguments } from '../../system/arguments/index.mjs';
3
4
  import { AssertError } from '../assert/index.mjs';
4
5
  import { Check } from '../check/index.mjs';
@@ -31,17 +32,16 @@ export const Parser = Pipeline([
31
32
  (context, type, value) => Clean(context, type, value),
32
33
  (context, type, value) => Assert(context, type, value)
33
34
  ]);
34
- /**
35
- * Parses a value with the given type. The function will Check the value and return
36
- * early if it matches the provided type. If the value does not match, it is processed
37
- * through a sequence of Clone, Default, Convert, and Clean operations and checked again.
38
- * A `ParseError` is thrown if the value fails to match after the processing sequence.
39
- */
35
+ /** Parses a value with the given type. */
40
36
  export function Parse(...args) {
41
37
  const [context, type, value] = Arguments.Match(args, {
42
38
  3: (context, type, value) => [context, type, value],
43
39
  2: (type, value) => [{}, type, value],
44
40
  });
45
- const result = Check(context, type, value) ? value : Parser(context, type, value);
46
- return result;
41
+ const checked = Check(context, type, value);
42
+ if (checked)
43
+ return value;
44
+ if (Settings.Get().correctiveParse)
45
+ return Parser(context, type, value);
46
+ throw new ParseError(value, Errors(context, type, value));
47
47
  }
@@ -1,7 +1,8 @@
1
1
  // deno-fmt-ignore-file
2
- import { Evaluate } from '../../type/index.mjs';
2
+ import { Instantiate, Evaluate } from '../../type/index.mjs';
3
3
  import { FromType } from './from-type.mjs';
4
4
  export function FromIntersect(context, type, value) {
5
- const evaluated = Evaluate(type);
5
+ const instantiated = Instantiate(context, type);
6
+ const evaluated = Evaluate(instantiated);
6
7
  return FromType(context, evaluated, value);
7
8
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typebox",
3
3
  "description": "Json Schema Type Builder with Static Type Resolution for TypeScript",
4
- "version": "1.0.80",
4
+ "version": "1.1.0",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "jsonschema"