Skip to content

Commit

Permalink
Feature/migration guide (#570)
Browse files Browse the repository at this point in the history
* add migration guide

* add link to migration guide
  • Loading branch information
shimataro authored May 27, 2022
1 parent 6dd4f2b commit 663d131
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 0 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ simple, easy-to-use, and declarative input validator

supports [Node.js](https://nodejs.org/), [TypeScript](https://www.typescriptlang.org/), and [Deno](https://deno.land/)

Please read [migration guide](./migration.md) if you are using old version.

## Table of Contents

* [Introduction](#introduction)
Expand Down
86 changes: 86 additions & 0 deletions migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Migration Guide

This document describes breaking changes due to version up.

## v3 to v4

### behavior of `{ifUndefined: undefined}`

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

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

```typescript
import vs from "value-schema";

const input = {};

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

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

#### for migration

Replace `{ifUndefined: undefined}` with `{}`.

### rename `ValueSchemaError.prototype.cause` to `ValueSchemaError.prototype.rule`

[`Error.prototype.cause`](https://tc39.es/proposal-error-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`.

```typescript
// 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!");
}
}
```

```typescript
// 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!");
}
}
```

#### for migration

* Replace `err.cause` with `err.rule`.
* Replace `vs.CAUSE` with `vs.RULE`.

0 comments on commit 663d131

Please sign in to comment.