timbeadle/grunt-tv4

View on GitHub
Gruntfile.js

Summary

Maintainability
F
3 days
Test Coverage
/*
 * Grunt wrapper for tv4 - grunt-tv4
 * https://github.com/timbeadle/grunt-tv4
 *
 * Copyright (c) 2013 Bart van der Schoor
 * Licensed under the MIT license.
 */

/* eslint camelcase: 0 */

'use strict';

module.exports = function (grunt) {
    // Load all npm grunt tasks
    require('load-grunt-tasks')(grunt);

    grunt.loadTasks('tasks');

    // Used by format checker
    const dateRegex = /^\d{4}(?:-\d{1,2}){2}$/;
    const dateValidateCallback = (data) => {
        if (typeof data !== 'string' || !dateRegex.test(data)) {
            // Return error message
            return 'value must be string of the form: YYYY-MM-DD';
        }

        return null;
    };

    grunt.initConfig({
        eslint: {
            options: {
                configFile: '.eslintrc.yml',
            },
            src: [
                'Gruntfile.js',
                'lib/**/*.js',
                'tasks/**/*.js',
            ],
        },
        connect: {
            http: {
                options: {
                    port: 9090,
                    base: 'test/fixtures/',
                },
            },
            https: {
                options: {
                    port: 9091,
                    base: 'test/fixtures/',
                    protocol: 'https',
                },
            },
        },
        tv4: {
            pass_prop: {
                _twice: true,
                options: {
                    fresh: true,
                    root: 'test/fixtures/object_props/schema.json',
                },
                src: [
                    'test/fixtures/object_props/pass_a.json',
                ],
            },
            pass_many: {
                options: {
                    fresh: true,
                    root: 'test/fixtures/object_props/schema.json',
                },
                src: [
                    'test/fixtures/object_props/pass_a.json',
                    'test/fixtures/object_props/pass_b.json',
                    'test/fixtures/object_props/pass_c.json',
                ],
            },
            pass_remote: {
                _twice: true,
                options: {
                    fresh: true,
                    root: 'http://127.0.0.1:9090/remote/schema/schema.json',
                },
                src: [
                    'test/fixtures/remote/pass.json',
                    'test/fixtures/remote/pass.json',
                ],
            },
            pass_remote_https: {
                _twice: true,
                options: {
                    fresh: true,
                    root: 'https://127.0.0.1:9091/remote-https/schema/schema.json',
                },
                src: [
                    'test/fixtures/remote-https/pass.json',
                    'test/fixtures/remote-https/pass.json',
                ],
            },
            pass_remote_local: {
                _twice: true,
                options: {
                    fresh: true,
                    root: 'test/fixtures/remote/schema/schema.json',
                },
                src: [
                    'test/fixtures/remote/pass.json',
                    'test/fixtures/remote/pass.json',
                ],
            },
            fail_single: {
                options: {
                    fresh: true,
                    root: 'test/fixtures/object_props/schema.json',
                },
                src: [
                    'test/fixtures/object_props/pass_a.json',
                    'test/fixtures/object_props/fail_a.json',
                ],
            },
            fail_multi: {
                options: {
                    fresh: true,
                    multi: true,
                    root: 'test/fixtures/object_props/schema.json',
                },
                src: [
                    'test/fixtures/object_props/fail_a.json',
                ],
            },
            fail_many_multi: {
                options: {
                    fresh: true,
                    multi: true,
                    root: 'test/fixtures/object_props/schema.json',
                },
                src: [
                    'test/fixtures/object_props/fail_a.json',
                    'test/fixtures/object_props/fail_b.json',
                    'test/fixtures/object_props/fail_c.json',
                ],
            },
            fail_remote: {
                options: {
                    fresh: true,
                    root: 'http://127.0.0.1:9090/remote/schema/schema.json',
                },
                src: [
                    'test/fixtures/remote/fail.json',
                ],
            },
            fail_remote_https: {
                options: {
                    fresh: true,
                    root: 'https://127.0.0.1:9091/remote-https/schema/schema.json',
                },
                src: [
                    'test/fixtures/remote-https/fail.json',
                ],
            },
            fail_remoteNotFound: {
                options: {
                    fresh: true,
                    root: 'http://127.0.0.1:9090/remote/schema/non-existing.json',
                },
                src: [
                    'test/fixtures/remote/pass.json',
                ],
            },
            fail_remoteNotFound_https: {
                options: {
                    fresh: true,
                    root: 'https://127.0.0.1:9091/remote-https/schema/non-existing.json',
                },
                src: [
                    'test/fixtures/remote-https/pass.json',
                ],
            },
            pass_format: {
                options: {
                    fresh: true,
                    root: 'test/fixtures/format/schema.json',
                    formats: {
                        date: dateValidateCallback,
                    },
                },
                src: [
                    'test/fixtures/format/pass.json',
                ],
            },
            fail_format: {
                options: {
                    fresh: true,
                    root: 'test/fixtures/format/schema.json',
                    formats: {
                        date: dateValidateCallback,
                    },
                },
                src: [
                    'test/fixtures/format/fail.json',
                ],
            },
            pass_bulk: {
                options: {
                    fresh: true,
                    root: 'test/fixtures/bulk/schema/schema.json',
                    add: [
                        grunt.file.readJSON('test/fixtures/bulk/schema/alpha.json'),
                        grunt.file.readJSON('test/fixtures/bulk/schema/beta.json'),
                    ],
                },
                src: [
                    'test/fixtures/bulk/pass.json',
                    'test/fixtures/bulk/pass.json',
                ],
            },
            fail_bulk: {
                options: {
                    fresh: true,
                    root: 'test/fixtures/bulk/schema/schema.json',
                    add: [
                        grunt.file.readJSON('test/fixtures/bulk/schema/alpha.json'),
                        grunt.file.readJSON('test/fixtures/bulk/schema/beta.json'),
                    ],
                },
                src: [
                    'test/fixtures/bulk/fail.json',
                ],
            },
            pass_rootObject: {
                options: {
                    fresh: true,
                    root: grunt.file.readJSON('test/fixtures/bulk/schema/schema.json'),
                    add: [
                        grunt.file.readJSON('test/fixtures/bulk/schema/alpha.json'),
                        grunt.file.readJSON('test/fixtures/bulk/schema/beta.json'),
                    ],
                },
                src: [
                    'test/fixtures/bulk/pass.json',
                    'test/fixtures/bulk/pass.json',
                ],
            },
            pass_rootObject_cb: {
                options: {
                    fresh: true,
                    root: () => grunt.file.readJSON('test/fixtures/bulk/schema/schema.json'),
                    add: [
                        grunt.file.readJSON('test/fixtures/bulk/schema/alpha.json'),
                        grunt.file.readJSON('test/fixtures/bulk/schema/beta.json'),
                    ],
                },
                src: [
                    'test/fixtures/bulk/pass.json',
                    'test/fixtures/bulk/pass.json',
                ],
            },
            pass_rootObject_add_cb: {
                options: {
                    fresh: true,
                    root: grunt.file.readJSON('test/fixtures/bulk/schema/schema.json'),
                    add: () => [
                        grunt.file.readJSON('test/fixtures/bulk/schema/alpha.json'),
                        grunt.file.readJSON('test/fixtures/bulk/schema/beta.json'),
                    ],
                },
                src: [
                    'test/fixtures/bulk/pass.json',
                    'test/fixtures/bulk/pass.json',
                ],
            },
            fail_rootObject: {
                options: {
                    fresh: true,
                    root: grunt.file.readJSON('test/fixtures/bulk/schema/schema.json'),
                    add: [
                        grunt.file.readJSON('test/fixtures/bulk/schema/alpha.json'),
                        grunt.file.readJSON('test/fixtures/bulk/schema/beta.json'),
                    ],
                },
                src: [
                    'test/fixtures/bulk/fail.json',
                ],
            },
            pass_subError: {
                options: {
                    fresh: true,
                    root: grunt.file.readJSON('test/fixtures/subError/schema.json'),
                },
                src: [
                    'test/fixtures/subError/pass.json',
                ],
            },
            fail_subError: {
                options: {
                    fresh: true,
                    root: grunt.file.readJSON('test/fixtures/subError/schema.json'),
                },
                src: [
                    'test/fixtures/subError/fail.json',
                    'test/fixtures/subError/fail_deeper.json',
                ],
            },
            fail_subErrorMulti: {
                options: {
                    fresh: true,
                    multi: true,
                    root: grunt.file.readJSON('test/fixtures/subError/schema.json'),
                },
                src: [
                    'test/fixtures/subError/fail_deeper.json',
                ],
            },
            pass_values: {
                options: {
                    fresh: true,
                    multi: true,
                    root: {
                        type: 'string',
                    },
                },
                values: [
                    'valueAlpha',
                    'valueBravo',
                ],
            },
            fail_valuesArray: {
                options: {
                    fresh: true,
                    multi: true,
                    root: {
                        type: 'string',
                    },
                },
                values: [
                    false,
                    123,
                ],
            },
            fail_valuesObject: {
                options: {
                    fresh: true,
                    multi: true,
                    root: {
                        type: 'string',
                    },
                },
                values: {
                    myBooleanValue: false,
                    myNumberValue: 1,
                },
            },
            fail_valuesCallback: {
                options: {
                    fresh: true,
                    multi: true,
                    root: {
                        type: 'string',
                    },
                },
                values: () => ({
                    callbackBoolean: false,
                    callbackNumber: 1,
                }),
            },
            pass_package: {
                options: {
                    fresh: true,
                    multi: false,
                    root: require('package.json-schema').get(),
                },
                src: ['./package.json'],
            },
        },
    });

    // Used by format checker
    const passNames = [];
    const failNames = [];
    const conf = grunt.config.get('tv4');
    const confKeys = Object.keys(conf).sort();

    for (const name of confKeys) {
        if (name.startsWith('pass_')) {
            passNames.push('tv4:' + name);
            if (conf[name]._twice) {
                passNames.push('tv4:' + name);
            }
        } else if (name.startsWith('fail_')) {
            failNames.push('tv4:' + name);
            if (conf[name]._twice) {
                failNames.push('tv4:' + name);
            }
        } else {
            passNames.push('tv4:' + name);
        }
    }

    grunt.registerTask('pass', passNames);
    grunt.registerTask('fail', failNames);

    grunt.registerTask('test', ['connect', 'pass', 'continue:on', 'fail', 'continue:off']);

    grunt.registerTask('dev', ['connect', 'tv4:fail_many_multi']);
    grunt.registerTask('edit_01', ['tv4:fail_subErrorMulti']);
    grunt.registerTask('edit_02', ['tv4:pass_values', 'tv4:fail_valuesArray', 'tv4:fail_valuesObject', 'tv4:fail_valuesCallback']);
    grunt.registerTask('edit_03', ['tv4:fail_subError']);

    grunt.registerTask('run', ['fail']);
    grunt.registerTask('dev', ['tv4:pass_package']);
    grunt.registerTask('default', ['test']);
};