Version 1
[yaffs-website] / node_modules / getobject / lib / getobject.js
diff --git a/node_modules/getobject/lib/getobject.js b/node_modules/getobject/lib/getobject.js
new file mode 100644 (file)
index 0000000..e4006fe
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * getobject
+ * https://github.com/cowboy/node-getobject
+ *
+ * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Licensed under the MIT license.
+ */
+
+'use strict';
+
+var getobject = module.exports = {};
+
+// Split strings on dot, but only if dot isn't preceded by a backslash. Since
+// JavaScript doesn't support lookbehinds, use a placeholder for "\.", split
+// on dot, then replace the placeholder character with a dot.
+function getParts(str) {
+  return str.replace(/\\\./g, '\uffff').split('.').map(function(s) {
+    return s.replace(/\uffff/g, '.');
+  });
+}
+
+// Get the value of a deeply-nested property exist in an object.
+getobject.get = function(obj, parts, create) {
+  if (typeof parts === 'string') {
+    parts = getParts(parts);
+  }
+
+  var part;
+  while (typeof obj === 'object' && obj && parts.length) {
+    part = parts.shift();
+    if (!(part in obj) && create) {
+      obj[part] = {};
+    }
+    obj = obj[part];
+  }
+
+  return obj;
+};
+
+// Set a deeply-nested property in an object, creating intermediary objects
+// as we go.
+getobject.set = function(obj, parts, value) {
+  parts = getParts(parts);
+
+  var prop = parts.pop();
+  obj = getobject.get(obj, parts, true);
+  if (obj && typeof obj === 'object') {
+    return (obj[prop] = value);
+  }
+};
+
+// Does a deeply-nested property exist in an object?
+getobject.exists = function(obj, parts) {
+  parts = getParts(parts);
+
+  var prop = parts.pop();
+  obj = getobject.get(obj, parts);
+
+  return typeof obj === 'object' && obj && prop in obj;
+};