

Xtypejs: data validation for JavaScript Apps - lucono
http://xtype.js.org

======
lucono
Thanks to lots of great community feedback and input, xtypejs now has a home
at
[[http://xtype.js.org](http://xtype.js.org)](http://xtype.js.org\]\(http://xtype.js.org\)),
with great documentation, user guide, and lots of examples.

------
o_____________o
Lately I've been using the JSON schema format to validate. It's powerful and
clean. We've paired it with RAML to validate everything from the URL
parameters, POST bodies, response bodies, etc.

[http://json-schema.org/](http://json-schema.org/)
[https://github.com/zaggino/z-schema](https://github.com/zaggino/z-schema)

------
lucono
Example of using xtypejs:

 _Go from this:_

    
    
        function searchEmployees(value) {
            if (typeof value === 'string') {
                 if (value.trim().length > 1) {
                    return EmployeeDB.searchByName(value);
                } else if (value.trim().length === 1) {
                    return EmployeeDB.searchByMiddleInitial(value);
                } else {
                    return { error: 'Invalid search value supplied' };
                }
            } else if (typeof value === 'object' && value !== null) {
                if (Object.keys(value).length === 1) {
                    return EmployeeDB.searchByFieldValuePair(value);
                } else if (Object.keys(value).length > 1) {
                    return { error: 'Search by multiple fields not supported' };
                } else {
                    return { error: 'Invalid search value supplied' };
                }
            } else if (typeof value === 'number') {
                if (!isNaN(value) && isFinite(value) && value > 0 && value % 1 === 0) {
                    return EmployeeDB.searchByEmployeeNumber(value);
                } else {
                    return { error: 'Invalid employee number supplied' };
                }
            } else if (typeof value === 'undefined' || value === null) {
                return { error: 'No search value supplied' };
            } else {
                return { error: 'Invalid search value supplied' };
            }
        }
        

_To concise, performant, readable, data validation:_

    
    
        function searchEmployees(value) {
            switch (xtype.which(value, 'str2+ str1 int+ obj1 obj2+ num nil')) {
                case 'str2+':
                    return EmployeeDB.searchByName(value);
                case 'str1':
                    return EmployeeDB.searchByMiddleInitial(value);
                case 'int+':
                    return EmployeeDB.searchByEmployeeNumber(value);
                case 'obj1':
                    return EmployeeDB.searchByFieldValuePair(value);
                case 'obj2+':
                    return { error: 'Search by multiple fields not supported' };
                case 'num':
                    return { error: 'Invalid employee number supplied' };
                case 'nil':
                    return { error: 'No search value supplied' };
                default:
                    return { error: 'Invalid search value supplied' };
            }
        }

~~~
keedot
Contrived and oddly specific for an example. Do we have any examples being
used out in the wild?

~~~
lucono
There is a non-open-source JavaScript decorator library using this. It has
many (real) examples, but the one that first comes to mind is its use of the
xtype.is API method ([http://xtype.js.org/api/is](http://xtype.js.org/api/is))
to perform runtime validations based on validation meta-data that's defined in
configuration.

For an idea of what that looks like, see:

[http://xtype.js.org/guide/checking_combinations_of_types](http://xtype.js.org/guide/checking_combinations_of_types)

~~~
keedot
Completely makes sense now, the example had me in the wrong headspace.

