Skip to main content
Module

x/value_schema/docs/migration/v3-to-v4.md

simple, easy-to-use, and declarative input validator; supports Node.js, TypeScript, Deno, and Bun
Latest
File

v3 to v4

behavior of {ifUndefined: undefined}

In v3, {ifUndefined: undefined} is equivalent to {}. Both of them cause error if input value is undefined.

In v4, the former accepts undefined (and keeps it as-is), the latter doesn’t.

import vs from "value-schema";

const input = {};

// The below code throws an error in v3, but outputs `{foo: undefined}` in v4.
{
    const output = vs.applySchemaObject({
        foo: vs.number({
            ifUndefined: undefined,
        }),
    }, input);
    console.log(output);
}

// The below code throws an error in both versions.
{
    const output = vs.applySchemaObject({
        foo: vs.number({}),
    }, input);
    console.log(output);
}

how to migrate

  • Replace {ifUndefined: undefined} with {}.

rename ValueSchemaError.prototype.cause to ValueSchemaError.prototype.rule

Error.prototype.cause has come in ES2022. It conflicts ValueSchemaError.prototype.cause, therefore ValueSchemaError.prototype.cause has been renamed to ValueSchemaError.prototype.rule, that means “the rule that input value didn’t satisfy”.

In addition, CAUSE.foo has been renamed to RULE.foo.

// v3
import vs from "value-schema";

try {
    const input = {};
    const output = vs.applySchemaObject({
        foo: vs.number(),
    }, input);
}
catch (err) { // ValueSchemaError
    if (err.cause === vs.CAUSE.UNDEFINED) {
        console.error("undefined!");
    }
}
// v4
import vs from "value-schema";

try {
    const input = {};
    const output = vs.applySchemaObject({
        foo: vs.number(),
    }, input);
}
catch (err) { // ValueSchemaError
    if (err.rule === vs.RULE.UNDEFINED) { // cause -> rule
        console.error("undefined!");
    }
}

how to migrate

  • Replace err.cause with err.rule.
  • Replace vs.CAUSE with vs.RULE.

rename converter() to transform()

Option converter has been renamed to transform. Just a rename, so input parameters and return values are not changed.

how to migrate

  • Replace converter with transform.
  • Replace vs.RULE.CONVERTER with vs.RULE.TRANSFORM.