This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
3.0 KiB
79 lines
3.0 KiB
'use strict'; |
|
var global = require('./$.global') |
|
, $export = require('./$.export') |
|
, redefine = require('./$.redefine') |
|
, redefineAll = require('./$.redefine-all') |
|
, forOf = require('./$.for-of') |
|
, strictNew = require('./$.strict-new') |
|
, isObject = require('./$.is-object') |
|
, fails = require('./$.fails') |
|
, $iterDetect = require('./$.iter-detect') |
|
, setToStringTag = require('./$.set-to-string-tag'); |
|
|
|
module.exports = function(NAME, wrapper, methods, common, IS_MAP, IS_WEAK){ |
|
var Base = global[NAME] |
|
, C = Base |
|
, ADDER = IS_MAP ? 'set' : 'add' |
|
, proto = C && C.prototype |
|
, O = {}; |
|
var fixMethod = function(KEY){ |
|
var fn = proto[KEY]; |
|
redefine(proto, KEY, |
|
KEY == 'delete' ? function(a){ |
|
return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); |
|
} : KEY == 'has' ? function has(a){ |
|
return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); |
|
} : KEY == 'get' ? function get(a){ |
|
return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a); |
|
} : KEY == 'add' ? function add(a){ fn.call(this, a === 0 ? 0 : a); return this; } |
|
: function set(a, b){ fn.call(this, a === 0 ? 0 : a, b); return this; } |
|
); |
|
}; |
|
if(typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function(){ |
|
new C().entries().next(); |
|
}))){ |
|
// create collection constructor |
|
C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); |
|
redefineAll(C.prototype, methods); |
|
} else { |
|
var instance = new C |
|
// early implementations not supports chaining |
|
, HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance |
|
// V8 ~ Chromium 40- weak-collections throws on primitives, but should return false |
|
, THROWS_ON_PRIMITIVES = fails(function(){ instance.has(1); }) |
|
// most early implementations doesn't supports iterables, most modern - not close it correctly |
|
, ACCEPT_ITERABLES = $iterDetect(function(iter){ new C(iter); }) // eslint-disable-line no-new |
|
// for early implementations -0 and +0 not the same |
|
, BUGGY_ZERO; |
|
if(!ACCEPT_ITERABLES){ |
|
C = wrapper(function(target, iterable){ |
|
strictNew(target, C, NAME); |
|
var that = new Base; |
|
if(iterable != undefined)forOf(iterable, IS_MAP, that[ADDER], that); |
|
return that; |
|
}); |
|
C.prototype = proto; |
|
proto.constructor = C; |
|
} |
|
IS_WEAK || instance.forEach(function(val, key){ |
|
BUGGY_ZERO = 1 / key === -Infinity; |
|
}); |
|
if(THROWS_ON_PRIMITIVES || BUGGY_ZERO){ |
|
fixMethod('delete'); |
|
fixMethod('has'); |
|
IS_MAP && fixMethod('get'); |
|
} |
|
if(BUGGY_ZERO || HASNT_CHAINING)fixMethod(ADDER); |
|
// weak collections should not contains .clear method |
|
if(IS_WEAK && proto.clear)delete proto.clear; |
|
} |
|
|
|
setToStringTag(C, NAME); |
|
|
|
O[NAME] = C; |
|
$export($export.G + $export.W + $export.F * (C != Base), O); |
|
|
|
if(!IS_WEAK)common.setStrong(C, NAME, IS_MAP); |
|
|
|
return C; |
|
}; |