UNPKG

19 kBJavaScriptView Raw
1var _stock = {} // 核心存储容器
2var _stockData = {} //数据容器
3var uuid = -1;
4
5function getObjType(object){
6 return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
7}
8
9function uniqueId(prefix){
10 if (!prefix) prefix = 'random_'
11 uuid++
12 return prefix+uuid
13}
14
15function extend() {
16 var options, name, src, copy, copyIsArray, clone
17 , target = arguments[0] || {}
18 , i = 1
19 , length = arguments.length
20 , deep = false;
21 //如果第一个值为bool值,那么就将第二个参数作为目标参数,同时目标参数从2开始计数
22 if (typeof target === "boolean") {
23 deep = target;
24 target = arguments[1] || {};
25 // skip the boolean and the target
26 i = 2;
27 }
28 // 当目标参数不是object 或者不是函数的时候,设置成object类型的
29 // if (typeof target !== "object" && !jQuery.isFunction(target)) {
30 if (typeof target !== "object" && typeof target != 'function') {
31 target = {};
32 }
33 //如果extend只有一个函数的时候,那么将跳出后面的操作
34 if (length === i) {
35 // target = this;
36 if (Array.isArray(target)) target = []
37 if (getObjType(target) == 'Object') target = {}
38 --i;
39 }
40 for (; i < length; i++) {
41 // 仅处理不是 null/undefined values
42 if ((options = arguments[i]) != null) {
43 // 扩展options对象
44 for (name in options) {
45 src = target[name];
46 copy = options[name];
47 // 如果目标对象和要拷贝的对象是恒相等的话,那就执行下一个循环。
48 if (target === copy) {
49 continue;
50 }
51 // 如果我们拷贝的对象是一个对象或者数组的话
52 if (deep && copy && (getObjType(copy) === 'Object' || (copyIsArray = Array.isArray(copy)))) {
53 if (copyIsArray) {
54 copyIsArray = false;
55 clone = src && Array.isArray(src) ? src : [];
56 } else {
57 clone = src && getObjType(copy) === 'Object' ? src : {};
58 }
59 //不删除目标对象,将目标对象和原对象重新拷贝一份出来。
60 target[name] = extend(deep, clone, copy);
61 // 如果options[name]的不为空,那么将拷贝到目标对象上去。
62 } else if (copy !== undefined) {
63 target[name] = copy;
64 }
65 }
66 }
67 }
68 // 返回修改的目标对象
69 return target;
70};
71
72//统计store[name]是否首次执行
73var _count = {}
74var count = function(name) {
75 if (_count[name]) {
76 _count[name]++;
77 return true;
78 } else {
79 // 首次执行
80 _count[name] = 1;
81 return false;
82 }
83}
84
85var store = function( name, data, act ){
86 this.name = name || '';
87 this.sdata = data || {};
88 this.sact = act||{};
89 this.ctx = {"null":null};
90 var me = this;
91
92 this.dataer = function(data, key) {
93 var keyData;
94 if (key) keyData = _stockData[this.name+'.'+key]
95 if (!data) data = this.sdata
96 if (data || keyData) {
97 // this.sdata = data;
98 var _resault = [];
99 if (getObjType(this.sact) === 'Array') {
100 var acts = this.sact;
101 acts.map(function(fun) {
102 if (getObjType(fun.args) === 'Array') {
103 if (count(me.name)) {
104 fun.args.pop()
105 }
106 fun.args.push(data||{})
107 if (typeof fun === 'function') {
108 var _tmp = fun.apply(fun.args[0], [fun.args[0], data])
109 _resault.push(_tmp);
110 }
111 } else {
112 if (typeof fun === 'function') {
113 var _tmp = fun.call(me.ctx[me.name||'null'], data);
114 _resault.push(_tmp);
115 }
116 if (getObjType(fun)=='Object') {
117 Object.keys(fun).map(function(item){
118 if (typeof fun[item] == 'function'){
119 var _tmp = fun[item].call(me.ctx[me.name||'null'], data)
120 _resault.push(_tmp)
121 }
122 })
123 }
124 }
125 })
126 return _resault;
127 }
128 if (getObjType(this.sact) === 'Object') {
129 var sacts = this.sact
130 if (key) {
131 if (sacts[key]) {
132 var fun = sacts[key]
133 if (getObjType(fun.args) === 'Array') {
134 if (count(me.name)) {
135 fun.args.pop()
136 }
137 fun.args.push((keyData||data||{}))
138 if (typeof fun === 'function')
139 return fun.apply(fun.args[0], [fun.args[0], (keyData||data)])
140 } else {
141 if (typeof fun === 'function')
142 return fun.call(me.ctx[me.name||'null'], (keyData||data));
143 }
144 }
145 } else {
146 for (var item in sacts) {
147 var _keydata = _stockData[me.name+'.'+item]
148 if (typeof sacts[item] === 'function') {
149 var fun = sacts[item]
150 if (getObjType(fun.args) === 'Array') {
151 if (count(me.name)) {
152 fun.args.pop()
153 }
154 fun.args.push((data||_keydata||{}))
155 if (typeof fun === 'function'){
156 var _tmp = fun.apply(fun.args[0], [fun.args[0], (data||_keydata)])
157 _resault.push(_tmp)
158 }
159 } else {
160 if (typeof fun === 'function'){
161 var _tmp = fun.call(me.ctx[me.name||'null'], (data||_keydata));
162 _resault.push(_tmp)
163 }
164 }
165 }
166 }
167 return _resault
168 }
169 }
170 if (getObjType(this.sact) === 'Function') {
171 var fun = this.sact
172 if (Array.isArray(fun.args)) {
173 if (count(me.name)) { fun.args.pop() }
174 fun.args.push((data||_keydata||{}))
175 return typeof fun == 'function' ? fun.apply(fun.args[0], [fun.args[0], data]) : ''
176 } else {
177 return typeof fun == 'function' ? fun.call(me.ctx[me.name||'null'], (data||_keydata)) : ''
178 }
179 }
180 } else {
181 var _resault = [];
182 if (getObjType(this.sact) === 'Array') {
183 var acts = this.sact;
184 var _resault = [];
185 acts.map(function(fun) {
186 if (getObjType(fun.args) === 'Array') {
187 if (typeof fun === 'function') {
188 var _tmp = fun.apply(fun.args[0], fun.args);
189 _resault.push(_tmp);
190 }
191 } else {
192 if (typeof fun === 'function') {
193 var _tmp = fun.call(me.ctx[me.name||'null']);
194 _resault.push(_tmp);
195 }
196 if (getObjType(fun)=='Object') {
197 Object.keys(fun).map(function(item){
198 if (typeof fun[item] == 'function'){
199 var _tmp = fun[item].call(me.ctx[me.name||'null'])
200 _resault.push(_tmp)
201 }
202 })
203 }
204 }
205 })
206 return _resault;
207 }
208 if (getObjType(this.sact) === 'Object') {
209 var sacts = this.sact
210 if (key) {
211 if (sacts[key]) {
212 var fun = sacts[key]
213 if (getObjType(fun.args) === 'Array') {
214 if (typeof fun === 'function'){
215 return fun.apply(fun.args[0], fun.args)
216 }
217 } else {
218 if (typeof fun === 'function')
219 return fun.call(me.ctx[me.name||'null']);
220 }
221 }
222 } else {
223 for (var item in sacts) {
224 var _keydata = _stockData[me.name+'.'+item]
225 if (typeof sacts[item] === 'function') {
226 var fun = sacts[item]
227 if (getObjType(fun.args) === 'Array') {
228 if (typeof fun === 'function'){
229 var _tmp = fun.apply(fun.args[0], [fun.args[0], _keydata])
230 _resault.push(_tmp);
231 }
232 } else {
233 if (typeof fun === 'function'){
234 var _tmp = fun.call(me.ctx[me.name||'null'], _keydata);
235 _resault.push(_tmp);
236 }
237 }
238 }
239 }
240 return _resault
241 }
242 }
243 if (getObjType(this.sact) === 'Function') {
244 var fun = this.sact
245 if (Array.isArray(fun.args)) {
246 return typeof fun == 'function' ? fun.apply(fun.args[0], fun.args) : ''
247 } else {
248 return typeof fun == 'function' ? fun.call(me.ctx[me.name||'null']) : ''
249 }
250 }
251 }
252 }
253
254 this.acter = function( act ){
255 var s_type = getObjType(this.sact)
256 var a_type = getObjType(act)
257
258 switch (s_type) {
259 case 'Object':
260 if (typeof act == 'object') this.sact = extend({}, this.sact, act)
261 else {
262 var _uuid = uniqueId()
263 if (typeof act == 'function') this.sact[_uuid] = act
264 }
265 break;
266 case 'Array':
267 switch (a_type) {
268 case 'Array':
269 this.sact = this.sact.concat(act)
270 break;
271 case 'Object':
272 this.sact = extend({}, this.sact, act)
273 break;
274 case 'Function':
275 this.sact = this.sact.push(act)
276 break;
277 }
278 break;
279 case 'Function':
280 switch (a_type) {
281 case 'Array':
282 this.sact = act.unshift(this.sact)
283 break;
284 case 'Object':
285 var _uuid = uniqueId()
286 this.sact = act[_uuid] = this.sact
287 break;
288 case 'Function':
289 this.sact = [this.sact, act]
290 break;
291 }
292 break;
293 default:
294 if (typeof act == 'function') this.sact = act
295 }
296 }
297
298 this.setter = function( data, act ){
299 if( data ) this.sdata = data;
300 if( act ) this.sact = act;
301 };
302
303 this.getter = function( type ){
304 if( type === 'action' ) return this.sact;
305 if( type === 'data') return this.sdata;
306 };
307
308 this.binder = function(ctx) {
309 this.ctx[this.name] = ctx
310 }
311}
312
313//like flux
314var storeAct = {
315 append: function(name, dataOrAct, fun){
316 if (!name || name == '') return false;
317
318 var save = _stock;
319
320 if (!save[name]) {
321 this.set(name, dataOrAct, fun)
322 return
323 }
324
325 var target;
326 var s_type = getObjType(save[name].sdata)
327 var d_type = getObjType(dataOrAct)
328
329 switch (s_type) {
330 case 'Array':
331 if (d_type == 'Array') {
332 save[name].sdata = save[name].sdata.concat(dataOrAct)
333 } else {
334 save[name].sdata.push(dataOrAct)
335 }
336 break;
337 case 'Object':
338 switch (d_type) {
339 case 'Object':
340 // save[name].sdata = extend(true, {}, save[name].sdata, dataOrAct)
341 save[name].sdata = extend({}, save[name].sdata, dataOrAct)
342 break;
343 default:
344 var _uuid = uniqueId(name+'_')
345 save[name].sdata[_uuid] = dataOrAct
346 }
347 break;
348 default:
349 if (dataOrAct) save[name].sdata = [save[name].sdata, dataOrAct]
350 }
351 },
352
353 pop: function(name){
354 if (!name || name == '') return false;
355 var save = _stock;
356 if (save[name]) {
357 var tmp = save[name].getter('data')
358 if (getObjType(tmp) === 'Array') {
359 var popdata = tmp.pop();
360 save[name].setter(tmp)
361 return [tmp, popdata]
362 }
363 }
364 },
365
366 update: function(name, target){
367 if (!name || name == '') return false;
368 if (typeof target != 'object') return false;
369 var save = _stock;
370 if (!save[name]) return false
371 var odata = save[name].getter('data')
372 Object.keys(target).map(function(item, ii){
373 odata[item] = target[item]
374 })
375 },
376
377 set: function(name, dataOrAct, fun){
378 if (!name || name == '') return false;
379 if (!dataOrAct) dataOrAct = {}
380 var save = _stock;
381 if (!save[name]) {
382 var thisStore = new store(name);
383 save[name] = thisStore;
384 }
385 if (dataOrAct && dataOrAct !== "") {
386 if (getObjType(dataOrAct) === 'Function') {
387 if (getObjType(fun) === 'Array') {
388 dataOrAct.args = fun;
389 } else {
390 if (fun) dataOrAct.args = [fun]
391 }
392 save[name].acter(dataOrAct);
393 } else {
394 if (getObjType(dataOrAct) === 'Object' || // 存储 json对象
395 getObjType(dataOrAct) === 'String' || // 存储 string
396 getObjType(dataOrAct) === 'Boolean') { // 存储 boolean对象
397 save[name].setter(dataOrAct);
398 }
399 else if (getObjType(dataOrAct) === 'Array') {
400 var isFuns = true;
401 if (!dataOrAct.length) {
402 save[name].setter([]);
403 } else {
404 dataOrAct.map(function(item, i) {
405 if (getObjType(item) !== 'Function') isFuns = false;
406 })
407 if (isFuns) {
408 if (getObjType(fun) === 'Array') {
409 dataOrAct.map(function(item, i) {
410 if (getObjType(fun[i]) === 'Array'){
411 item.args = fun[i];
412 } else {
413 if (fun[i]) item.args = [fun[i]]
414 }
415 })
416 }
417 save[name].acter(dataOrAct);
418 // save[name].sact = dataOrAct;
419 } else {
420 save[name].setter(dataOrAct); //存储array数据
421 }
422 }
423 }
424 }
425 }
426
427 if (fun) {
428 if (getObjType(fun) === 'Function') save[name].acter(fun);
429
430 if (getObjType(fun) === 'Array') {
431 var isFuns = true;
432 fun.map(function(item, i) {
433 if (getObjType(item) !== 'Function') isFuns = false;
434 })
435 if (isFuns) {
436 save[name].acter(fun);
437 }
438 }
439
440 if (getObjType(fun) === 'Object') {
441 save[name].acter(fun)
442 }
443 }
444
445 return SAX(name)
446 },
447
448 get: function(name){
449 if(!name||name=='') return;
450 var save = _stock;
451 if(save[name]){
452 return save[name].getter( 'data' )
453 } else {
454 return false;
455 }
456 },
457
458 setter: function(name, dataOrAct, fun) {
459 if (dataOrAct) this.append(name, dataOrAct, fun)
460 return _stock[name].dataer(_stock[name].sdata)
461 },
462
463 getter: function(name){
464 if(!name||name=='') return;
465 var save = _stock;
466 if(save[name]){
467 var that = save[name]
468 function runner(data, key){
469 return that.dataer(data, key)
470 }
471 return {
472 run: runner,
473 data: save[name].getter( 'data' ),
474 action: save[name].getter( 'action' )
475 }
476 }
477 },
478
479 deleter: function( name ){
480 if(!name||name=='') return;
481 var save = _stock;
482 if(save[name]){
483 delete save[name];
484 }
485 },
486
487 runner: function( name, ddd, key, cb ){
488 if (!name || name == '') return false
489 var save = _stock
490 if (save[name]) {
491 var that = save[name]
492
493 function _runner(data, key) {
494 return that.dataer(data, key)
495 }
496
497 var _data = that.getter('data')
498
499 if (key && ddd) {
500 var keyofdata = name + '.' + key
501 _stockData[keyofdata] = typeof ddd == 'object' ? extend({}, ddd) : ddd
502 }
503 if (that.sact) return _runner((ddd||_data), key)
504 }
505 },
506
507 has: function(id, cb){
508 var keys = Object.keys(_stock)
509 if (keys.indexOf(id)>-1) {
510 var that = _stock[id]
511 if (typeof cb=='function') {
512 var _data = that.getter('data')
513 return cb(_data)
514 }
515 return true
516 }
517 },
518
519 lister: function(){
520 return Object.keys( _stock );
521 },
522
523 bind: function(name, ctx) {
524 if (!name || name == '') return;
525 var save = _stock;
526 if (!save[name]) save[name] = new store(name)
527 save[name].binder(ctx||null)
528 }
529}
530storeAct.trigger = storeAct.setter
531storeAct.roll = function(name, key, ddd){
532 if (typeof key == 'object') {
533 ddd = key
534 return storeAct.runner(name, ddd)
535 } else {
536 return storeAct.runner(name, ddd, key)
537 }
538}
539
540function sax(name, data, funs){
541 this.ctx
542 this.name = name
543 this.data = data
544 this.funs = funs
545 this.store = _stock[name]
546}
547sax.prototype = {
548 roll: function(key, data){
549 return storeAct.roll(this.name, key, data)
550 },
551 setActions: function(opts){
552 this.store.acter(opts)
553 },
554 set: function(data, fun){
555 storeAct.set(this.name, data, fun)
556 },
557 get: function(){
558 return this.store.sdata
559 },
560 append: function(data, fun){
561 storeAct.append(this.name, data, fun)
562 this.data = this.store.sdata
563 return this.data
564 },
565 update: function(data){
566 return storeAct.update(this.name, data)
567 },
568 bind: function(ctx){
569 storeAct.bind(this.name, ctx)
570 this.ctx = ctx
571 return this
572 },
573 has: function(id, cb){
574 return storeAct.has(id, cb)
575 },
576 pop: function(){
577 return storeAct.pop(this.name)
578 },
579 trigger: function(data){
580 return storeAct.trigger(this.name, data)
581 }
582}
583
584var saxInstance = {}
585function SAX(name, data, funs){
586 if (name) {
587 var save = _stock;
588 if (save[name]) {
589 return saxInstance[name]
590 } else {
591 storeAct.set(name, data, funs)
592 var instance = new sax(name, data, funs)
593 saxInstance[name] = instance
594 return instance
595 }
596 }
597}
598
599SAX.fn = {
600 extend: function(opts){
601 var _fn = sax.prototype
602 if (getObjType(opts) == 'Object') {
603 sax.prototype = extend(_fn, opts)
604 }
605 }
606}
607
608var _keys = Object.keys(storeAct)
609_keys.map(function(item, ii){
610 SAX[item] = storeAct[item]
611})
612
613module.exports = SAX