parseroni

A type safe runtime Parser for TypeScript

Usage no npm install needed!

<script type="module">
  import parseroni from 'https://cdn.skypack.dev/parseroni';
</script>

README

Parser for TypeScript

Born as an attempt to be a lightweight type-safe runtime JSON parser.


import {
    ParserType,
    parseObjectOf,
    parseArrayOf,
    parseString,
    parseExactly,
    optional,
    mapParser,
    success,
    isSuccess,
} from 'parser';

const parseAuthor = parseObjectOf(
    username: parseString,
    avatar: optional(parseString),
);

const parsePost = parseObjectOf(
    title: parseString,
    status: parseOneOf(
        parseExactly('published'),
        parseExactly('draft'),
    ),
    author: parseAuthor,
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
    publishedAt: mapParser(
        parseString,
        // assuming ISO8601 string
        string => success(new Date(string))
    ),
);

const parseResponse = parseObjectOf( {
    posts: parseArrayOf( parsePost )
} );

/**
 * Chained with DOM fetch
 */
async function getPosts() {
    const response = await fetch('/api/site/awesome.blog/posts')
        .then(response => response.json())
        .then(parseResponse);

    /**
     * Type guard to unwrap the parsed value
     */
    if (isSuccess(response)) {
        // 🚀 The response was successfully parsed and is safely typed
        const postResponse = response.value;
        console.log(postResponse.posts);
        return;
    }
    throw new Error(response.reason);
}

// Use the types created by the parsers:

type Author = ParserType<typeof parseAuthor>;
type Post = ParserType<typeof parsePost>;

const author: Author = {
   username: 5, // 💥 Not a string!
};

const post: Post = {
    title: 'Hello World',
    status: 'other', // 💥 Not 'published' or 'draft'
    publishedAt: 1235500482, // 💥 Not a Date
};