UNPKG

2.2 kBJavaScriptView Raw
1var Temple = require("./temple"),
2 _ = require("underscore"),
3 util = require("./util");
4
5var defaultHandler = {
6 match : function(target) { return false; },
7 construct : function(target) { },
8 isLeaf : function(target) { return true; },
9 get : function(target, path) { },
10 set : function(target, path, val) { return false; },
11 keys : function(target) { return []; },
12 deleteProperty : function(target, path) { return false; },
13 merge : function(target, mixin) { return false; },
14 destroy : function(target) { }
15};
16
17var objectHandler = _.defaults({
18 match: function(target) {
19 return util.isPlainObject(target);
20 },
21 isLeaf: function(target) {
22 return false;
23 },
24 get: function(target, path) {
25 return target[path];
26 },
27 set: function(target, path, val) {
28 target[path] = val;
29 return true;
30 },
31 keys: function(target) {
32 return Object.keys(target);
33 },
34 merge: function(target, mixin) {
35 if (!util.isPlainObject(mixin)) return false;
36 _.each(mixin, function(v, k) { this.set(k, v); }, this);
37 return true;
38 },
39 deleteProperty: function(target, path) {
40 delete target[path];
41 }
42}, defaultHandler);
43
44var arrayHandler = _.defaults({
45 match: function(val) {
46 return Array.isArray(val);
47 },
48
49 construct: function(arr) {
50 util.patchArray(arr);
51
52 arr.observe(this._arrayObserver = (function(index, nval, oval) {
53 var options = { remove: nval === void 0 },
54 path = index.toString();
55
56 this.set(path, nval, _.extend(options, { notify: false }));
57 this.notify(path, nval, oval, options);
58 }).bind(this));
59 },
60
61 set: function(arr, path, val) {
62 //console.log(arguments);
63 arr[path] = val;
64 return true;
65 },
66
67 deleteProperty: function(arr, path) {
68 var index = parseInt(path, 10);
69 delete arr[path];
70
71 // make the array smaller if we are deleting the last element
72 if (!isNaN(index) && index >= 0 && index === arr.length - 1) {
73 arr.length = arr.length - 1;
74 }
75
76 return true;
77 },
78
79 // arrays don't merge with any value
80 merge: function() { return false; },
81
82 destroy: function(arr) {
83 arr.stopObserving(this._arrayObserver);
84 }
85}, objectHandler);
86
87module.exports = [ arrayHandler, objectHandler ];
88module.exports.default = defaultHandler;
\No newline at end of file