Runtime object transformation, parsing and validation with inferred static TypeScript typing.
npm install typeparse
yarn add typeparse
import { TypeParse, Types as T } from "typeparse";
const input = JSON.parse(
`{
"id": "12345",
"userInfo": {
"name": "John Doe",
"phone": "+1 234 567 890"
}
}`
);
// Parsing configuration
const tp = new TypeParse(
T.Object({
id: T.Number(),
name: T.String({ path: "userInfo.name" }),
phoneNumber: T.String({ path: "userInfo.phone" }),
address: T.String({ path: "userInfo.address", defaultValue: "no-address" }),
email: T.String({ path: "userInfo.email" }).optional(),
})
);
const user = tp.parse(input); // User is parsed with inferred type
console.log(user);
// {
// id: 12345,
// name: 'John Doe',
// phoneNumber: '+1 234 567 890',
// address: 'no-address',
// email: undefined
// }
In case we need to not only parse an object but also to trasform it (i.e.):
{
"user": {
"name": "John",
"lastName": "Doe",
},
"email": "john.doe.@mail.com",
"phoneNumbers": ["123-456-7890", "321-654-0987"]
}
To
{
"name": "John",
"lastName": "Doe",
"contactInfo": {
"email": "john.doe.@mail.com",
"phone": "123-456-7890"
}
}
We can use the path
parameter in order to create a new object, specifying the path from the original objects root to define each value.
import { TypeParse, Types as T } from "typeparse";
const input = {
user: {
name: "John",
lastName: "Doe",
},
email: "4522 Sigley Road",
phoneNumbers: ["123-456-7890", "321-654-0987"],
};
const tp = new TypeParse(
T.Object({
name: T.String({ path: "user.name" }),
lastName: T.String({ path: "user.lastName" }),
contactInfo: T.Object({
email: T.String({ path: "email" }),
phone: T.String({ path: "phoneNumbers.[0]" }),
}),
})
);
console.log(tp.parse(input));
// {
// name: 'John',
// lastName: 'Doe',
// contactInfo: {
// email: '4522 Sigley Road',
// phone: '123-456-7890'
// }
// }