ende 0.4.24 → 0.4.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,718 @@
1
+ !function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.stampit=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
2
+ var forIn = _dereq_('mout/object/forIn');
3
+
4
+ function copyProp(val, key){
5
+ this[key] = val;
6
+ }
7
+
8
+ module.exports = function mixInChain(target, objects){
9
+ var i = 0,
10
+ n = arguments.length,
11
+ obj;
12
+ while(++i < n){
13
+ obj = arguments[i];
14
+ if (obj != null) {
15
+ forIn(obj, copyProp, target);
16
+ }
17
+ }
18
+ return target;
19
+ };
20
+
21
+ },{"mout/object/forIn":14}],2:[function(_dereq_,module,exports){
22
+
23
+
24
+ /**
25
+ * Array forEach
26
+ */
27
+ function forEach(arr, callback, thisObj) {
28
+ if (arr == null) {
29
+ return;
30
+ }
31
+ var i = -1,
32
+ len = arr.length;
33
+ while (++i < len) {
34
+ // we iterate over sparse items since there is no way to make it
35
+ // work properly on IE 7-8. see #64
36
+ if ( callback.call(thisObj, arr[i], i, arr) === false ) {
37
+ break;
38
+ }
39
+ }
40
+ }
41
+
42
+ module.exports = forEach;
43
+
44
+
45
+
46
+ },{}],3:[function(_dereq_,module,exports){
47
+ var forEach = _dereq_('./forEach');
48
+ var makeIterator = _dereq_('../function/makeIterator_');
49
+
50
+ /**
51
+ * Array map
52
+ */
53
+ function map(arr, callback, thisObj) {
54
+ callback = makeIterator(callback, thisObj);
55
+ var results = [];
56
+ if (arr == null){
57
+ return results;
58
+ }
59
+
60
+ var i = -1, len = arr.length;
61
+ while (++i < len) {
62
+ results[i] = callback(arr[i], i, arr);
63
+ }
64
+
65
+ return results;
66
+ }
67
+
68
+ module.exports = map;
69
+
70
+
71
+ },{"../function/makeIterator_":4,"./forEach":2}],4:[function(_dereq_,module,exports){
72
+ var prop = _dereq_('./prop');
73
+ var deepMatches = _dereq_('../object/deepMatches');
74
+
75
+ /**
76
+ * Converts argument into a valid iterator.
77
+ * Used internally on most array/object/collection methods that receives a
78
+ * callback/iterator providing a shortcut syntax.
79
+ */
80
+ function makeIterator(src, thisObj){
81
+ switch(typeof src) {
82
+ case 'object':
83
+ // typeof null == "object"
84
+ return (src != null)? function(val, key, target){
85
+ return deepMatches(val, src);
86
+ } : src;
87
+ case 'string':
88
+ case 'number':
89
+ return prop(src);
90
+ case 'function':
91
+ if (typeof thisObj === 'undefined') {
92
+ return src;
93
+ } else {
94
+ return function(val, i, arr){
95
+ return src.call(thisObj, val, i, arr);
96
+ };
97
+ }
98
+ default:
99
+ return src;
100
+ }
101
+ }
102
+
103
+ module.exports = makeIterator;
104
+
105
+
106
+
107
+ },{"../object/deepMatches":13,"./prop":5}],5:[function(_dereq_,module,exports){
108
+
109
+
110
+ /**
111
+ * Returns a function that gets a property of the passed object
112
+ */
113
+ function prop(name){
114
+ return function(obj){
115
+ return obj[name];
116
+ };
117
+ }
118
+
119
+ module.exports = prop;
120
+
121
+
122
+
123
+ },{}],6:[function(_dereq_,module,exports){
124
+ var kindOf = _dereq_('./kindOf');
125
+ var isPlainObject = _dereq_('./isPlainObject');
126
+ var mixIn = _dereq_('../object/mixIn');
127
+
128
+ /**
129
+ * Clone native types.
130
+ */
131
+ function clone(val){
132
+ switch (kindOf(val)) {
133
+ case 'Object':
134
+ return cloneObject(val);
135
+ case 'Array':
136
+ return cloneArray(val);
137
+ case 'RegExp':
138
+ return cloneRegExp(val);
139
+ case 'Date':
140
+ return cloneDate(val);
141
+ default:
142
+ return val;
143
+ }
144
+ }
145
+
146
+ function cloneObject(source) {
147
+ if (isPlainObject(source)) {
148
+ return mixIn({}, source);
149
+ } else {
150
+ return source;
151
+ }
152
+ }
153
+
154
+ function cloneRegExp(r) {
155
+ var flags = '';
156
+ flags += r.multiline ? 'm' : '';
157
+ flags += r.global ? 'g' : '';
158
+ flags += r.ignorecase ? 'i' : '';
159
+ return new RegExp(r.source, flags);
160
+ }
161
+
162
+ function cloneDate(date) {
163
+ return new Date(+date);
164
+ }
165
+
166
+ function cloneArray(arr) {
167
+ return arr.slice();
168
+ }
169
+
170
+ module.exports = clone;
171
+
172
+
173
+
174
+ },{"../object/mixIn":18,"./isPlainObject":11,"./kindOf":12}],7:[function(_dereq_,module,exports){
175
+ var clone = _dereq_('./clone');
176
+ var forOwn = _dereq_('../object/forOwn');
177
+ var kindOf = _dereq_('./kindOf');
178
+ var isPlainObject = _dereq_('./isPlainObject');
179
+
180
+ /**
181
+ * Recursively clone native types.
182
+ */
183
+ function deepClone(val, instanceClone) {
184
+ switch ( kindOf(val) ) {
185
+ case 'Object':
186
+ return cloneObject(val, instanceClone);
187
+ case 'Array':
188
+ return cloneArray(val, instanceClone);
189
+ default:
190
+ return clone(val);
191
+ }
192
+ }
193
+
194
+ function cloneObject(source, instanceClone) {
195
+ if (isPlainObject(source)) {
196
+ var out = {};
197
+ forOwn(source, function(val, key) {
198
+ this[key] = deepClone(val, instanceClone);
199
+ }, out);
200
+ return out;
201
+ } else if (instanceClone) {
202
+ return instanceClone(source);
203
+ } else {
204
+ return source;
205
+ }
206
+ }
207
+
208
+ function cloneArray(arr, instanceClone) {
209
+ var out = [],
210
+ i = -1,
211
+ n = arr.length,
212
+ val;
213
+ while (++i < n) {
214
+ out[i] = deepClone(arr[i], instanceClone);
215
+ }
216
+ return out;
217
+ }
218
+
219
+ module.exports = deepClone;
220
+
221
+
222
+
223
+
224
+ },{"../object/forOwn":15,"./clone":6,"./isPlainObject":11,"./kindOf":12}],8:[function(_dereq_,module,exports){
225
+ var isKind = _dereq_('./isKind');
226
+ /**
227
+ */
228
+ var isArray = Array.isArray || function (val) {
229
+ return isKind(val, 'Array');
230
+ };
231
+ module.exports = isArray;
232
+
233
+
234
+ },{"./isKind":9}],9:[function(_dereq_,module,exports){
235
+ var kindOf = _dereq_('./kindOf');
236
+ /**
237
+ * Check if value is from a specific "kind".
238
+ */
239
+ function isKind(val, kind){
240
+ return kindOf(val) === kind;
241
+ }
242
+ module.exports = isKind;
243
+
244
+
245
+ },{"./kindOf":12}],10:[function(_dereq_,module,exports){
246
+ var isKind = _dereq_('./isKind');
247
+ /**
248
+ */
249
+ function isObject(val) {
250
+ return isKind(val, 'Object');
251
+ }
252
+ module.exports = isObject;
253
+
254
+
255
+ },{"./isKind":9}],11:[function(_dereq_,module,exports){
256
+
257
+
258
+ /**
259
+ * Checks if the value is created by the `Object` constructor.
260
+ */
261
+ function isPlainObject(value) {
262
+ return (!!value
263
+ && typeof value === 'object'
264
+ && value.constructor === Object);
265
+ }
266
+
267
+ module.exports = isPlainObject;
268
+
269
+
270
+
271
+ },{}],12:[function(_dereq_,module,exports){
272
+
273
+
274
+ var _rKind = /^\[object (.*)\]$/,
275
+ _toString = Object.prototype.toString,
276
+ UNDEF;
277
+
278
+ /**
279
+ * Gets the "kind" of value. (e.g. "String", "Number", etc)
280
+ */
281
+ function kindOf(val) {
282
+ if (val === null) {
283
+ return 'Null';
284
+ } else if (val === UNDEF) {
285
+ return 'Undefined';
286
+ } else {
287
+ return _rKind.exec( _toString.call(val) )[1];
288
+ }
289
+ }
290
+ module.exports = kindOf;
291
+
292
+
293
+ },{}],13:[function(_dereq_,module,exports){
294
+ var forOwn = _dereq_('./forOwn');
295
+ var isArray = _dereq_('../lang/isArray');
296
+
297
+ function containsMatch(array, pattern) {
298
+ var i = -1, length = array.length;
299
+ while (++i < length) {
300
+ if (deepMatches(array[i], pattern)) {
301
+ return true;
302
+ }
303
+ }
304
+
305
+ return false;
306
+ }
307
+
308
+ function matchArray(target, pattern) {
309
+ var i = -1, patternLength = pattern.length;
310
+ while (++i < patternLength) {
311
+ if (!containsMatch(target, pattern[i])) {
312
+ return false;
313
+ }
314
+ }
315
+
316
+ return true;
317
+ }
318
+
319
+ function matchObject(target, pattern) {
320
+ var result = true;
321
+ forOwn(pattern, function(val, key) {
322
+ if (!deepMatches(target[key], val)) {
323
+ // Return false to break out of forOwn early
324
+ return (result = false);
325
+ }
326
+ });
327
+
328
+ return result;
329
+ }
330
+
331
+ /**
332
+ * Recursively check if the objects match.
333
+ */
334
+ function deepMatches(target, pattern){
335
+ if (target && typeof target === 'object') {
336
+ if (isArray(target) && isArray(pattern)) {
337
+ return matchArray(target, pattern);
338
+ } else {
339
+ return matchObject(target, pattern);
340
+ }
341
+ } else {
342
+ return target === pattern;
343
+ }
344
+ }
345
+
346
+ module.exports = deepMatches;
347
+
348
+
349
+
350
+ },{"../lang/isArray":8,"./forOwn":15}],14:[function(_dereq_,module,exports){
351
+
352
+
353
+ var _hasDontEnumBug,
354
+ _dontEnums;
355
+
356
+ function checkDontEnum(){
357
+ _dontEnums = [
358
+ 'toString',
359
+ 'toLocaleString',
360
+ 'valueOf',
361
+ 'hasOwnProperty',
362
+ 'isPrototypeOf',
363
+ 'propertyIsEnumerable',
364
+ 'constructor'
365
+ ];
366
+
367
+ _hasDontEnumBug = true;
368
+
369
+ for (var key in {'toString': null}) {
370
+ _hasDontEnumBug = false;
371
+ }
372
+ }
373
+
374
+ /**
375
+ * Similar to Array/forEach but works over object properties and fixes Don't
376
+ * Enum bug on IE.
377
+ * based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
378
+ */
379
+ function forIn(obj, fn, thisObj){
380
+ var key, i = 0;
381
+ // no need to check if argument is a real object that way we can use
382
+ // it for arrays, functions, date, etc.
383
+
384
+ //post-pone check till needed
385
+ if (_hasDontEnumBug == null) checkDontEnum();
386
+
387
+ for (key in obj) {
388
+ if (exec(fn, obj, key, thisObj) === false) {
389
+ break;
390
+ }
391
+ }
392
+
393
+ if (_hasDontEnumBug) {
394
+ while (key = _dontEnums[i++]) {
395
+ // since we aren't using hasOwn check we need to make sure the
396
+ // property was overwritten
397
+ if (obj[key] !== Object.prototype[key]) {
398
+ if (exec(fn, obj, key, thisObj) === false) {
399
+ break;
400
+ }
401
+ }
402
+ }
403
+ }
404
+ }
405
+
406
+ function exec(fn, obj, key, thisObj){
407
+ return fn.call(thisObj, obj[key], key, obj);
408
+ }
409
+
410
+ module.exports = forIn;
411
+
412
+
413
+
414
+ },{}],15:[function(_dereq_,module,exports){
415
+ var hasOwn = _dereq_('./hasOwn');
416
+ var forIn = _dereq_('./forIn');
417
+
418
+ /**
419
+ * Similar to Array/forEach but works over object properties and fixes Don't
420
+ * Enum bug on IE.
421
+ * based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
422
+ */
423
+ function forOwn(obj, fn, thisObj){
424
+ forIn(obj, function(val, key){
425
+ if (hasOwn(obj, key)) {
426
+ return fn.call(thisObj, obj[key], key, obj);
427
+ }
428
+ });
429
+ }
430
+
431
+ module.exports = forOwn;
432
+
433
+
434
+
435
+ },{"./forIn":14,"./hasOwn":16}],16:[function(_dereq_,module,exports){
436
+
437
+
438
+ /**
439
+ * Safer Object.hasOwnProperty
440
+ */
441
+ function hasOwn(obj, prop){
442
+ return Object.prototype.hasOwnProperty.call(obj, prop);
443
+ }
444
+
445
+ module.exports = hasOwn;
446
+
447
+
448
+
449
+ },{}],17:[function(_dereq_,module,exports){
450
+ var hasOwn = _dereq_('./hasOwn');
451
+ var deepClone = _dereq_('../lang/deepClone');
452
+ var isObject = _dereq_('../lang/isObject');
453
+
454
+ /**
455
+ * Deep merge objects.
456
+ */
457
+ function merge() {
458
+ var i = 1,
459
+ key, val, obj, target;
460
+
461
+ // make sure we don't modify source element and it's properties
462
+ // objects are passed by reference
463
+ target = deepClone( arguments[0] );
464
+
465
+ while (obj = arguments[i++]) {
466
+ for (key in obj) {
467
+ if ( ! hasOwn(obj, key) ) {
468
+ continue;
469
+ }
470
+
471
+ val = obj[key];
472
+
473
+ if ( isObject(val) && isObject(target[key]) ){
474
+ // inception, deep merge objects
475
+ target[key] = merge(target[key], val);
476
+ } else {
477
+ // make sure arrays, regexp, date, objects are cloned
478
+ target[key] = deepClone(val);
479
+ }
480
+
481
+ }
482
+ }
483
+
484
+ return target;
485
+ }
486
+
487
+ module.exports = merge;
488
+
489
+
490
+
491
+ },{"../lang/deepClone":7,"../lang/isObject":10,"./hasOwn":16}],18:[function(_dereq_,module,exports){
492
+ var forOwn = _dereq_('./forOwn');
493
+
494
+ /**
495
+ * Combine properties from all the objects into first one.
496
+ * - This method affects target object in place, if you want to create a new Object pass an empty object as first param.
497
+ * @param {object} target Target Object
498
+ * @param {...object} objects Objects to be combined (0...n objects).
499
+ * @return {object} Target Object.
500
+ */
501
+ function mixIn(target, objects){
502
+ var i = 0,
503
+ n = arguments.length,
504
+ obj;
505
+ while(++i < n){
506
+ obj = arguments[i];
507
+ if (obj != null) {
508
+ forOwn(obj, copyProp, target);
509
+ }
510
+ }
511
+ return target;
512
+ }
513
+
514
+ function copyProp(val, key){
515
+ this[key] = val;
516
+ }
517
+
518
+ module.exports = mixIn;
519
+
520
+
521
+ },{"./forOwn":15}],19:[function(_dereq_,module,exports){
522
+ /**
523
+ * Stampit
524
+ **
525
+ * Create objects from reusable, composable behaviors.
526
+ **
527
+ * Copyright (c) 2013 Eric Elliott
528
+ * http://opensource.org/licenses/MIT
529
+ **/
530
+ 'use strict';
531
+ var forEach = _dereq_('mout/array/forEach');
532
+ var mixIn = _dereq_('mout/object/mixIn');
533
+ var merge = _dereq_('mout/object/merge');
534
+ var map = _dereq_('mout/array/map');
535
+ var forOwn = _dereq_('mout/object/forOwn');
536
+ var mixInChain = _dereq_('./mixinchain.js');
537
+ var slice = [].slice;
538
+
539
+ var create = function (o) {
540
+ if (arguments.length > 1) {
541
+ throw new Error('Object.create implementation only accepts the first parameter.');
542
+ }
543
+ function F() {}
544
+ F.prototype = o;
545
+ return new F();
546
+ };
547
+
548
+ if(!Array.isArray) {
549
+ Array.isArray = function (vArg) {
550
+ return Object.prototype.toString.call(vArg) === "[object Array]";
551
+ };
552
+ }
553
+
554
+ var extractFunctions = function extractFunctions(arg) {
555
+ var arr = [],
556
+ args = [].slice.call(arguments);
557
+
558
+ if (typeof arg === 'function') {
559
+ arr = map(args, function (fn) {
560
+ if (typeof fn === 'function') {
561
+ return fn;
562
+ }
563
+ });
564
+ } else if (typeof arg === 'object') {
565
+ forEach(args, function (obj) {
566
+ forOwn(obj, function (fn) {
567
+ arr.push(fn);
568
+ });
569
+ });
570
+ } else if ( Array.isArray(arg) ) {
571
+ forEach(arg, function (fn) {
572
+ arr.push(fn);
573
+ });
574
+ }
575
+ return arr;
576
+ };
577
+
578
+ /**
579
+ * Return a factory function that will produce new objects using the
580
+ * prototypes that are passed in or composed.
581
+ *
582
+ * @param {Object} [methods] A map of method names and bodies for delegation.
583
+ * @param {Object} [state] A map of property names and values to clone for each new object.
584
+ * @param {Function} [enclose] A closure (function) used to create private data and privileged methods.
585
+ * @return {Function} factory A factory to produce objects using the given prototypes.
586
+ * @return {Function} factory.create Just like calling the factory function.
587
+ * @return {Object} factory.fixed An object map containing the fixed prototypes.
588
+ * @return {Function} factory.methods Add methods to the methods prototype. Chainable.
589
+ * @return {Function} factory.state Add properties to the state prototype. Chainable.
590
+ * @return {Function} factory.enclose Add or replace the closure prototype. Not chainable.
591
+ */
592
+ var stampit = function stampit(methods, state, enclose) {
593
+ var fixed = {
594
+ methods: methods || {},
595
+ state: state,
596
+ enclose: extractFunctions(enclose)
597
+ },
598
+
599
+ factory = function factory(properties) {
600
+ var state = merge({}, fixed.state),
601
+ instance = mixIn(create(fixed.methods || {}),
602
+ state, properties),
603
+ closures = fixed.enclose,
604
+ args = slice.call(arguments, 1);
605
+
606
+ forEach(closures, function (fn) {
607
+ if (typeof fn === 'function') {
608
+ instance = fn.apply(instance, args) || instance;
609
+ }
610
+ });
611
+
612
+ return instance;
613
+ };
614
+
615
+ return mixIn(factory, {
616
+ create: factory,
617
+ fixed: fixed,
618
+ /**
619
+ * Take n objects and add them to the methods prototype.
620
+ * @return {Object} stamp The factory in question (`this`).
621
+ */
622
+ methods: function stampMethods() {
623
+ var obj = fixed.methods || {},
624
+ args = [obj].concat([].slice.call(arguments));
625
+ fixed.methods = mixInChain.apply(this, args);
626
+ return this;
627
+ },
628
+ /**
629
+ * Take n objects and add them to the state prototype.
630
+ * @return {Object} stamp The factory in question (`this`).
631
+ */
632
+ state: function stampState() {
633
+ var obj = fixed.state || {},
634
+ args = [obj].concat([].slice.call(arguments));
635
+ fixed.state = mixIn.apply(this, args);
636
+ return this;
637
+ },
638
+ /**
639
+ * Take n functions, an array of functions, or n objects and add
640
+ * the functions to the enclose prototype.
641
+ * @return {Object} stamp The factory in question (`this`).
642
+ */
643
+ enclose: function stampEnclose() {
644
+ fixed.enclose = fixed.enclose
645
+ .concat( extractFunctions.apply(null, arguments) );
646
+ return this;
647
+ }
648
+ });
649
+ };
650
+
651
+ /**
652
+ * Take two or more factories produced from stampit() and
653
+ * combine them to produce a new factory. Combining overrides
654
+ * properties with last-in priority.
655
+ *
656
+ * @param {...Function} factory A factory produced by stampit().
657
+ * @return {Function} A new stampit factory composed from arguments.
658
+ */
659
+ var compose = function compose() {
660
+ var args = [].slice.call(arguments),
661
+ obj = stampit();
662
+
663
+ forEach(args, function (source) {
664
+ if (source) {
665
+ if (source.fixed.methods) {
666
+ obj.fixed.methods = mixInChain({}, obj.fixed.methods,
667
+ source.fixed.methods);
668
+ }
669
+
670
+ if (source.fixed.state) {
671
+ obj.fixed.state = mixIn({}, obj.fixed.state,
672
+ source.fixed.state);
673
+ }
674
+
675
+ if (source.fixed.enclose) {
676
+ obj.fixed.enclose = obj.fixed.enclose
677
+ .concat(source.fixed.enclose);
678
+ }
679
+ }
680
+ });
681
+
682
+ return stampit(obj.fixed.methods, obj.fixed.state,
683
+ obj.fixed.enclose);
684
+ };
685
+
686
+ /**
687
+ * Take an old-fashioned JS constructor and return a stampit stamp
688
+ * that you can freely compose with other stamps.
689
+ * @param {Function} Constructor
690
+ * @return {Function} A composable stampit factory
691
+ * (aka stamp).
692
+ */
693
+ var convertConstructor = function convertConstructor(Constructor) {
694
+ return stampit().methods(Constructor.prototype).enclose(Constructor);
695
+ };
696
+
697
+ module.exports = mixIn(stampit, {
698
+ compose: compose,
699
+ /**
700
+ * Alias for mixIn
701
+ */
702
+ extend: mixIn,
703
+ /**
704
+ * Take a destination object followed by one or more source objects,
705
+ * and copy the source object properties to the destination object,
706
+ * with last in priority overrides.
707
+ * @param {Object} destination An object to copy properties to.
708
+ * @param {...Object} source An object to copy properties from.
709
+ * @returns {Object}
710
+ */
711
+ mixIn: mixIn,
712
+
713
+ convertConstructor: convertConstructor
714
+ });
715
+
716
+ },{"./mixinchain.js":1,"mout/array/forEach":2,"mout/array/map":3,"mout/object/forOwn":15,"mout/object/merge":17,"mout/object/mixIn":18}]},{},[19])
717
+ (19)
718
+ });