|
2 | 2 | * json-mask | (c) 2015 Yuriy Nemtsov | https://github.com/nemtsov/json-mask/blob/master/LICENSE
|
3 | 3 | * @license
|
4 | 4 | */
|
| 5 | +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.jsonMask = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ |
| 6 | +var util = require('./util') |
| 7 | +var TERMINALS = { ',': 1, '/': 2, '(': 3, ')': 4 } |
| 8 | +var ESCAPE_CHAR = '\\' |
| 9 | +var WILDCARD_CHAR = '*' |
| 10 | + |
| 11 | +module.exports = compile |
| 12 | + |
5 | 13 | /**
|
6 |
| - * json-mask | (c) 2015 Yuriy Nemtsov | https://github.com/nemtsov/json-mask/blob/master/LICENSE |
7 |
| - * @license |
| 14 | + * Compiler |
| 15 | + * |
| 16 | + * Grammar: |
| 17 | + * Props ::= Prop | Prop "," Props |
| 18 | + * Prop ::= Object | Array |
| 19 | + * Object ::= NAME | NAME "/" Prop |
| 20 | + * Array ::= NAME "(" Props ")" |
| 21 | + * NAME ::= ? all visible characters except "\" ? | EscapeSeq | Wildcard |
| 22 | + * Wildcard ::= "*" |
| 23 | + * EscapeSeq ::= "\" ? all visible characters ? |
| 24 | + * |
| 25 | + * Examples: |
| 26 | + * a |
| 27 | + * a,d,g |
| 28 | + * a/b/c |
| 29 | + * a(b) |
| 30 | + * ob,a(k,z(f,g/d)),d |
| 31 | + * a\/b/c |
8 | 32 | */
|
| 33 | + |
| 34 | +function compile (text) { |
| 35 | + if (!text) return null |
| 36 | + return parse(scan(text)) |
| 37 | +} |
| 38 | + |
| 39 | +function scan (text) { |
| 40 | + var i = 0 |
| 41 | + var len = text.length |
| 42 | + var tokens = [] |
| 43 | + var name = '' |
| 44 | + var ch |
| 45 | + |
| 46 | + function maybePushName () { |
| 47 | + if (!name) return |
| 48 | + tokens.push({ tag: '_n', value: name }) |
| 49 | + name = '' |
| 50 | + } |
| 51 | + |
| 52 | + for (; i < len; i++) { |
| 53 | + ch = text.charAt(i) |
| 54 | + if (ch === ESCAPE_CHAR) { |
| 55 | + i++ |
| 56 | + ch = text.charAt(i) |
| 57 | + name += ch === WILDCARD_CHAR ? ESCAPE_CHAR + WILDCARD_CHAR : ch |
| 58 | + } else if (TERMINALS[ch]) { |
| 59 | + maybePushName() |
| 60 | + tokens.push({ tag: ch }) |
| 61 | + } else { |
| 62 | + name += ch |
| 63 | + } |
| 64 | + } |
| 65 | + maybePushName() |
| 66 | + |
| 67 | + return tokens |
| 68 | +} |
| 69 | + |
| 70 | +function parse (tokens) { |
| 71 | + return _buildTree(tokens, {}) |
| 72 | +} |
| 73 | + |
| 74 | +function _buildTree (tokens, parent) { |
| 75 | + var props = {} |
| 76 | + var token |
| 77 | + |
| 78 | + while ((token = tokens.shift())) { |
| 79 | + if (token.tag === '_n') { |
| 80 | + token.type = 'object' |
| 81 | + token.properties = _buildTree(tokens, token) |
| 82 | + if (parent.hasChild) { |
| 83 | + _addToken(token, props) |
| 84 | + return props |
| 85 | + } |
| 86 | + } else if (token.tag === ',') { |
| 87 | + return props |
| 88 | + } else if (token.tag === '(') { |
| 89 | + parent.type = 'array' |
| 90 | + continue |
| 91 | + } else if (token.tag === ')') { |
| 92 | + return props |
| 93 | + } else if (token.tag === '/') { |
| 94 | + parent.hasChild = true |
| 95 | + continue |
| 96 | + } |
| 97 | + _addToken(token, props) |
| 98 | + } |
| 99 | + |
| 100 | + return props |
| 101 | +} |
| 102 | + |
| 103 | +function _addToken (token, props) { |
| 104 | + var prop = { type: token.type } |
| 105 | + |
| 106 | + if (token.value === WILDCARD_CHAR) prop.isWildcard = true |
| 107 | + else if (token.value === ESCAPE_CHAR + WILDCARD_CHAR) token.value = WILDCARD_CHAR |
| 108 | + |
| 109 | + if (!util.isEmpty(token.properties)) { |
| 110 | + prop.properties = token.properties |
| 111 | + } |
| 112 | + |
| 113 | + props[token.value] = prop |
| 114 | +} |
| 115 | + |
| 116 | +},{"./util":4}],2:[function(require,module,exports){ |
| 117 | +var util = require('./util') |
| 118 | + |
| 119 | +module.exports = filter |
| 120 | + |
| 121 | +function filter (obj, compiledMask) { |
| 122 | + return util.isArray(obj) |
| 123 | + ? _arrayProperties(obj, compiledMask) |
| 124 | + : _properties(obj, compiledMask) |
| 125 | +} |
| 126 | + |
| 127 | +// wrap array & mask in a temp object; |
| 128 | +// extract results from temp at the end |
| 129 | +function _arrayProperties (arr, mask) { |
| 130 | + var obj = _properties({ _: arr }, { |
| 131 | + _: { |
| 132 | + type: 'array', |
| 133 | + properties: mask |
| 134 | + } |
| 135 | + }) |
| 136 | + return obj && obj._ |
| 137 | +} |
| 138 | + |
| 139 | +function _properties (obj, mask) { |
| 140 | + var maskedObj, key, value, ret, retKey, typeFunc |
| 141 | + if (!obj || !mask) return obj |
| 142 | + |
| 143 | + if (util.isArray(obj)) maskedObj = [] |
| 144 | + else if (util.isObject(obj)) maskedObj = {} |
| 145 | + |
| 146 | + for (key in mask) { |
| 147 | + if (!util.has(mask, key)) continue |
| 148 | + value = mask[key] |
| 149 | + ret = undefined |
| 150 | + typeFunc = (value.type === 'object') ? _object : _array |
| 151 | + if (value.isWildcard) { |
| 152 | + ret = _forAll(obj, value.properties, typeFunc) |
| 153 | + for (retKey in ret) { |
| 154 | + if (!util.has(ret, retKey)) continue |
| 155 | + maskedObj[retKey] = ret[retKey] |
| 156 | + } |
| 157 | + } else { |
| 158 | + ret = typeFunc(obj, key, value.properties) |
| 159 | + if (typeof ret !== 'undefined') maskedObj[key] = ret |
| 160 | + } |
| 161 | + } |
| 162 | + return maskedObj |
| 163 | +} |
| 164 | + |
| 165 | +function _forAll (obj, mask, fn) { |
| 166 | + var ret = {} |
| 167 | + var key |
| 168 | + var value |
| 169 | + for (key in obj) { |
| 170 | + if (!util.has(obj, key)) continue |
| 171 | + value = fn(obj, key, mask) |
| 172 | + if (typeof value !== 'undefined') ret[key] = value |
| 173 | + } |
| 174 | + return ret |
| 175 | +} |
| 176 | + |
| 177 | +function _object (obj, key, mask) { |
| 178 | + var value = obj[key] |
| 179 | + if (util.isArray(value)) return _array(obj, key, mask) |
| 180 | + return mask ? _properties(value, mask) : value |
| 181 | +} |
| 182 | + |
| 183 | +function _array (object, key, mask) { |
| 184 | + var ret = [] |
| 185 | + var arr = object[key] |
| 186 | + var obj |
| 187 | + var maskedObj |
| 188 | + var i |
| 189 | + var l |
| 190 | + if (!util.isArray(arr)) return _properties(arr, mask) |
| 191 | + if (util.isEmpty(arr)) return arr |
| 192 | + for (i = 0, l = arr.length; i < l; i++) { |
| 193 | + obj = arr[i] |
| 194 | + maskedObj = _properties(obj, mask) |
| 195 | + if (typeof maskedObj !== 'undefined') ret.push(maskedObj) |
| 196 | + } |
| 197 | + return ret.length ? ret : undefined |
| 198 | +} |
| 199 | + |
| 200 | +},{"./util":4}],3:[function(require,module,exports){ |
| 201 | +var compile = require('./compiler') |
| 202 | +var filter = require('./filter') |
| 203 | + |
| 204 | +function mask (obj, mask) { |
| 205 | + return filter(obj, compile(mask)) || null |
| 206 | +} |
| 207 | + |
| 208 | +mask.compile = compile |
| 209 | +mask.filter = filter |
| 210 | + |
| 211 | +module.exports = mask |
| 212 | + |
| 213 | +},{"./compiler":1,"./filter":2}],4:[function(require,module,exports){ |
| 214 | +var ObjProto = Object.prototype |
| 215 | + |
| 216 | +exports.isEmpty = isEmpty |
| 217 | +exports.isArray = Array.isArray || isArray |
| 218 | +exports.isObject = isObject |
| 219 | +exports.has = has |
| 220 | + |
| 221 | +function isEmpty (obj) { |
| 222 | + if (obj == null) return true |
| 223 | + if (isArray(obj) || |
| 224 | + (typeof obj === 'string')) return (obj.length === 0) |
| 225 | + for (var key in obj) if (has(obj, key)) return false |
| 226 | + return true |
| 227 | +} |
| 228 | + |
| 229 | +function isArray (obj) { |
| 230 | + return ObjProto.toString.call(obj) === '[object Array]' |
| 231 | +} |
| 232 | + |
| 233 | +function isObject (obj) { |
| 234 | + return (typeof obj === 'function') || (typeof obj === 'object' && !!obj) |
| 235 | +} |
| 236 | + |
| 237 | +function has (obj, key) { |
| 238 | + return ObjProto.hasOwnProperty.call(obj, key) |
| 239 | +} |
| 240 | + |
| 241 | +},{}]},{},[3])(3) |
| 242 | +}); |
0 commit comments