first commit

This commit is contained in:
monjack
2025-06-20 18:01:48 +08:00
commit 6daa6d65c1
24611 changed files with 2512443 additions and 0 deletions

10
app_vue/node_modules/utila/.npmignore generated vendored Normal file
View File

@ -0,0 +1,10 @@
*.bat
.htaccess
src
npm-debug.log
!*.gitkeep
node_modules
xeno

20
app_vue/node_modules/utila/LICENSE generated vendored Normal file
View File

@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2014 Aria Minaei
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

7
app_vue/node_modules/utila/README.md generated vendored Normal file
View File

@ -0,0 +1,7 @@
notareplacementforunderscore
# Installation
**npm**: `npm install utila`
**bower**: available via bower as in `bower install utila`, but you should run `npm install` before you can use it.

137
app_vue/node_modules/utila/lib/Emitter.js generated vendored Normal file
View File

@ -0,0 +1,137 @@
// Generated by CoffeeScript 1.6.3
var Emitter, array;
array = require('./array');
module.exports = Emitter = (function() {
function Emitter() {
this._listeners = {};
this._listenersForAnyEvent = [];
this._disabledEmitters = {};
}
Emitter.prototype.on = function(eventName, listener) {
if (this._listeners[eventName] == null) {
this._listeners[eventName] = [];
}
this._listeners[eventName].push(listener);
return this;
};
Emitter.prototype.once = function(eventName, listener) {
var cb, ran,
_this = this;
ran = false;
cb = function() {
if (ran) {
return;
}
ran = true;
listener();
return setTimeout(function() {
return _this.removeEvent(eventName, cb);
}, 0);
};
this.on(eventName, cb);
return this;
};
Emitter.prototype.onAnyEvent = function(listener) {
this._listenersForAnyEvent.push(listener);
return this;
};
Emitter.prototype.removeEvent = function(eventName, listener) {
if (this._listeners[eventName] == null) {
return this;
}
array.pluckOneItem(this._listeners[eventName], listener);
return this;
};
Emitter.prototype.removeListeners = function(eventName) {
if (this._listeners[eventName] == null) {
return this;
}
this._listeners[eventName].length = 0;
return this;
};
Emitter.prototype.removeAllListeners = function() {
var listeners, name, _ref;
_ref = this._listeners;
for (name in _ref) {
listeners = _ref[name];
listeners.length = 0;
}
return this;
};
Emitter.prototype._emit = function(eventName, data) {
var listener, _i, _j, _len, _len1, _ref, _ref1;
_ref = this._listenersForAnyEvent;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
listener = _ref[_i];
listener.call(this, data, eventName);
}
if (this._listeners[eventName] == null) {
return;
}
_ref1 = this._listeners[eventName];
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
listener = _ref1[_j];
listener.call(this, data);
}
};
Emitter.prototype._throttleEmitterMethod = function(fnName, time) {
var lastCallArgs, originalFn, pend, pending, runIt, timer,
_this = this;
if (time == null) {
time = 1000;
}
originalFn = this[fnName];
if (typeof originalFn !== 'function') {
throw Error("this class does not have a method called '" + fnName + "'");
}
lastCallArgs = null;
pending = false;
timer = null;
this[fnName] = function() {
lastCallArgs = arguments;
return pend();
};
pend = function() {
if (pending) {
clearTimeout(timer);
}
timer = setTimeout(runIt, time);
return pending = true;
};
return runIt = function() {
pending = false;
return originalFn.apply(_this, lastCallArgs);
};
};
Emitter.prototype._disableEmitter = function(fnName) {
if (this._disabledEmitters[fnName] != null) {
throw Error("" + fnName + " is already a disabled emitter");
}
this._disabledEmitters[fnName] = this[fnName];
return this[fnName] = function() {};
};
Emitter.prototype._enableEmitter = function(fnName) {
var fn;
fn = this._disabledEmitters[fnName];
if (fn == null) {
throw Error("" + fnName + " is not a disabled emitter");
}
this[fnName] = fn;
return delete this._disabledEmitters[fnName];
};
return Emitter;
})();

111
app_vue/node_modules/utila/lib/_common.js generated vendored Normal file
View File

@ -0,0 +1,111 @@
// Generated by CoffeeScript 1.6.3
var common;
module.exports = common = {
/*
Checks to see if o is an object, and it isn't an instance
of some class.
*/
isBareObject: function(o) {
if ((o != null) && o.constructor === Object) {
return true;
}
return false;
},
/*
Returns type of an object, including:
undefined, null, string, number, array,
arguments, element, textnode, whitespace, and object
*/
typeOf: function(item) {
var _ref;
if (item === null) {
return 'null';
}
if (typeof item !== 'object') {
return typeof item;
}
if (Array.isArray(item)) {
return 'array';
}
if (item.nodeName) {
if (item.nodeType === 1) {
return 'element';
}
if (item.nodeType === 3) {
return (_ref = /\S/.test(item.nodeValue)) != null ? _ref : {
'textnode': 'whitespace'
};
}
} else if (typeof item.length === 'number') {
if (item.callee) {
return 'arguments';
}
}
return typeof item;
},
clone: function(item, includePrototype) {
if (includePrototype == null) {
includePrototype = false;
}
switch (common.typeOf(item)) {
case 'array':
return common._cloneArray(item, includePrototype);
case 'object':
return common._cloneObject(item, includePrototype);
default:
return item;
}
},
/*
Deep clone of an object.
From MooTools
*/
_cloneObject: function(o, includePrototype) {
var clone, key;
if (includePrototype == null) {
includePrototype = false;
}
if (common.isBareObject(o)) {
clone = {};
for (key in o) {
clone[key] = common.clone(o[key], includePrototype);
}
return clone;
} else {
if (!includePrototype) {
return o;
}
if (o instanceof Function) {
return o;
}
clone = Object.create(o.constructor.prototype);
for (key in o) {
if (o.hasOwnProperty(key)) {
clone[key] = common.clone(o[key], includePrototype);
}
}
return clone;
}
},
/*
Deep clone of an array.
From MooTools
*/
_cloneArray: function(a, includePrototype) {
var clone, i;
if (includePrototype == null) {
includePrototype = false;
}
i = a.length;
clone = new Array(i);
while (i--) {
clone[i] = common.clone(a[i], includePrototype);
}
return clone;
}
};

165
app_vue/node_modules/utila/lib/array.js generated vendored Normal file
View File

@ -0,0 +1,165 @@
// Generated by CoffeeScript 1.6.3
var array;
module.exports = array = {
/*
Tries to turn anything into an array.
*/
from: function(r) {
return Array.prototype.slice.call(r);
},
/*
Clone of an array. Properties will be shallow copies.
*/
simpleClone: function(a) {
return a.slice(0);
},
shallowEqual: function(a1, a2) {
var i, val, _i, _len;
if (!(Array.isArray(a1) && Array.isArray(a2) && a1.length === a2.length)) {
return false;
}
for (i = _i = 0, _len = a1.length; _i < _len; i = ++_i) {
val = a1[i];
if (a2[i] !== val) {
return false;
}
}
return true;
},
pluck: function(a, i) {
var index, value, _i, _len;
if (a.length < 1) {
return a;
}
for (index = _i = 0, _len = a.length; _i < _len; index = ++_i) {
value = a[index];
if (index > i) {
a[index - 1] = a[index];
}
}
a.length = a.length - 1;
return a;
},
pluckItem: function(a, item) {
var index, removed, value, _i, _len;
if (a.length < 1) {
return a;
}
removed = 0;
for (index = _i = 0, _len = a.length; _i < _len; index = ++_i) {
value = a[index];
if (value === item) {
removed++;
continue;
}
if (removed !== 0) {
a[index - removed] = a[index];
}
}
if (removed > 0) {
a.length = a.length - removed;
}
return a;
},
pluckOneItem: function(a, item) {
var index, reached, value, _i, _len;
if (a.length < 1) {
return a;
}
reached = false;
for (index = _i = 0, _len = a.length; _i < _len; index = ++_i) {
value = a[index];
if (!reached) {
if (value === item) {
reached = true;
continue;
}
} else {
a[index - 1] = a[index];
}
}
if (reached) {
a.length = a.length - 1;
}
return a;
},
pluckByCallback: function(a, cb) {
var index, removed, value, _i, _len;
if (a.length < 1) {
return a;
}
removed = 0;
for (index = _i = 0, _len = a.length; _i < _len; index = ++_i) {
value = a[index];
if (cb(value, index)) {
removed++;
continue;
}
if (removed !== 0) {
a[index - removed] = a[index];
}
}
if (removed > 0) {
a.length = a.length - removed;
}
return a;
},
pluckMultiple: function(array, indexesToRemove) {
var i, removedSoFar, _i, _len;
if (array.length < 1) {
return array;
}
removedSoFar = 0;
indexesToRemove.sort();
for (_i = 0, _len = indexesToRemove.length; _i < _len; _i++) {
i = indexesToRemove[_i];
this.pluck(array, i - removedSoFar);
removedSoFar++;
}
return array;
},
injectByCallback: function(a, toInject, shouldInject) {
var i, len, val, valA, valB, _i, _len;
valA = null;
valB = null;
len = a.length;
if (len < 1) {
a.push(toInject);
return a;
}
for (i = _i = 0, _len = a.length; _i < _len; i = ++_i) {
val = a[i];
valA = valB;
valB = val;
if (shouldInject(valA, valB, toInject)) {
return a.splice(i, 0, toInject);
}
}
a.push(toInject);
return a;
},
injectInIndex: function(a, index, toInject) {
var i, len, toPut, toPutNext;
len = a.length;
i = index;
if (len < 1) {
a.push(toInject);
return a;
}
toPut = toInject;
toPutNext = null;
for(; i <= len; i++){
toPutNext = a[i];
a[i] = toPut;
toPut = toPutNext;
};
return null;
}
};

86
app_vue/node_modules/utila/lib/classic.js generated vendored Normal file
View File

@ -0,0 +1,86 @@
// Generated by CoffeeScript 1.6.3
var classic,
__slice = [].slice;
module.exports = classic = {};
classic.implement = function() {
var classProto, classReference, desc, member, mixin, mixins, _i, _j, _len;
mixins = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), classReference = arguments[_i++];
for (_j = 0, _len = mixins.length; _j < _len; _j++) {
mixin = mixins[_j];
classProto = classReference.prototype;
for (member in mixin.prototype) {
if (!Object.getOwnPropertyDescriptor(classProto, member)) {
desc = Object.getOwnPropertyDescriptor(mixin.prototype, member);
Object.defineProperty(classProto, member, desc);
}
}
}
return classReference;
};
classic.mix = function() {
var classProto, classReference, desc, member, mixin, mixins, _i, _j, _len;
mixins = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), classReference = arguments[_i++];
classProto = classReference.prototype;
classReference.__mixinCloners = [];
classReference.__applyClonersFor = function(instance, args) {
var cloner, _j, _len, _ref;
if (args == null) {
args = null;
}
_ref = classReference.__mixinCloners;
for (_j = 0, _len = _ref.length; _j < _len; _j++) {
cloner = _ref[_j];
cloner.apply(instance, args);
}
};
classReference.__mixinInitializers = [];
classReference.__initMixinsFor = function(instance, args) {
var initializer, _j, _len, _ref;
if (args == null) {
args = null;
}
_ref = classReference.__mixinInitializers;
for (_j = 0, _len = _ref.length; _j < _len; _j++) {
initializer = _ref[_j];
initializer.apply(instance, args);
}
};
classReference.__mixinQuitters = [];
classReference.__applyQuittersFor = function(instance, args) {
var quitter, _j, _len, _ref;
if (args == null) {
args = null;
}
_ref = classReference.__mixinQuitters;
for (_j = 0, _len = _ref.length; _j < _len; _j++) {
quitter = _ref[_j];
quitter.apply(instance, args);
}
};
for (_j = 0, _len = mixins.length; _j < _len; _j++) {
mixin = mixins[_j];
if (!(mixin.constructor instanceof Function)) {
throw Error("Mixin should be a function");
}
for (member in mixin.prototype) {
if (member.substr(0, 11) === '__initMixin') {
classReference.__mixinInitializers.push(mixin.prototype[member]);
continue;
} else if (member.substr(0, 11) === '__clonerFor') {
classReference.__mixinCloners.push(mixin.prototype[member]);
continue;
} else if (member.substr(0, 12) === '__quitterFor') {
classReference.__mixinQuitters.push(mixin.prototype[member]);
continue;
}
if (!Object.getOwnPropertyDescriptor(classProto, member)) {
desc = Object.getOwnPropertyDescriptor(mixin.prototype, member);
Object.defineProperty(classProto, member, desc);
}
}
}
return classReference;
};

158
app_vue/node_modules/utila/lib/object.js generated vendored Normal file
View File

@ -0,0 +1,158 @@
// Generated by CoffeeScript 1.6.3
var object, _common,
__hasProp = {}.hasOwnProperty;
_common = require('./_common');
module.exports = object = {
isBareObject: _common.isBareObject.bind(_common),
/*
if object is an instance of a class
*/
isInstance: function(what) {
return !this.isBareObject(what);
},
/*
Alias to _common.typeOf
*/
typeOf: _common.typeOf.bind(_common),
/*
Alias to _common.clone
*/
clone: _common.clone.bind(_common),
/*
Empties an object of its properties.
*/
empty: function(o) {
var prop;
for (prop in o) {
if (o.hasOwnProperty(prop)) {
delete o[prop];
}
}
return o;
},
/*
Empties an object. Doesn't check for hasOwnProperty, so it's a tiny
bit faster. Use it for plain objects.
*/
fastEmpty: function(o) {
var property;
for (property in o) {
delete o[property];
}
return o;
},
/*
Overrides values fomr `newValues` on `base`, as long as they
already exist in base.
*/
overrideOnto: function(base, newValues) {
var key, newVal, oldVal;
if (!this.isBareObject(newValues) || !this.isBareObject(base)) {
return base;
}
for (key in base) {
oldVal = base[key];
newVal = newValues[key];
if (newVal === void 0) {
continue;
}
if (typeof newVal !== 'object' || this.isInstance(newVal)) {
base[key] = this.clone(newVal);
} else {
if (typeof oldVal !== 'object' || this.isInstance(oldVal)) {
base[key] = this.clone(newVal);
} else {
this.overrideOnto(oldVal, newVal);
}
}
}
return base;
},
/*
Takes a clone of 'base' and runs #overrideOnto on it
*/
override: function(base, newValues) {
return this.overrideOnto(this.clone(base), newValues);
},
append: function(base, toAppend) {
return this.appendOnto(this.clone(base), toAppend);
},
appendOnto: function(base, toAppend) {
var key, newVal, oldVal;
if (!this.isBareObject(toAppend) || !this.isBareObject(base)) {
return base;
}
for (key in toAppend) {
if (!__hasProp.call(toAppend, key)) continue;
newVal = toAppend[key];
if (newVal === void 0) {
continue;
}
if (typeof newVal !== 'object' || this.isInstance(newVal)) {
base[key] = newVal;
} else {
oldVal = base[key];
if (typeof oldVal !== 'object' || this.isInstance(oldVal)) {
base[key] = this.clone(newVal);
} else {
this.appendOnto(oldVal, newVal);
}
}
}
return base;
},
groupProps: function(obj, groups) {
var def, defs, grouped, key, name, shouldAdd, val, _i, _len;
grouped = {};
for (name in groups) {
defs = groups[name];
grouped[name] = {};
}
grouped['rest'] = {};
top: //;
for (key in obj) {
val = obj[key];
shouldAdd = false;
for (name in groups) {
defs = groups[name];
if (!Array.isArray(defs)) {
defs = [defs];
}
for (_i = 0, _len = defs.length; _i < _len; _i++) {
def = defs[_i];
if (typeof def === 'string') {
if (key === def) {
shouldAdd = true;
}
} else if (def instanceof RegExp) {
if (def.test(key)) {
shouldAdd = true;
}
} else if (def instanceof Function) {
if (def(key)) {
shouldAdd = true;
}
} else {
throw Error('Group definitions must either\
be strings, regexes, or functions.');
}
if (shouldAdd) {
grouped[name][key] = val;
continue top;
}
}
}
grouped['rest'][key] = val;
}
return grouped;
}
};

14
app_vue/node_modules/utila/lib/string.js generated vendored Normal file
View File

@ -0,0 +1,14 @@
// Generated by CoffeeScript 1.6.3
module.exports = {
pad: function(n, width, z) {
if (z == null) {
z = '0';
}
n = n + '';
if (n.length >= width) {
return n;
} else {
return new Array(width - n.length + 1).join(z) + n;
}
}
};

10
app_vue/node_modules/utila/lib/utila.js generated vendored Normal file
View File

@ -0,0 +1,10 @@
// Generated by CoffeeScript 1.6.3
var utila;
module.exports = utila = {
array: require('./array'),
classic: require('./classic'),
object: require('./object'),
string: require('./string'),
Emitter: require('./Emitter')
};

25
app_vue/node_modules/utila/package.json generated vendored Normal file
View File

@ -0,0 +1,25 @@
{
"name": "utila",
"version": "0.4.0",
"description": "notareplacementforunderscore",
"main": "lib/utila.js",
"devDependencies": {
"coffee-script": "~1.6.3",
"little-popo": "~0.1"
},
"scripts": {
"prepublish": "coffee --bare --compile --output ./lib ./src"
},
"repository": {
"type": "git",
"url": "https://github.com/AriaMinaei/utila.git"
},
"keywords": [
"utilities"
],
"author": "Aria Minaei",
"license": "MIT",
"bugs": {
"url": "https://github.com/AriaMinaei/utila/issues"
}
}

5
app_vue/node_modules/utila/test/_prepare.coffee generated vendored Normal file
View File

@ -0,0 +1,5 @@
path = require 'path'
pathToLib = path.resolve __dirname, '../lib'
require('little-popo')(pathToLib)

143
app_vue/node_modules/utila/test/array.coffee generated vendored Normal file
View File

@ -0,0 +1,143 @@
require './_prepare'
array = mod 'array'
test 'from', ->
array.from([1]).should.be.an.instanceOf Array
array.from([1])[0].should.equal 1
# test 'clone', ->
# a = [0, 1, 2]
# b = array.clone a
# b[0].should.equal 0
# b[1].should.equal 1
# b[0] = 3
# a[0].should.equal 0
test 'pluck', ->
a = [0, 1, 2, 3]
after = array.pluck a, 1
after.length.should.equal 3
after[0].should.equal 0
after[1].should.equal 2
after[2].should.equal 3
after.should.equal a
test 'pluckMultiple', ->
a = [0, 1, 2, 3, 4, 5, 6]
array.pluckMultiple a, [0, 4, 2, 6]
a.length.should.equal 3
a[0].should.equal 1
a[1].should.equal 3
a[2].should.equal 5
test 'pluckItem', ->
a = [0, 1, 2, 3, 2, 4, 2]
array.pluckItem a, 2
a[0].should.equal 0
a[1].should.equal 1
a[2].should.equal 3
a[3].should.equal 4
array.pluckItem([1], 2).length.should.equal 1
test 'pluckOneItem', ->
a = [0, 1, 2, 3, 2, 4, 2]
array.pluckOneItem a, 2
a[0].should.equal 0
a[1].should.equal 1
a[2].should.equal 3
a[3].should.equal 2
a[4].should.equal 4
a[5].should.equal 2
a = [1, 2]
array.pluckOneItem a, 1
a.length.should.equal 1
a[0].should.equal 2
array.pluckOneItem([], 1).length.should.equal 0
array.pluckOneItem([1], 2).length.should.equal 1
test 'plcukByCallback', ->
a = [0, 1, 2, 3]
array.pluckByCallback a, (val, i) ->
return yes if val is 2
return no
a[0].should.equal 0
a[1].should.equal 1
a[2].should.equal 3
test 'injectByCallback', ->
shouldInject = (valA, valB, toInject) ->
unless valA?
return yes if toInject <= valB
return no
unless valB?
return yes if valA <= toInject
return no
return yes if valA <= toInject <= valB
return no
a = [0.5, 1, 2.5, 2.5, 2.75, 2.75, 3]
array.injectByCallback a, 0, shouldInject
a[0].should.equal 0
a[1].should.equal 0.5
a[7].should.equal 3
a = [0.5, 1, 2.5, 2.5, 2.75, 2.75, 3]
array.injectByCallback a, 2.7, shouldInject
a[0].should.equal 0.5
a[4].should.equal 2.7
a[5].should.equal 2.75
a[7].should.equal 3
a = [0.5, 1, 2.5, 2.5, 2.75, 2.75, 3]
array.injectByCallback a, 3.2, shouldInject
a[0].should.equal 0.5
a[4].should.equal 2.75
a[6].should.equal 3
a[7].should.equal 3.2

233
app_vue/node_modules/utila/test/object.coffee generated vendored Normal file
View File

@ -0,0 +1,233 @@
require './_prepare'
object = mod 'object'
test 'isBareObject', ->
object.isBareObject('a').should.equal false
object.isBareObject({'a': 'a'}).should.equal true
test 'typeOf', ->
object.typeOf('s').should.equal 'string'
object.typeOf(0).should.equal 'number'
object.typeOf(false).should.equal 'boolean'
object.typeOf({}).should.equal 'object'
object.typeOf(arguments).should.equal 'arguments'
object.typeOf([]).should.equal 'array'
test 'empty', ->
o =
a: 1
b: 2
object.empty o
o.should.not.have.property 'a'
o.should.not.have.property 'b'
test 'fastEmpty', ->
o =
a: 1
b: 2
object.fastEmpty o
o.should.not.have.property 'a'
o.should.not.have.property 'b'
test 'clone', ->
object.clone([1])[0].should.equal 1
object.clone({a:1}).a.should.equal 1
o = {a: 1}
object.clone(o).should.not.equal o
test 'clone [include prototype]', ->
class C
constructor: (@a) ->
sayA: -> @a + 'a'
a = new C 'a'
a.sayA().should.equal 'aa'
b = object.clone a, yes
b.should.not.equal a
b.constructor.should.equal C
b.a.should.equal 'a'
b.a = 'a2'
b.sayA().should.equal 'a2a'
test 'clone [without prototype]', ->
class C
constructor: (@a) ->
sayA: -> @a + 'a'
a = new C 'a'
a.sayA().should.equal 'aa'
b = object.clone a, no
b.should.equal a
test 'overrideOnto [basic]', ->
onto =
a: 'a'
b:
c: 'c'
d:
e: 'e'
what =
a: 'a2'
b:
c: 'c2'
d:
f: 'f2'
object.overrideOnto onto, what
onto.a.should.equal 'a2'
onto.b.should.have.property 'c'
onto.b.c.should.equal 'c2'
onto.b.d.should.not.have.property 'f'
onto.b.d.e.should.equal 'e'
test 'override', ->
onto =
a: 'a'
b:
c: 'c'
d:
e: 'e'
what =
a: 'a2'
b:
c: 'c2'
d:
f: 'f2'
onto2 = object.override onto, what
onto2.a.should.equal 'a2'
onto2.b.should.have.property 'c'
onto2.b.c.should.equal 'c2'
onto2.b.d.should.not.have.property 'f'
onto2.b.d.e.should.equal 'e'
onto.should.not.equal onto2
do ->
what =
a: 'a2'
c: ->
z: 'z'
y:
a: 'a'
onto =
a: 'a'
b: 'b'
test 'appendOnto [basic]', ->
object.appendOnto onto, what
onto.a.should.equal 'a2'
onto.b.should.equal 'b'
onto.z.should.equal 'z'
test "appendOnto [shallow copies instances]", ->
onto.c.should.be.instanceof Function
onto.c.should.equal what.c
test "appendOnto [clones objects]", ->
onto.should.have.property 'y'
onto.y.a.should.equal 'a'
onto.y.should.not.equal what.y
test 'groupProps', ->
obj =
a1: '1'
a2: '2'
b1: '1'
b2: '2'
c1: '1'
c2: '2'
rest1: '1'
rest2: '2'
groups = object.groupProps obj,
a: ['a1', 'a2']
b: [/^b[0-9]+$/]
c: (key) -> key[0] is 'c'
groups.a.should.have.property 'a1'
groups.a.a1.should.equal '1'
groups.a.should.have.property 'a2'
groups.b.should.have.property 'b1'
groups.b.should.have.property 'b2'
groups.c.should.have.property 'c1'
groups.c.should.have.property 'c2'
groups.rest.should.have.property 'rest1'
groups.rest.should.have.property 'rest1'
groups.rest.should.not.have.property 'c1'