| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 | 'use strict';module.exports = {  copy: copy,  checkDataType: checkDataType,  checkDataTypes: checkDataTypes,  coerceToTypes: coerceToTypes,  toHash: toHash,  getProperty: getProperty,  escapeQuotes: escapeQuotes,  equal: require('fast-deep-equal'),  ucs2length: require('./ucs2length'),  varOccurences: varOccurences,  varReplace: varReplace,  schemaHasRules: schemaHasRules,  schemaHasRulesExcept: schemaHasRulesExcept,  schemaUnknownRules: schemaUnknownRules,  toQuotedString: toQuotedString,  getPathExpr: getPathExpr,  getPath: getPath,  getData: getData,  unescapeFragment: unescapeFragment,  unescapeJsonPointer: unescapeJsonPointer,  escapeFragment: escapeFragment,  escapeJsonPointer: escapeJsonPointer};function copy(o, to) {  to = to || {};  for (var key in o) to[key] = o[key];  return to;}function checkDataType(dataType, data, strictNumbers, negate) {  var EQUAL = negate ? ' !== ' : ' === '    , AND = negate ? ' || ' : ' && '    , OK = negate ? '!' : ''    , NOT = negate ? '' : '!';  switch (dataType) {    case 'null': return data + EQUAL + 'null';    case 'array': return OK + 'Array.isArray(' + data + ')';    case 'object': return '(' + OK + data + AND +                          'typeof ' + data + EQUAL + '"object"' + AND +                          NOT + 'Array.isArray(' + data + '))';    case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND +                           NOT + '(' + data + ' % 1)' +                           AND + data + EQUAL + data +                           (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';    case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' +                          (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';    default: return 'typeof ' + data + EQUAL + '"' + dataType + '"';  }}function checkDataTypes(dataTypes, data, strictNumbers) {  switch (dataTypes.length) {    case 1: return checkDataType(dataTypes[0], data, strictNumbers, true);    default:      var code = '';      var types = toHash(dataTypes);      if (types.array && types.object) {        code = types.null ? '(': '(!' + data + ' || ';        code += 'typeof ' + data + ' !== "object")';        delete types.null;        delete types.array;        delete types.object;      }      if (types.number) delete types.integer;      for (var t in types)        code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true);      return code;  }}var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);function coerceToTypes(optionCoerceTypes, dataTypes) {  if (Array.isArray(dataTypes)) {    var types = [];    for (var i=0; i<dataTypes.length; i++) {      var t = dataTypes[i];      if (COERCE_TO_TYPES[t]) types[types.length] = t;      else if (optionCoerceTypes === 'array' && t === 'array') types[types.length] = t;    }    if (types.length) return types;  } else if (COERCE_TO_TYPES[dataTypes]) {    return [dataTypes];  } else if (optionCoerceTypes === 'array' && dataTypes === 'array') {    return ['array'];  }}function toHash(arr) {  var hash = {};  for (var i=0; i<arr.length; i++) hash[arr[i]] = true;  return hash;}var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;var SINGLE_QUOTE = /'|\\/g;function getProperty(key) {  return typeof key == 'number'          ? '[' + key + ']'          : IDENTIFIER.test(key)            ? '.' + key            : "['" + escapeQuotes(key) + "']";}function escapeQuotes(str) {  return str.replace(SINGLE_QUOTE, '\\$&')            .replace(/\n/g, '\\n')            .replace(/\r/g, '\\r')            .replace(/\f/g, '\\f')            .replace(/\t/g, '\\t');}function varOccurences(str, dataVar) {  dataVar += '[^0-9]';  var matches = str.match(new RegExp(dataVar, 'g'));  return matches ? matches.length : 0;}function varReplace(str, dataVar, expr) {  dataVar += '([^0-9])';  expr = expr.replace(/\$/g, '$$$$');  return str.replace(new RegExp(dataVar, 'g'), expr + '$1');}function schemaHasRules(schema, rules) {  if (typeof schema == 'boolean') return !schema;  for (var key in schema) if (rules[key]) return true;}function schemaHasRulesExcept(schema, rules, exceptKeyword) {  if (typeof schema == 'boolean') return !schema && exceptKeyword != 'not';  for (var key in schema) if (key != exceptKeyword && rules[key]) return true;}function schemaUnknownRules(schema, rules) {  if (typeof schema == 'boolean') return;  for (var key in schema) if (!rules[key]) return key;}function toQuotedString(str) {  return '\'' + escapeQuotes(str) + '\'';}function getPathExpr(currentPath, expr, jsonPointers, isNumber) {  var path = jsonPointers // false by default              ? '\'/\' + ' + expr + (isNumber ? '' : '.replace(/~/g, \'~0\').replace(/\\//g, \'~1\')')              : (isNumber ? '\'[\' + ' + expr + ' + \']\'' : '\'[\\\'\' + ' + expr + ' + \'\\\']\'');  return joinPaths(currentPath, path);}function getPath(currentPath, prop, jsonPointers) {  var path = jsonPointers // false by default              ? toQuotedString('/' + escapeJsonPointer(prop))              : toQuotedString(getProperty(prop));  return joinPaths(currentPath, path);}var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/;var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;function getData($data, lvl, paths) {  var up, jsonPointer, data, matches;  if ($data === '') return 'rootData';  if ($data[0] == '/') {    if (!JSON_POINTER.test($data)) throw new Error('Invalid JSON-pointer: ' + $data);    jsonPointer = $data;    data = 'rootData';  } else {    matches = $data.match(RELATIVE_JSON_POINTER);    if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);    up = +matches[1];    jsonPointer = matches[2];    if (jsonPointer == '#') {      if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);      return paths[lvl - up];    }    if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);    data = 'data' + ((lvl - up) || '');    if (!jsonPointer) return data;  }  var expr = data;  var segments = jsonPointer.split('/');  for (var i=0; i<segments.length; i++) {    var segment = segments[i];    if (segment) {      data += getProperty(unescapeJsonPointer(segment));      expr += ' && ' + data;    }  }  return expr;}function joinPaths (a, b) {  if (a == '""') return b;  return (a + ' + ' + b).replace(/([^\\])' \+ '/g, '$1');}function unescapeFragment(str) {  return unescapeJsonPointer(decodeURIComponent(str));}function escapeFragment(str) {  return encodeURIComponent(escapeJsonPointer(str));}function escapeJsonPointer(str) {  return str.replace(/~/g, '~0').replace(/\//g, '~1');}function unescapeJsonPointer(str) {  return str.replace(/~1/g, '/').replace(/~0/g, '~');}
 |