diff --git a/assets/style.sass b/assets/style.sass index 9efe285..d9ec750 100644 --- a/assets/style.sass +++ b/assets/style.sass @@ -100,8 +100,10 @@ section .skill-level th font-weight: $semibold-weight - padding-right: 2 * $grid-height + padding-right: $grid-height text-align: left + width: 6.4pc; + vertical-align: top; .block page-break-inside: avoid diff --git a/data/schema-ext.json b/data/schema-ext.json new file mode 100644 index 0000000..55dbcc4 --- /dev/null +++ b/data/schema-ext.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Resume Schema Extension for Test Double", + "type": "object", + "properties": { + "skills": { + "type": "array", + "items": { + "type": "object", + "properties": { + "level": { + "type": "string", + "enum": ["Teaching others", "Pairing on", "Excited about"] + } + } + } + } + } +} diff --git a/lib/cobbler.js b/lib/cobbler.js index 262e845..37b3381 100644 --- a/lib/cobbler.js +++ b/lib/cobbler.js @@ -1,6 +1,6 @@ var debug = require('debug') var fs = require('fs') -var CSON = require('cson') +var CSON = require('cson-parser') var hummus = require('hummus') var jade = require('pug') var marked = require('marked') @@ -9,8 +9,9 @@ var nightmare = require('nightmare') var path = require('path') var traverse = require('traverse') var url = require('url') -var validator = require('z-schema') +var validateAgainstSchema = require('./validate-against-schema') var RESUME_SCHEMA = require('resume-schema/schema.json') +var RESUME_SCHEMA_EXT = require('../data/schema-ext.json') module.exports = { // @@ -35,8 +36,10 @@ module.exports = { } }) .then(data => { - return validator.validate(data, RESUME_SCHEMA) - .then(_ => data) + return validateAgainstSchema(RESUME_SCHEMA, data) + }) + .then(data => { + return validateAgainstSchema(RESUME_SCHEMA_EXT, data) }) .then(data => { debug('cobbler:load')('Data: %j', data) @@ -46,7 +49,7 @@ module.exports = { if (err.errors) { throw new Error([err.message].concat( err.errors.map(validationError => { - return validationError.path + ': ' + validationError.message + return validationError.dataPath + ': ' + validationError.message }) ).join('\n')) } diff --git a/lib/validate-against-schema.js b/lib/validate-against-schema.js new file mode 100644 index 0000000..36e7712 --- /dev/null +++ b/lib/validate-against-schema.js @@ -0,0 +1,24 @@ +var Ajv = require('ajv') + +// See https://github.com/epoberezkin/ajv#using-version-6 for an explanation +// of these settings, which are required because JSONResume uses draft-04. +var ajv = new Ajv({ + allErrors: true, + schemaId: 'id' +}) +ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-04.json')) + +function validateAgainstSchema(schema, data) { + return Promise.resolve(ajv.validate(schema, data)) + .then(function (valid) { + if (!valid) { + var error = new Error('Validation failed') + error.errors = ajv.errors + throw error + } + + return data + }) +} + +module.exports = validateAgainstSchema diff --git a/package.json b/package.json index fd06a63..9001d60 100644 --- a/package.json +++ b/package.json @@ -13,14 +13,15 @@ "author": "Michael Schoonmaker (https://www.schoonology.com/)", "license": "MIT", "dependencies": { - "cson": "^4.0.0", - "debug": "~2.3.3", + "ajv": "~6.2.1", + "cson-parser": "~3.0.0", + "debug": "~3.1.0", "hummus": "~1.0.65", - "jstransformer-sass": "~0.1.0", + "jstransformer-sass": "~1.0.0", "marked": "~0.3.6", "minimist": "~1.2.0", - "moment": "~2.17.0", - "nightmare": "~2.8.1", + "moment": "~2.21.0", + "nightmare": "~3.0.0", "pug": "~2.0.0-beta6", "resume-schema": "0.0.16", "temp": "~0.8.3",