UNPKG

nsure

Version:

nsure is a JS class that allows deep testing/sanitation, modification chains and model generation of objects.

428 lines (399 loc) 10 kB
vwc = { demos: { active: { rules: { attributesToCheck: { active: { enforcePresence: true, defaultTo: true, checks: [ 'type' ], type: { expected: 'boolean', onFail: 'defaultTo' } }, } }, data: { active: 1 } }, myDate: { rules: { "attributesToCheck": { "myDate": { "defaultTo": Date.now(), "enforcePresence": true, "checks": [ 'isDefined', 'isDate' ], "isDefined": { "fallback": Date.now(), "onFail": [ 'toFallback' ], }, "isDate": { "fallback": Date.now(), "onFail": [ 'toFallback' ], } }, } }, data: { myDate: "bad date" } }, objectContent: { rules: { "attributesToCheck": { "protocols": { "enforcePresence": true, "defaultTo": { "http": false, "https": false }, "checks": [ "isObject", "objectOf" ], "isObject": { "onFail": [ "toFallback" ], "fallback": { "http": "true" } }, "objectOf": { "allowedTypes": [ "boolean" ], "allowedValues": [ true, false ], "allowedKeys": [ "http", "https" ] } } }, onUnruledAttributes: [ 'deleteAttribute' ], onError: 'returnErrorMsg' }, data: { protocols: { "http": true, "https": true, "ftp": true, "somethingElse": "hello" } } }, email: { rules: { attributesToCheck: { email: { enforcePresence: true, defaultTo: 'defaultEmail@itsatony.com', checks: [ 'type', 'toLowerCase', 'stringMaxLength', 'replace_trim', 'email' ], type: { expected: 'string', onFail: [ 'returnError' ], error: { code: 'email.format', msg: '[email] needs to be valid, >6 chars and <80 chars.' } }, toLowerCase: {}, stringMaxLength: { max: 80, onFail: [ 'returnError' ], error: { code: 'email.format', msg: '[email] needs to be valid, >6 chars and <80 chars.' } }, replace_trim: { query: /^[\s]+|[\s]+$/g, replacement: '' }, email: { onFail: [ 'returnError' ], error: { code: 'email.format', msg: '[email] needs to be valid, >6 chars and <80 chars.' } } } } }, data: { email: 'BLA@blub.de' } }, gender: { rules: { 'attributesToCheck': { // short would be: 'gender': Nsure.helpers.inListNsure(['m', 'f']) 'gender': Nsure.helpers.inListNsure(['m', 'f']) } }, data: { gender: 'n' } }, protocols: { rules: { 'attributesToCheck': { // short would be: 'gender': Nsure.helpers.inListNsure(['m', 'f']) 'protocols': Nsure.helpers.arrayOfNsure(['string'], ['http', 'ftp', 'https' ], ['http']) } }, data: { protocols: 'http' } }, emailArray: { rules: { 'attributesToCheck': { 'emailList': { checks: [ 'type', 'arrayOf' ], defaultTo: function() { return []; }, type: { expected: 'array', onFail: 'defaultTo', error: { code: 'noArray', msg: 'emailList must be a array.' }, defaultTo: function() { return []; } }, arrayOf: { allowedTypes: [ 'string' ], onError: 'defaultTo', error: { code: 'noEmail', msg: 'emailList must be a array of email strings.' }, defaultTo: function() { return []; }, valueCheck: function(input, options, thisAttribute, fullInput, fullRules) { var emailRegEx = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/; if (emailRegEx.test(input) === true) { return input; } else { return void 0; } } } } } }, data: { 'emailList': [ 'bla', 'i@itsatony.com' ] } }, deepChecks: { rules: { "attributesToCheck": { "changed": { defaultTo: { timestamp: Date.now(), userId: '000000000000000000000001' }, checks: [ 'type', 'subNsure' ], type: { expected: 'object', onFail: [ 'returnError' ], error: { code: 'noObject', msg: 'changed must be a object.' } }, subNsure: { attributesToCheck: { 'timestamp': Nsure.helpers.numberNsure(1380000000000, 1500000000000, Date.now()), 'userId': { checks: [ 'type' ], type: { expected: 'string', onFail: [ 'returnError' ], error: { code: 'noString', msg: 'userId must be a string.' } } } }, onUnruledAttributes: [ 'deleteAttribute' ], onError: 'returnError' } } } }, data: { "changed": { timestamp: 0, userId: 0 } } } } }; jQuery(document).ready( function() { for (var name in vwc.demos) { var html = '<div class="examplelink"><a id="navi_' + name + '" data-ref="' + name + '" class="navigationanchor rightanchor" >' + name + '<div class="arrow-right"></div></a></div>' jQuery('#nsuresearch_wrapper').append(html); } jQuery('.examplelink').click( function(e) { var ref = jQuery(e.target).attr('data-ref'); selectDemo(ref); } ); rulesCodeMirror = new CodeMirror.fromTextArea( document.getElementById('nsure_codemirror_rules'), { mode: {"name": "javascript", "json": true}, tabSize: 2, lineNumbers: true } ); rulesCodeMirror.setSize('36em', '20em'); dataCodeMirror = CodeMirror.fromTextArea( document.getElementById('nsure_codemirror_data'), { mode: {"name": "javascript", "json": true}, tabSize: 2, lineNumbers: true } ); dataCodeMirror.setSize('36em', '20em'); modelCodeMirror = CodeMirror.fromTextArea( document.getElementById('nsure_codemirror_model'), { mode: {"name": "javascript", "json": true}, tabSize: 2, lineNumbers: true } ); modelCodeMirror.setSize('36em', '20em'); resultsCodeMirror = CodeMirror.fromTextArea( document.getElementById('nsure_codemirror_results'), { mode: {"name": "javascript", "json": true}, tabSize: 2, lineNumbers: true } ); resultsCodeMirror.setSize('36em', '20em'); rulesCodeMirror.doc.on( 'change', autoUpdate ); dataCodeMirror.doc.on( 'change', autoUpdate ); selectDemo('active'); autoUpdate(); } ); function autoUpdate() { clearTimeout(vwc.autoUpdateTimeout); return vwc.autoUpdateTimeout = setTimeout(runNsure, 600); }; function fillRules(ruleString) { rulesCodeMirror.doc.setValue(ruleString); return updateFormatting(rulesCodeMirror); }; function fillData(dataString) { dataCodeMirror.doc.setValue(dataString); return updateFormatting(dataCodeMirror); }; function selectDemo(name) { var ruleString = JSON.stringify(vwc.demos[name].rules); fillRules(ruleString); var dataString = JSON.stringify(vwc.demos[name].data); fillData(dataString); return vwc.demos[name]; }; function runNsure() { vwc.activeNsure = {}; var rulesString = rulesCodeMirror.doc.getValue(); try { var rules = eval(";(function() { var a = " + rulesString + '; return a;}());'); vwc.activeNsure.rules = rules; } catch(err) { return showStatus('error', 'rules', err); } var dataString = dataCodeMirror.doc.getValue(); try { var data = eval(";(function() { var a = " + dataString + '; return a;}());'); vwc.activeNsure.data = data; } catch(err) { return showStatus('error', 'data', err); } var thisNsure = new Nsure(rules); try { var result = thisNsure.check(data, [], true); vwc.activeNsure.result = result; console.log(data, result); } catch (err) { return showStatus('error', 'nsure', err); } try { var resultString = (typeof result === 'object') ? JSON.stringify(result) : result; } catch (err) { return showStatus('error', 'result', err); } try { var modelString = JSON.stringify(thisNsure.model); vwc.activeNsure.model = thisNsure.model; } catch (err) { return showStatus('error', 'model', err); } try { blink('#nsure_block_results'); blink('#nsure_block_model'); resultsCodeMirror.doc.setValue(resultString); if (typeof result === 'object') { updateFormatting(resultsCodeMirror); } modelCodeMirror.doc.setValue(modelString); updateFormatting(modelCodeMirror); } catch (err) { return showStatus('error', 'result', err); } return showStatus('success', 'nsure', { message: 'nsured!' }); }; function blink(selector) { jQuery(selector).addClass('blink_me'); return setTimeout(function() { jQuery(selector).removeClass('blink_me'); }, 500); }; function showStatus(mode, step, content) { // console.error(content); jQuery('#nsure_span_status').fadeOut('fast'); jQuery('#nsure_span_status').removeClass(); jQuery('#nsure_span_status').addClass('statusClass_' + mode); this.error = function(step, err) { resultsCodeMirror.doc.setValue(''); modelCodeMirror.doc.setValue(''); return jQuery('#nsure_span_status').html('[' + mode + '@' + step + '] > ' + content.message); }; this.success = function(step, content) { return jQuery('#nsure_span_status').html('[' + mode + '] > ' + content.message); }; jQuery('#nsure_span_status').fadeIn(); return this[mode](step, content); }; function updateFormatting(editor) { selectAll(editor); autoFormatSelection(editor); }; function selectAll(editor) { CodeMirror.commands["selectAll"](editor); }; function getSelectedRange(editor) { return { from: editor.getCursor(true), to: editor.getCursor(false) }; }; function autoFormatSelection(editor) { var range = getSelectedRange(editor); var formatted_json = jsl.format.formatJson(editor.doc.getValue()); editor.doc.setValue(formatted_json); };