Newer
Older
vmk-demo-bot / frontend / node_modules / flatnest / nest.js
'use strict'

module.exports = nest

var seek = require("./seek")

var circular = /\[Circular \((.+)\)\]/
var nestedRe = /(\.|\[)/
var scrub = /]/g

function nest(obj) {
  var key,
      i,
      nested = {}

  var keys = Object.keys(obj)
  var len = keys.length
  for (i = 0; i < len; i++) {
    key = keys[i]

    if (typeof obj[key] == "string" && circular.test(obj[key])) {
      var ref = circular.exec(obj[key])[1]
      if (ref == "this")
        obj[key] = nested
      else
        obj[key] = seek(nested, ref)
    }
    insert(nested, key, obj[key])
  }

  return nested
}

function insert(target, path, value) {
  path = path.replace(scrub, "")

  var pathBits = path.split(nestedRe)
  var parent = target
  var len = pathBits.length
  for (var i = 0; i < len; i += 2) {
    var key = pathBits[i]
    if (key === "__proto__") continue
    if (key === "constructor" && typeof target[key] == "function") continue
    var type = pathBits[i + 1]

    if (type == null && key) parent[key] = value
    if (type == "." && parent[key] == null) parent[key] = {}
    if (type == "[" && parent[key] == null) parent[key] = []

    parent = parent[key]
  }
}